北は大雨で南は酷暑でどうなってんだろうね、という感ですが、いかがお過ごしでしょうか。

気付いたら二ヶ月くらいなんも書いてませんでした。とはいえ今色々やってはいるものの形になるまで時間がかかるねぇ、というところなので、一旦草埋めとして簡単に投下しておきます。

Emacsでのlspクライアント

Emacsでは、よく使われるLSPクライアントとして、 lsp-modeEglotがあります。大体の差分は色々な人が書いてますが、

  • lsp-mode
    • 機能が多い。基本的には様々なサーバーをOut of the boxで利用できるようになっている
    • 複数のサーバー同時に実行できる
      • これはEglotではそもそもできないらしい
    • lsp-uiなど、独自の機能が多く、UI要素が大きく変更される
  • Eglot
    • Emacsの標準機能との親和性を第一に設計されている
      • flycheckではなくflymake、company-modeではなくcompletion-at-pointを利用する、など
    • そのため、corfuやverticoなど、標準のインターフェースと拡張ポイントを利用するライブラリ(最近のライブラリのトレンドに感じる)との相性がよい
    • 余計な装飾などがほぼ存在しないため、一般的なユースケースでは非常に軽い

というのがあります。中でも最大の差分としては、 EglotはEmacsの標準に取り込まれた というところでしょうか。私は会社のPCでも個人でも大体master付近を使っているので、特に問題はないですね。

これもあって、GitHubにあるEglotのリポジトリはdiscussion用途として残されている、ということになってます。

lsp-modeから切り替えてみてどうか?

元々、編集するたびにformatする、という行為そのものが結構邪魔になるな、と思っていたので、そういった機能がすっぱり存在しないというのは個人的に軽くてよいです。フォーマットが必要ならpre-commit hookでやればよき。

ドキュメントや型の表示などについては、基本的にlsp-uiの方がビジュアル的に一日の長があるかとは思いますが、それもeldoc自体を拡張することで、child frameなどで表示することは可能です。 treemacsとかを利用してシンボル表示とかについても、imenu-listとか使えば可能です。

そう考えると、lspクライアントとして大事なのは安定性と高速な動作…になってくるのかなと。Eglotは非常に軽快な動作を提供してくれるので、利用している間のストレスはかなり少ないです。flymakeの頻度とか反映速度とかはそれなりに気にはなりますが、まぁそれはそれで調整したらいいだけですし。

eglotの設定

(leaf eglot
  :ensure t
  :hook
  ;; eglotに接続した時点でhover modeを有効にする
  (eglot-connect-hook . eldoc-box-hover-mode)
  :bind
  (:eglot-mode-map
   ("C-c r" . eglot-rename)
   ;; intellijの方と挙動を揃える
   ("C-<return>" . eglot-code-actions)
   ("M-m" . eldoc-box-help-at-point)))

お仕事ではIntelliJを使っているので、code actionsについてはそっちと揃えたりしていますが、基本的にはデフォルトのままで一旦使ってます。

本当に困らないの?

実はいくつか困ったりしてます。最近ヘビーに使ってみた感じだと、以下のような課題があります。

  • goplsで動くときと動かないときが激しい
    • どうもgo.modが複数あるprojectを使うときとかに顕著。設定を追加しているはずなんだけども
  • まれによくdiagnosticsが無反応になる
    • こうなるとreconnectしないと直らない場合がほとんど
    • 開いているファイルが100を超えると発生しやすい印象。100も開くなと。確かに
  • eslintとtypescript、みたいなことができない
    • もしかしたらできるんかもしれませんが、バッファにつきクライアントは一個しか動かせない、というのも見た気がします
    • 現状まぁ困ってませんが
  • Code Actionsが稀によく動かない
    • renameも動作しないケースがしばしばあります
    • 現状OCamlが大半なので、まぁmeowの置換で困ったりしてないというのもありますけど

現状はまぁそこまで致命的なものはないかな、とは思いつつ、ちょいちょいうーむ、という部分はあったりします。とはいえそれはlsp-modeもそうなので…。 Eglotの場合、そもそもEmacs標準の機能とintegrationされているので、LSPクライアントを変更するというよりは、それぞれのパッケージで改変していけばいいんでない?というのもありますね。

実際困らないかは、本人の使い方にもよってくると思うので、ちょろっと試してみてはいかがでしょうか。最近はlsp-bridgeというのもあるようです(lsp-bridgeは真逆で、色々自前で作りこんでます)し、この暑さに対する気分転換になるとも思います。