前回、LSP(Language Server Protocol)とは何かを整理した。

今回は、EmacsがそのLSPをどう扱うかを掘り下げる。
EmacsはLSPを直接理解しているわけではなく、クライアントとしてLSPサーバと通信する層を持っている。
その中核となるのが lsp-mode と eglot という二つの実装である。
両者は同じLSPをしゃべるが、思想と構造が根本的に異なる。
この違いを理解することが、自分に合った環境を選ぶ鍵になる。
EmacsにおけるLSPクライアントの役割
LSPクライアントとは、要するに「エディタの代わりにサーバと話す通訳」である。
Emacsが自分で補完や解析を行うわけではない。
代わりに、クライアントがJSON-RPCでLSPサーバに要求を送り、結果を受け取る。
たとえば、ユーザーが関数名の途中まで入力したとき、Emacsはこう動く。
companyなどの補完UIが「候補を出せ」と要求lsp-mode(またはeglot)がサーバにtextDocument/completionを送信- サーバが解析結果(候補リスト)を返す
- クライアントが結果をUI層へ渡す
この通信を隠蔽し、自然な操作感を実現するのがクライアントの仕事である。
つまりLSPクライアントは「通信」と「Emacs統合」の境界に立つ存在である。
lsp-mode ― 機能主義と総合化の道
lsp-mode はEmacsにおける最古参かつ最強のLSPクライアントである。
設計思想は明確だ。
「Emacsを現代的IDEの水準に引き上げる」
lsp-mode はLSP仕様のほぼ全てのメソッドを実装している。
補完だけでなく、定義ジャンプ、リネーム、コードアクション、ドキュメント表示、フォーマットなどを統合的に扱う。
さらに、lsp-ui, lsp-treemacs, lsp-ivy などの拡張で、VSCode的な体験を再現できる。
一方で、設定項目が膨大で、依存パッケージも多い。
IDE的快適さを求める代わりに、軽量さと単純さを犠牲にしている。
構造的には、LSPの上にUIや便利関数を積み上げる形だ。
「フル装備の戦車」とでも言うべきクライアントである。
eglot ― 簡潔主義とEmacs的統合の道
対する eglot は正反対の思想を持つ。
「Emacsはすでに優れている。LSPはそれを邪魔せず溶け込むべきだ」
eglot は2018年に登場し、Emacs 29で公式に同梱された。
基本コマンドは M-x eglot ひとつ。
特別な設定をほとんど要せず、仮想環境やプロジェクトを自動認識してLSPサーバを起動する。
UI拡張はほぼ持たず、既存の xref(定義ジャンプ)、eldoc(関数ドキュメント)、flymake(警告表示)と自然に統合する。
このシンプルさが「Emacsらしさ」を保つ理由である。
結果、eglot は軽量で安定しており、コードの可読性も高い。
だが、VSCode的な華やかなUIや細かなチューニングはない。
「Emacsそのものを信頼している」派のための実装である。
両者の比較と選択の軸
| 項目 | lsp-mode | eglot |
|---|---|---|
| 目的 | IDE的統合 | Emacs標準との自然な融合 |
| 開発母体 | 独立コミュニティ | GNU Emacs本体 |
| 拡張性 | 高い(UI拡張多数) | 控えめ |
| 設定難度 | 高い | 低い |
| 動作の軽さ | 中〜重 | 軽 |
| 更新頻度 | 非常に高い | 安定重視 |
両者の差は、便利さを取るか、純粋さを取るかに尽きる。
自分のEmacsを“戦車”にしたいなら lsp-mode、
“機敏な道具”として維持したいなら eglot を選ぶとよい。
クライアントとUIの分離 ― Emacs哲学の体現
Emacsでは、LSPクライアントとUIは厳密に分離されている。
理由は単純で、自由度と再利用性を保つためである。
company-mode, corfu, icomplete など、補完UIの選択肢は無数にある。
LSPクライアントが特定のUIに依存すると、ユーザーの自由を奪う。
そのためクライアントは「候補を返す」までで止まり、
表示は既存の補完システムに任せるよう設計されている。
この設計は、Emacsの原則――「すべては組み合わせ可能(composable)」――の延長線上にある。
まとめ
EmacsがLSPを扱う際、中心となるのは lsp-mode と eglot という二つのクライアントである。
どちらを選ぶかは「何を求めるか」によって決まる。
- IDE的な利便性を求めるなら
lsp-mode - Emacsの一体感を重視するなら
eglot
重要なのは、どちらを選んでもLSPという共通言語を通じて同じサーバを使えるという事実だ。
道具は違えど、話している言葉は同じ。
次回は、そのサーバ側――すなわち PythonのLSPサーバ実装(pylspとpyright) の実践編に進む。
次の第3回では、実際にEmacsでPython補完を動かし、lsp-mode または eglot と組み合わせて設定する過程を解説する。