Ink

Contents related to tech, hobby, etc

lsp-modeからEglotへ乗り換える

|

lsp-modeからEglotへ乗り換える

Emacs29.1から、LSPクライアントとしてEglotが標準搭載されるようになりま した。今迄はlsp-modeを使っていたのですが、そもそもあまりきちんと使えて いなかったのでこの機に一旦eglotに移ってみようと思います。

前提

  • 筆者自身、普段そこまでLSPサーバーの機能を使用せずにコーディングしています

  • 複雑な設定等の移行の参考にはならない可能性があります

現在のlsp-modeの設定

私はパッケージマネージャーとしてconao3/leaf.elを使用しているので、その設定を載せます。

(leaf lsp-mode
  :commands lsp
  :ensure t
  :hook
  (sh-mode-hook . lsp)
  (haskell-mode-hook . lsp)
  (kotlin-mode-hook . lsp)
  (c++-mode . lsp)
  :custom
  (lsp-keymap-prefix .  "M-l")
  :bind
  ("M-l". nil)
  )

割とシンプル。いくつかのmodeでlspコマンドを実行するのと、lspで用いる prefix keyを"M-l"にしているだけです。これをEglot用に写していきます。

lsp-modeの無効化

lsp-modeを完全に消してしまってもいいのですが、一旦eglotの使い勝手を見 るという意味でlsp-modeも無効にしつつ置いておくことにします。

(remove-hook 'sh-mode-hook 'lsp)
(remove-hook 'sh-mode-hook lsp)
(remove-hook 'haskell-mode-hook lsp)
(remove-hook 'kotlin-mode-hook lsp)
(remove-hook 'c++-mode lsp)

Eglotの設定

まずはhookを設定して...後は特にすることなし!!!...え???

EglotはLSPクライアントとしての機能を提供するために、独自のコマンドでは なく「Emacsで良く使われている他のパッケージ」を用いるので、lsp-modeと 同じキー配置にしたいのでなければキーマップの設定もほぼ要らないと思いま す。

(leaf eglot
  :hook
  (sh-mode-hook . eglot)
  (haskell-mode-hook . eglot)
  (kotlin-mode-hook . eglot)
  (c++-mode . eglot)
  )

lsp-modeのコマンドとの対応

正直に言うと私自身あまりきちんとlsp-modeを使っていないのですが、代替コ マンド(と思われる)の一覧を残しておきます。

尚この表はlsp-modeのkeybindingsドキュメントで扱われているもののうち、 外部パッケージとの連携を必要としないもののみに絞っています。

Descriptionlsp-modeコマンドeglotコマンド
Start serverlspeglot
Restart serverlsp-workspace-restarteglot-reconnect
Shutdown serverlsp-workspace-shutdowneglot-shutdown
Describes current sessionlsp-describe-session
Disconnect the buffer from the language server keeping the server running.lsp-disconnect-
format this document.lsp-format-buffereglot-format-buffer, eglot-format with no region
format the region, or if none is selected, the current line.lsp-format-regioneglot-format
Add new project root to the list of workspace folders.lsp-workspace-folders-add-
Remove project root from the list of workspace folders.lsp-workspace-folders-remove-
Remove project root from the workspace blacklist.lsp-workspace-blacklist-remove-
Toggle code-lens overlays.lsp-lens-mode-
Toggle client-server protocol logging.lsp-toggle-trace-io-
Toggle symbol highlighting.lsp-toggle-symbol-highlight-
Toggle minor mode for showing information for current line in sideline. (requires lsp-ui)lsp-ui-sideline-mode-
Toggle minor mode for showing hover information in child frame. (requires lsp-ui)lsp-ui-doc-mode-
Toggle signature auto activate.nil-
Toggle on type formatting.nil-
Find definitions of the symbol under point.lsp-find-definitionxref-find-definitions
Find references of the symbol under point.lsp-find-referencesxref-find-references
Find implementations of the symbol under point.lsp-find-implementationxref-find-references, eglot-find-implementation
Find type definitions of the symbol under point.lsp-find-type-definitionxref-find-references, eglot-find-typeDefinition
Find declarations of the symbol under point.lsp-find-declarationxref-find-references, eglot-find-declaration
Find all meaningful symbols that match pattern.xref-find-apropos-
Display the type signature and documentation of the thing at point.lsp-describe-thing-at-point-
Activate signature help.lsp-signature-
Trigger display hover information popup and hide it on next typing.lsp-ui-doc-glance-
Rename the symbol (and all references to it).lsp-renameeglot-rename
Perform the source.organizeImports code action, if available.lsp-organize-importseglot-code-action-organize-imports
Execute code action.lsp-execute-code-actioneglot-code-actions
Highlight symbol at point.lsp-document-highlight-
Peek definitions to the identifier at point. (requires lsp-ui)lsp-ui-peek-find-definitions-
Peek references to the identifier at point. (requires lsp-ui)lsp-ui-peek-find-references-
Peek implementation locations of the symbol at point. (requires lsp-ui)lsp-ui-peek-find-implementation-
Peek symbols in the workspace. (requires lsp-ui)lsp-ui-peek-find-workspace-symbol-