ラベル lsp の投稿を表示しています。 すべての投稿を表示
ラベル lsp の投稿を表示しています。 すべての投稿を表示

2026年6月12日金曜日

VSCode の Ruby LSP をセットアップする方法

VSCode の Ruby LSP をセットアップする方法

概要

https://marketplace.visualstudio.com/items?itemName=Shopify.ruby-lsp これをセットアップする方法を紹介します

環境

  • macOS 26.5.1
  • VSCode 1.123.1
    • Ruby LSP 0.10.4

watchman のインストール

  • brew install watchman

watchman はグローバルにあるものを使うので homebrew でインストールします

sorbet のインストール

  • vim Gemfile
group :development do
  gem 'sorbet'
  gem 'sorbet-runtime'
  gem 'tapioca'
end

sorbet を使うのでインストールします
これは開いているプロジェクト内で bundle 経由で実行するので Gemfile からインストールします

tapioca の初期化

必要な rbi ファイルを作成します

  • bundle exec tapioca init
  • bundle exec tapioca gems

これで bin/tapiocasorbet/ が生成されます

rubocop を使っている場合は

.rubocop.yaml に以下を追記しておきましょう

Style/StringLiterals:
  Exclude:
    - 'bin/tapioca'

動作確認

VSCode を開くと自動的に Ruby LSP が起動します
状態が Idle になれば OK です

Restarting を繰り返している場合は Output を確認し Sorbet や watchman が正しく動作しているか確認しましょう
起動後に自作のクラスなどで警告が出る場合は tapioca で rbi ファイルなどが生成されている確認しましょう

最後に

bundle exec tapioca gems は定期的に実行する必要があります

2025年1月23日木曜日

emacs に lsp-java をインストールする方法

emacs に lsp-java をインストールする方法

概要

eclipse なしで Java を開発したい場合に lsp-java は必須かなと思います
ポイントは lsp-java とプロジェクトで動作する Java を同一にする点です

環境

  • macOS 15.2
  • emacs 29.4
  • lsp-java 3.1 (20240524.2207)

lsp-java のインストール

package-list-packages から lsp-java を選択してインストールすれば OK です

init.el の設定

; for java lsp with Eclipse JDT Language Server
(require 'lsp-java)
(add-hook 'java-mode-hook #'lsp)

Java のバージョンを指定したい場合は以下のように設定します

(require 'lsp-java)
(add-hook 'java-mode-hook
  (lambda ()
    (setq lsp-java-java-path "/opt/homebrew/Cellar/openjdk@21/21.0.5/libexec/openjdk.jdk/Contents/Home/bin/java")
    (lsp)))

初回起動: Eclipse JDT Language Server のダウンロード

lsp-java 初回起動時は以下のようなメッセージが表示され自動で Eclipse JDT Language Server がインストールされます
エンターを押せば自動でダウンロードされます

Unable to find installed server supporting this file. The following servers could be installed automatically

lsp-install.sh のバッファにダウンロードログが記録されるので確認しましょう

インストールパスは ~/.emacs.d/.cache/lsp/eclipse.jdt.ls/ でサイズが101MBと結構大きいのでディスク容量に注意しましょう

eclipse.jdt.ls % pwd
/Users/user01/.emacs.d/.cache/lsp/eclipse.jdt.ls
eclipse.jdt.ls % du -h -s
101M    .

動作確認

java ファイルを開いて lsp-java が起動することを確認しましょう
lsp-log のバッファにもエラーログがないことを確認します

completion-at-point などでクラス名などを補完したり M-. で jump できることを確認しましょう

トラブルシューティング

いくつかハマリポイントがあったので紹介します

java のパスとバージョンを確認する

lsp-log のバッファに「Unsupported class file major 67」が出ていて lsp-java でジャンプするときに「No definitions found for」など出る場合は lsp-java は起動していて emacs との接続はできているがうまく動作していません

確認する点は以下です

  • emacs を起動しているターミナルに正しい java コマンドが通っているか
  • jenv など使っている場合に zshrc を再度読み込ませているか
  • emacs を起動するパスがプロジェクトのルートパスになっているか
  • lsp-java が使用している java のバージョンが正しいバージョンになっているか (lsp-java-java-path の設定ミス)

あたりを確認していましょう
java のバージョンが 23 になっていたりすると該当のエラーが発生したりします

Gradle Daemon を再起動する

一度どこかのプロジェクトで gradle build しているバックエンドで Gradle Daemon というプロセス (org.gradle.launcher.daemon.bootstrap.GradleDaemon) が起動してしまいます
これが Java23 で動作していると lsp-java の gradle build も Java23 になってしまいます

  • ./gradlew --stop
  • rm -rf ~/.gradle/daemon

一度プロジェクトで gradle daemon を停止しgradle.properties に以下を追記します

org.gradle.java.home=/opt/homebrew/Cellar/openjdk@21/21.0.5/libexec/openjdk.jdk/Contents/Home
  • ./gradlew build

これで gradle daemon が起動する Java も 21 になり lsp-java が参照する Java も 21 になるはずです

それでもダメな場合はシステムで使用する Java を変更しましょう

  • jenv remove 23 23.0 23.0.1 openjdk64-23.0.1
  • sudo rm /Library/Java/JavaVirtualMachines/openjdk-*.jdk
  • sudo ln -sfn /opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
  • jenv add "$(/usr/libexec/java_home)"

Eclipse JDT Language Server のバージョンを固定する

(setq lsp-java-jdt-download-url "https://www.eclipse.org/downloads/download.php?file=/jdtls/milestones/1.37.0/jdt-language-server-1.37.0-202406271335.tar.gz")
Cannot convert string value 'VERSION_21' to an enum value of type 'org.gradle.api.JavaVersion'

というエラーログが出る場合はバージョンを固定することで解決することもあります

最後に

lsp-java を emacs に導入してみました
Java のバージョンや JDT のバージョンで結構苦戦するところが多かったです

これで eclipse などの IDE なしで java の開発ができそうです

参考サイト

2023年10月30日月曜日

Company: frontend company-pseudo-tooltip-unless-just-one-frontend error "Company: backend company-capf error "Symbol’s function definition is void: string-lines" with args (match dataclass)" on command post-command

Company: frontend company-pseudo-tooltip-unless-just-one-frontend error "Company: backend company-capf error "Symbol’s function definition is void: string-lines" with args (match dataclass)" on command post-command

概要

タイトルのエラーが pyright + company で発生したので対応しました

環境

  • Ubuntu 22.04
  • emacs 27.1

対応方法

emacs を 29.1 にバージョンアップする

  • git clone --depth 1 --branch emacs-29.1 git://git.savannah.gnu.org/emacs.git emacs-29.1
  • cd emacs-29.1
  • sudo apt -y install autoconf textinfo libgnutls28-dev
  • ./autogen.sh
  • ./configure.sh
  • sudo make install

lsp-mode をアップグレードする

  • package-list-packages
  • Shift+U
  • x

あとは emacs を起動し直せば OK

最後に

emacs の最新版はソースインストールするしかないのでソースからインストールしましょう

足りないパッケージがあれば apt でインストールしてください

2023年7月7日金曜日

golangのlsp設定方法(emacs編)

golangのlsp設定方法(emacs編)

概要

gopls という公式が出している language server があるのでそれを使います
基本は公式のドキュメントを参考にすれば OK です

環境

  • Ubuntu 18.04
  • golang 1.20.5
  • gopls 0.12.4
  • emacs 27.1
    • lsp-mode 20230625

gopls のインストール

必要に応じて PATH を通しましょう

  • export PATH=$PATH:/home/user01/go/bin/

.emacs の編集

クライアントは lsp-mode を使っています
go-mode をフックして lsp を起動するだけです
golsp に対応しているバージョンを使いましょう

; for golang
(require 'lsp-mode)
(add-hook 'go-mode-hook #'lsp-deferred)

(defun lsp-go-install-save-hooks ()
  (add-hook 'before-save-hook #'lsp-format-buffer t t)
  (add-hook 'before-save-hook #'lsp-organize-imports t t))
(add-hook 'go-mode-hook #'lsp-go-install-save-hooks)

動作確認

念のためシェルを抜けて gopls がちゃんとコマンドとして起動することを確認してから emacs を起動しましょう
あとは go ファイルを開くだけで OK です

参考サイト

2023年6月26日月曜日

emacsでruby-lspを使ってみる

emacsでruby-lspを使ってみる

概要

solargraph に変えて ruby-lsp を使ってみました
emacs のクライアントは lsp-mode を使います

環境

  • macOS 11.7.6
  • emacs 28.2
    • lsp-mode 20230524.1820
  • Ruby 3.2.1
    • ruby-lsp 0.5.1

lsp-mode アップデート or インストール

ruby-lsp に対応しているバージョンをインストールしましょう

  • M-x package-list-packages

ruby-lsp

solargraph のアンインストール

  • gem uninstall solargraph

ruby-lsp のインストール

  • gem install ruby-lsp

ruby-lsp コマンドが実行できることを確認してください
また emacs から ruby-lsp コマンドが見つからず Command "ruby-lsp" is not present on the path. という感じでうまく起動できない場合はターミナルや tmux から一度抜けて再度試してみてください

emacs の設定

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

bundler 配下で使用する場合には Gemfile に

gem 'ruby-lsp'

をし bundle install した後上記コメント部分をアウトしてください

動作確認

トラブルシューティング

solargraph から移行した場合には前のセッションが残っておりうまく動作しないことがあるのでセッションを削除して再度 ruby-lsp を起動してみてください

  • rm ~/.emacs.d/.lsp-session-v1
The connected server(s) does not support method textDocument/definition.
To find out what capabilities support your server use ‘M-x lsp-describe-session’
and expand the capabilities section

となり定義へのジャンプはできませんでした
おそらく https://github.com/Shopify/ruby-lsp/pull/195 にあるように特殊なコメントを記載することでそこに飛ぶことはできるようです
またその場合は lsp-mode 側で lsp-enable-links を有効にする必要がありそうです

最後に

まだまだ開発途中という感じがします
また vscode に特化しているのと記述が Spotify 基準になっているので少し特殊な書き方が必要かもしれません
当面は solargraph + robe という気がします

参考サイト

2023年5月22日月曜日

SolargraphのRequired path patreon could not be resolvedはbundle配下だとほぼ確実に出てしまうので無視するといい

SolargraphのRequired path patreon could not be resolvedはbundle配下だとほぼ確実に出てしまうので無視するといい

概要

Solargraph の reporters にはデフォルトで require_not_found が含まれています

require_not_found は require している gem がちゃんとプロジェクト内に存在してるかチェックしてる機能です

Solargraph で require_not_found を使っている場合に「Required path patreon could not be resolved.」というエラーが出る場合の対処方法を紹介します

原因

bundle 配下で gem を管理しているが Solargraph はグローバルにインストールしたコマンドを使っている場合にはほぼ確実に発生します

理由は bundle 配下にはちゃんと gem があるがグローバルにインストールした Solargraph だと bundle 配下の gem は管理外になるので対象の gem が見つからず require_not_found がエラーを吐いている状況です

対処方法1

solargraph を bundle 配下で動作させる方法で解決できます

設定方法はこちらで紹介しています

対処方法2

.solargraph.yml から require_not_found を削除してしまいましょう

reporters:
- rubocop

おそらくこれが一番簡単です

上記でいい理由

Ruby の場合実行しないと結局わからないので実行することで gem がないかどうかは判別できます
また require した gem があるかどうかよりも require した gem がコード内で参照されているかをチェックしたいですが ruby や rubocop ではそれはできません

結局 require の部分に関しては自分で管理するしかないので require_not_found があってもなくてもそこまで変わらないかなと思います

2023年1月12日木曜日

solargraph に curl で jsonrpc を直接送信してみる

solargraph に curl で jsonrpc を直接送信してみる

概要

普段はエディタの拡張を使って裏で通信しています
拡張を書く場合などに curl を使ってテストしたいなと思ったので solargraph に curl で jsonrpc リクエストを送信してみました

環境

  • macOS 11.7.2
  • Ruby 3.1.2
  • solargraph 0.44.3

solargraph インストール

  • gem install solargraph

solargraph 起動 (ソケットモード)

  • solargraph socket
Solargraph is listening PORT=7658 PID=24943

curl でリクエストを送信

  • curl --http0.9 -XPOST -d '{"jsonrpc":"2.0","method":"$/solargraph/checkGemVersion","id":"1"}' localhost:7658

結果

Content-Length: 188

{"jsonrpc":"2.0","method":"window/showMessageRequest","params":{"type":3,"message":"Solargraph gem version 0.48.0 is available. (Current version: 0.44.3)","actions":["Update now"]},"id":1}

Content-Length: 79

188バイト送信して79バイト受信しています

最後に

stdio モードで起動した solargraph にエディタから通信する方法はあるのだろうか

2022年12月15日木曜日

emacs + pyright 設定方法

emacs + pyright 設定方法

概要

pylsp から pyright に乗り換えてみました
pyright の設定方法を紹介します

また今回は pipenv 配下で使用する方法を紹介します

環境

  • Ubuntu 18.04
  • emacs 27.1
  • Python 3.10.2
  • pyright 1.1.284

pyright のインストール

  • pip install pyright

pylsp のように無理やり書き換える必要はないです
グローバルにインストールしましょう

lsp-pyright のインストール

  • package-list-packages -> lsp-pyright
  • package-list-packages -> leaf

をインストールしましょう
どちらも melpa からインストールしました

.emacs

(leaf lsp-pyright
  :ensure t
  :require t
  :after python
  :defvar lsp-pyright-venv-path
  :init
  (setq lsp-pyright-venv-path "/home/user/.local/share/virtualenvs/app-Yn-xfOlh")
  :hook
  (python-mode-hook . lsp))

少し解説

lsp-pyright-venv-path に pipenv の環境のパスを設定してあげます
pipenv --venv で確認できるのでそこで表示されたパスを記載しましょう
別の virtualenv を使いたい場合は setq の命令を scratch で実行した上で lsp-restart-workspace を実行すれば OK です

pyenv.el と組み合わせればダイナミックに切り替えできるっぽいですがうまくできなかったので直接指定しています

参考サイト

2022年12月9日金曜日

emacs + pylsp で補完しない場合の対処方法2

emacs + pylsp で補完しない場合の対処方法2

概要

その1はこちら

環境

  • Ubuntu 18.01
  • emacs 27.1

対処方法

  • helm-lsp

or

  • company

をインストールする
auto-complete だと補完ウィンドウが表示されないので注意

2022年10月28日金曜日

emacs の lsp-mode で取り込んだワークスペースのルートディレクトリの設定をクリアする方法

emacs の lsp-mode で取り込んだワークスペースのルートディレクトリの設定をクリアする方法

概要

lsp-mode でプロジェクトなどを追加して初回にプロジェクト内のファイルを読み込むときにプロジェクトのルートディレクトリを指定することができます
しかし Ctrl+g などでキャンセルしてしまうことがあります
その場合の対処方法を紹介します

環境

  • macOS 11.6.8
  • emacs 28.1
  • lsp-mode 20220201.852

対処方法

  • rm ~/.emacs.d/.lsp-session-v1

参考サイト

2022年2月17日木曜日

pylsp で pipenv 配下にインストールしたモジュールの補完がされない場合の対処方法

pylsp で pipenv 配下にインストールしたモジュールの補完がされない場合の対処方法

概要

過去に emacs+pylsp の連携方法を紹介しました
今回は pipenv を使って pypi からインストールしたモジュールの補完を pylsp を使って行う方法を紹介します

環境

  • macOS 11.6.3
  • Python 3.9.10

pylsp を無理やり上書きする

グローバルにインストールした pylsp を pipenv 配下にインストールした pylsp で無理やり上書きします
具体的には以下のようにシンボリックリンクを貼れば OK です

  • cd /path/to/project
  • ln -sf $(pipenv --venv)/bin/pylsp /usr/local/bin/pylsp

ちなみに上記は pylsp のパスが上記の場合になります

$ which pylsp
/usr/local/bin/pylsp

ただこれの場合は1プロジェクトにしか対応できないのとプロジェクトを切り替えるたびにシンボリックリンクも切り替えなければいけないので大変です

pylsp 用に一つプロジェクトを作成してそこに補完してほしいモジュールをどんどんインストールするのもありかなと思います

pyenv 配下のプロジェクトの場合は別のファイルを上書きする

pyenv 配下のプロジェクトの場合 pylsp のスクリプトは一度別のスクリプトのスクリプトを経由するので which で表示されるスクリプトではなく実体のスクリプトを上書きしましょう

# which pylsp
/root/.pyenv/shims/pylsp

# pyenv version
3.10.1 (set by /root/.pyenv/version)

# ls /root/.pyenv/versions/3.10.1/bin/pylsp
/root/.pyenv/versions/3.10.1/bin/pylsp

# ln -sf $(pipenv --venv)/bin/pylsp /root/.pyenv/versions/3.10.1/bin/pylsp

グローバルな pip にインストールする

python-lsp-server が起動している pip 環境と同じ環境にモジュールをインストールします

これでも対応可能ですが補完が必要なモジュールがあるたびにグローバルな環境にモジュールをインストールする必要があります

また pipenv の環境間で同じモジュールのバージョン違いがある場合は補完候補が間違うことがあります

pyls_jsonrpc.endpoint - Received cancel notification for unknown message id

pylsp::stderr バッファーになぜかこれが出力されるケースがありました
これが出力されていると補完時に「No matches」と表示されて補完がうまく動作しません

原因は不明です

emacs の lsp-mode の対応に期待する

pylsp の設定で pipenv 配下の pylsp を実行するような設定が出てくるのを待ちましょう

もしくは自分で修正しましょう

最後に

emacs の lsp-mode の solargraph には bundler 配下にインストールした solargraph を使用するというオプションがあるのですが pylsp にはないので今回のような少しトリッキーな対応が必要になります

参考サイト

2021年9月8日水曜日

emacs で Python の lsp サーバと連携する方法

emacs で Python の lsp サーバと連携する方法

概要

Python の LSP サーバを導入して emacs と連携してみました
サーバは python-lsp/python-lsp-server を使い emacs 側からは lsp-mode を使います

環境

  • macOS 11.5.2
  • emacs 27.1
  • python-lsp-server 1.2.1
  • Python 3.8.3

python-lsp-server のインストール

  • pip install 'python-lsp-server[all]'

pylsp というコマンドがグローバルにインストールされ使えるようになれば OK です

lsp-mode の設定

  • vim .emacs
(require 'lsp-mode)
(add-hook 'python-mode-hook #'lsp)

動作確認

Python ファイルを開けば lsp が自動で起動します

  • M-. ジャンプ
  • M-x ジャンプ戻る
  • TAB or C-M-i 補完

最後に

python-launguage-server というサーバ実装もありますがこちらはもうメンテされていないので python-lsp-server を使いましょう

標準パッケージは補完してくれますが自分で作成したクラスから作成したオブジェクトのメソッド名の補完などはやってくれませんでした

ただ新規作成したクラスに対しては補完してくれたので設定が足りていないだけかなと思います

参考サイト

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 よりもいいかも 参考)

参考サイト

2021年9月2日木曜日

eglot 起動時に flymake-mode を自動起動させない方法

eglot 起動時に flymake-mode を自動起動させない方法

概要

flymake を使って構文チェックしたくない場合には eglot 起動時に flymake を自動起動しないようにしましょう

環境

  • macOS 11.5.2
  • emacs 27.1
  • eglot 20210817.912

やり方

.emacs に以下を追記します
eglot--managed-mode-hook で eglot 起動時に flymake-mode に -1 を設定することで自動起動を防ぐことができます

(require 'eglot)
(add-hook 'eglot--managed-mode-hook (lambda () (flymake-mode -1)))

2021年9月1日水曜日

M-x eglot で起動時のデフォルトコマンドを変更する方法

M-x eglot で起動時のデフォルトコマンドを変更する方法

概要

デフォルトだとグローバルにインストールしたコマンドを使うようになっています
プロジェクト固有のコマンドを使いたい場合などはデフォルトのコマンドを変更することができます

環境

  • macOS 11.5.2
  • emacs 27.1
  • eglot 20210817.912

やり方

以下を .emacs に追記します
eglot-server-programs という変数の値を変更すれば OK です

(add-to-list 'eglot-server-programs '(ruby-mode . ("bundle" "exec" "solargraph" "socket" "--port" :autoport)))

2021年8月31日火曜日

LSP solargraph で rubygems にある gem のコード補完を行う方法

LSP solargraph で rubygems にある gem のコード補完を行う方法

概要

デフォルトでは Rubygems からインストールしたライブラリなどは補完の対象になっていません
今回は Gemfile などを使ってインストールしたライブラリの補完を solargraph を使って行う方法を紹介します

環境

  • macOS 11.5.2
  • emacs 27.1
  • solargraph 0.43.0
  • Ruby 3.0.1p64

bundler 配下で solargraph を管理する

前回はグローバルに solargraph をインストールしました
すでにプロジェクトがありそれが bundler で閉じている場合、グローバルの solargraph ではなく bundler 配下の solargraph を使います

  • cd /path/to/workspace
  • vim Gemfile
gem "solargraph"
gem "yard"
  • bundle install

yard ドキュメントの生成

ポイントは yard ドキュメントを生成する必要がある点です
solargraph をインストールすると yard の gem も同時にインストールされておりこれを使って yard ドキュメントを生成しましょう

初回生成時は時間のかかる場合があります

  • cd /path/to/workspace
  • bundle exec yard gems

vendor 配下の各 gem に .yardoc ファイルが生成されていれば OK です

生成されたパスを調べたい場合は --debug オプションを使います

  • bundle exec yard gems --debug

グローバルな solargraph の停止

もしすでにグローバルにインストールした solargraph が起動している場合は停止しましょう

emacs から自動起動する設定が記載されている場合は一旦その行をコメントして emacs を再起動しましょう

eglot の起動

emacs 側から接続しにいきます
ここでもポイントがあり eglot から solargraph を起動する場合に bundler 配下の solargraph を起動するようにします

なのでまず emacs のバッファのワークディレクトリを変更します

  • M-x cd
    • /path/to/workspace に移動する

そして bundle exec 経由で solargraph を起動すれば OK です

  • C-u M-x eglot
    • bundle exec solargraph socket --port :autoport:

これで「[eglot] Connected! Server EGLOT (pjct-name/ruby-mode) now managing ‘ruby-mode’ buffers in project ‘pjct-name’.」となれば接続完了です

動作確認

サードパーティの gem にカーソルを合わせるとちゃんと補完が表示されます

最後に

ポイントは以下の2点です

  • bundle exec yard gems で bundler 配下にインストールした gem のドキュメントを生成する
  • グローバルの solargraph ではなく bundler 配下にインストールした solargraph を eglot から起動する

のがポイントです

おまけ: 対象クラスのスキャン

  • cd /path/to/workspace
  • solargraph scan -v

おまけ: 設定ファイルの作成

  • cd /path/to/workspace
  • solargraph config

参考サイト

2021年8月30日月曜日

Emacs で Ruby の LSP をインストールする方法

Emacs で Ruby の LSP をインストールする方法

概要

Ruby で LSP に入門してみました
今回はサーバ側は solargraph という LSP 実装を使いクライアント側は eglot というツールを使います

環境

  • macOS 11.5.2
  • emacs 27.1
  • solargraph 0.43.0
  • Ruby 3.0.1p64

solargraph のインストール

まずはサーバ側のインストールを行います
Ruby を実装されているので gem を使うと簡単です

  • gem install solargraph

eglot のインストール

次にクライアント側 (emacs) の設定になります
package-list-packages から eglot を選択してインストールします

.emacs の設定

ruby-mode にフックするのが一番簡単です

(require 'eglot)
(add-hook 'ruby-mode-hook 'eglot-ensure)

動作確認

emacs を起動して ruby のファイルを開きましょう
eglot が自動的に起動して接続できれば OK です

補完を使うには Ctrl + Alt + i を押せば現在のカーソル上で補完可能な候補を表示してくれます
もし helm などを使っている場合は helm 上で候補を絞ることができます

最後に

引数などのオブジェクトの補完はデフォルトだとやってくれませんでした

また flymake を使って構文チェックを行ってくれるのですが自分の設定が悪いのか Wait という状態になり動作しませんでした
すべてにいろいろと設定済みの emacs 上だとそれらと競合してうまく動かない部分が出てくるのかもしれません

トラブルシューティング

eglot 起動時に Could not start and connect to server が発生する場合は emacs から solargraph の起動がうまくいっていません

emacs を開いているバッファ上で solargraph コマンドが実行できるか確認しましょう PATH など変更している場合は一度 emacs とターミナルを閉じて再度 PATH を読み込ませるとうまく起動できます

参考サイト