Emacs の language server protocol に関して
ちょっと前にこんな記事を書きました。
Emacs で ccls 導入して競プロ
あれから、lsp-mode を使ってコードを書いていたんですが、
補完が効いたり効かなかったり、エラーが出たり出なかったり、
あまり使い勝手がよくありませんでした。。。
そこで、
lsp クライアントを lsp から Eglot に乗り換えることにしました
そしたらめちゃめちゃ快適にコーディングできるようになったよというお話です。
現環境
lspクライアント
設定済み言語
C/C++
- サーバ : clangd (llvm インストール時に自動で入る)
- 補完、エラーの表示をさせている
プロジェクトのルートディレクトリに 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 ベース)
- 補完、エラー表示、フォーマットをさせている
Rust
- サーバ : rust-analyzer (homebrew 経由でインストール)
- Rustic を導入して、Rustic mode でプログラムを書いています。
- 補完、エラー表示、フォーマットをさせている
設定
;;;;; 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 ファイル
終わり