2021年9月3日金曜日

lsp-mode + solargraph 設定方法

lsp-mode + solargraph 設定方法

概要

過去に eglot + solargraph を使った方法を紹介しましたが lsp-mode を使うほうがオススメです

環境

  • macOS 11.5.2
  • emacs 27.1
  • lsp-mode 20210831.1901
  • solargraph 0.43.0

solargraph のインストール

今回は bundler 配下で管理します
プロジェクトがそもそも bundler で管理されている場合は bundler 配下の gem も補完対象にするためにグローバルな solargraph ではなく bundler 配下にインストールした solargraph を使う必要があります

  • vim Gemfile
gem "solargraph"
  • bundle install

また yardoc が必要なので生成します

  • bundle exec yard gems
  • bundle exec solargraph bundle
  • bundle exec solargraph download-core

lsp-mode のインストール

package.el から lsp-mode をインストールします

  • M-x package-list-packages

.emacs 設定

ruby-mode で自動起動する設定と bundler 配下の solargraph を仕様する設定を追加します

(require 'lsp-mode)
(setq lsp-solargraph-use-bundler t)
(add-hook 'ruby-mode-hook 'lsp)

lsp-mode を起動するのではなく lsp を起動するのがポイントです

またプロジェクトの初回オープン時には以下のような確認が出ることがあるのでプロジェクトのルートパスを確認して選択しましょう

動作確認

あとは .rb ファイルを開けば OK です
自動で bundler 配下の solargraph を起動してくれます

基本的な操作は以下の通りです

  • M-. カーソルのあるモジュールやメソッドへジャンプする
  • M-, ジャンプ元に戻る
  • C-M-i 補完候補の表示

トラブルシューティング

うまくジャンプや補完が動作していない場合は bundler 配下の solargraph ではなくグローバルの solargraph が起動している可能性があります

一度グローバル側の solargraph を削除して再度 lsp-mode を起動して挙動を確認してみましょう

その他

  • require_relative で参照している先の ruby ファイルは補完してくれない (設定ミス?)
  • lsp-ruby や lsp-ui をインストールする必要はない
  • 生成したオブジェクトから参照可能なメソッドや変数を補完してくれない
    • 原因は module に配下にあるメソッドなどは補完対象ではないためです
    • gmail などの gem は module ベースでオブジェクトを生成するため生成したオブジェクト配下のメソッドは solargraph では参照できないためです
    • その場合は bundle exec irb か公式のリファレンスを参照しましょう
  • 複数のプロジェクトがある場合には先に起動した lsp を参照してしまうのでワークスペースを分けてプロジェクトを管理しましょう

最後に

eglot の場合 flymake がうまく動作していなかったのですが lsp-mode はうまく動作しました

require_relative を参照しないなど完全に動作するわけではないですが十分強力な機能かなと思います

(robe よりもいいかも 参考)

参考サイト

2 件のコメント:

  1. solargraphは基本的にbundle配下で使う感じになります

    返信削除
  2. bundle exec solargraph bundle も実行しましょう

    返信削除