• 作成:

Emacsのlsp-modeのlsp-eslintはまだ使うべきではなかった

lsp-eslintは時期尚早

Emacsのlsp-modeではTypeScriptのエラーチェックや補完やジャンプを JavaScript/TypeScript (theia-ide) - LSP Mode - LSP support for Emacs によって受けることが出来ます。手動のインストールすら必要なく、 .emacs.d/.cache/以下に初手でインストールされます。

しかし、これを有効にするとflycheckのソースがeslintからlspに切り替わってしまうため、 ESLintのリアルタイム報告を受けることが出来なくなります。

そこで Eslint - LSP Mode - LSP support for Emacs があり、先程のlang serverと同時に動かすことでESLintの報告も受けることが出来ます。

(setq-local lsp-enabled-clients '(ts-ls eslint))
(lsp)

のように設定すると起動します。

しますが…

lsp-eslintの言語サーバは microsoft/vscode-eslint: VSCode extension to integrate eslint into VSCode です。これはvscode-eslintと言う名前からして分かる通りVSCodeからの利用しか想定していません。

現状npmでインストールすることも出来ません。 Feature Request: Can we make the server npm-installable? · Issue #1003 · microsoft/vscode-eslint

よって適当な箇所にgit cloneして、

(lsp-eslint-server-command . '("node" "/home/ncaq/Desktop/vscode-eslint/server/out/eslintServer.js" "--stdio"))

とか設定してやる必要があるわけです。

しかし、現在このlang serverとの接続は大変不安定な状態にあるようです。

最新版同士では動作しません。

lsp-mode does not work with latest un-merged but published version of eslint language server · Issue #1932 · emacs-lsp/lsp-mode

version 2.1.5に戻してみたら一応動作しますが、エラーの表示が微妙に不安定で表示されなかったりします。また大変動作が遅いです。

よってこれはまだEmacsからは使用段階に無いと判断しました。

ではどうするか

結局従来の方法に戻ってきました。

lspを有効化しつつflycheckに表示するのはESLintにします。

(defun flycheck-select-tslint-or-eslint ()
  "tslintが使えるプロジェクトだとtslintを有効化して, それ以外ではeslintを有効化する."
  (if (and
       ;; 大前提としてtslint.jsonがないとだめ
       (locate-dominating-file default-directory "tslint.json")
       (or
        ;; メジャーモードがTypeScriptなら良い
        (equal major-mode 'typescript-mode)
        ;; それ以外のメジャーモード(web-modeとか)でも拡張子がts, tsxなら良い
        (member (file-name-extension (buffer-file-name)) '("ts" "tsx"))))
      (flycheck-select-checker 'typescript-tslint)
    (when (executable-find flycheck-javascript-eslint-executable)
      (flycheck-select-checker 'javascript-eslint))))
(defun web-mode-setup ()
  (pcase web-mode-content-type
    ("html"
     (progn
       (prettier-js-enable-toggle)
       (when (executable-find "tidy") (flycheck-select-checker 'html-tidy))))
    ((or "javascript" "jsx" "typescript")
     (progn
       (lsp)
       (prettier-js-enable-toggle)
       (flycheck-select-tslint-or-eslint)))
    ((or "json" "css")
     (progn
       (lsp)
       (prettier-js-enable-toggle)))))

lang serverがあればauto fixは要らないと思っていましたがこの状況だと書いた方が良いかもしれませんね。しかし高性能なlang serverがあれば確実に要らなくなるものを書くのもちょっと気が引けます。悩ましい所です。