Emacs の language server protocol に関して

ちょっと前にこんな記事を書きました。
Emacs で ccls 導入して競プロ
あれから、lsp-mode を使ってコードを書いていたんですが、
補完が効いたり効かなかったり、エラーが出たり出なかったり、
あまり使い勝手がよくありませんでした。。。

そこで、
lsp クライアントを lsp から Eglot に乗り換えることにしました
そしたらめちゃめちゃ快適にコーディングできるようになったよというお話です。

現環境

lspクライアント

設定済み言語

C/C++

  • サーバ : clangd (llvm インストール時に自動で入る)
  • 補完、エラーの表示をさせている

f:id:granddaifuku:20201026171338p:plain


プロジェクトのルートディレクトリに compile_flags.txt を置いて、コンパイルオプションを指定しています。

-Wall
-Wextra
-pedantic
-std=c++14
-O2
-Wshadow
-Wformat=2
-Wfloat-equal
-Wconversion
-Wlogical-op
-Wshift-overflow=2
-Wduplicated-cond
-Wcast-qual
-Wcast-align
-D_GLIBCXX_DEBUG
-D_GLIBCXX_DEBUG_PEDANTIC
-D_FORTIFY_SOURCE=2
-fsanitize=address
-fsanitize=undefined
-fno-sanitize-recover
-fstack-protector
-I/usr/local/include    // インクルードパスの指定

Python

  • サーバ : python-language-server (jedi ベース)
  • 補完、エラー表示、フォーマットをさせている

f:id:granddaifuku:20201026171515p:plain

Rust

  • サーバ : rust-analyzer (homebrew 経由でインストール)
  • Rustic を導入して、Rustic mode でプログラムを書いています。
  • 補完、エラー表示、フォーマットをさせている

f:id:granddaifuku:20201026171601p:plain

設定

;;;;; eglot ;;;;;

(use-package eglot
  :ensure t
  :config
  (add-to-list 'eglot-server-programs '(c++-mode . ("clangd")))
  (add-to-list 'eglot-server-programs '(rustic-mode . ("rust-analyzer")))
  (add-to-list 'eglot-server-programs '(python-mode . ("pyls")))
  (add-hook 'c++-mode-hook 'eglot-ensure)
  (add-hook 'rustic-mode-hook 'eglot-ensure)
  (add-hook 'python-mode-hook 'eglot-ensure)
  (define-key eglot-mode-map (kbd "C-c e f") 'eglot-format)
  (define-key eglot-mode-map (kbd "C-c e n") 'eglot-rename)
  )

flycheck は無効化して、全てエラー表示などは flymake で行っています。
flymake-diagnostic-at-point がめちゃめちゃ便利。

自分の .emacs.d ファイル


終わり