概要
emacs + lsp-mode でうまく lsp サーバが起動できない場合の対処方法を紹介します
環境
- macOS 11.7.10
- emacs 29.1
- lsp-mode 20231223.811
状況
emacs で ruby ファイルを起動した際に lsp サーバが見つからずに以下のようなエラーになる場合があります
Command "steep langserver --log-level warn" is not present on the path.
Command "stree lsp" is not present on the path.
Command "ruby-lsp" is not present on the path.
Command "srb typecheck --lsp --disable-watchman" is not present on the path.
Command "bundle exec solargraph stdio" is present on the path.
Command "semgrep lsp" is not present on the path.
Command "rubocop --lsp" is not present on the path.
Command "steep langserver --log-level warn" is not present on the path.
Command "stree lsp" is not present on the path.
Command "ruby-lsp" is not present on the path.
Command "srb typecheck --lsp --disable-watchman" is not present on the path.
Command "bundle exec solargraph stdio" is present on the path.
Command "semgrep lsp" is not present on the path.
Command "rubocop --lsp" is not present on the path.
Found the following clients for /Users/hawk/data/repo/ruby-fndb/rank/app.rb: (server-id ruby-ls, priority -1)
The following clients were selected based on priority: (server-id ruby-ls, priority -1)
よくある対処方法としては emacs を起動しているシェルで PATH に solargraph や rubocop などがない場合に emacs から lsp が起動できないケースがありますが今回はしっかり PATH に通っている状態です
ログをよく見るとコマンドのチェックが二回行われています
原因
emacs に追加した lsp セッションパス内に複数の Gemfile があるとその配下全てでコマンドのチェックを行うため親ディレクトリなどに Gemfile があると 2 つの solargraph コマンドが見つかりどちらを起動したらいいのかわからないため該当のエラーになります
対応方法
一旦セッションファイルを作成して再度正しいプロジェクトのパスでセッションを登録しましょう
これで追加する際に親プロジェクトからではなく子プロジェクトを直接登録しましょう
以下の場合はドットを入力します
- rm ~/.emacs.d/.lsp-session-v1
- emacs app.rb
app.rb is not part of any project.
i ==> Import project root ~/data/repo/ruby-fndb/
I ==> Import project by selecting root directory interactively
. ==> Import project at current directory /Users/hawk/data/repo/ruby-fndb/rank/
d ==> Do not ask again for the current project by adding ~/data/repo/ruby-fndb/ to lsp-session-folders-blocklist
D ==> Do not ask again for the current project by selecting ignore path interactively
n ==> Do nothing: ask again when opening other files from the current project
Select action: .
これで再度 lsp が起動されエラーにならないことを確認します
最後に
emacs + lsp で起動しない場合は大抵の場合コマンドがインストールされていなかったり参照できなかったりが多いです
今回は参照はできるが複数の lsp サーバコマンドがある場合のエラーになります
ちなみに lsp-mode の ruby モードだと最優先で実行されるのは現状だと solargraph のようです