vim-lsp で TypeProf の LSP と接続してみた
RubyKaigi からだいぶ時間が立ってしまっていますが、やってみました。
前提
- Ruby 3.1.0-dev 環境
rbenv
を使っていればrbevn install 3.1.0-dev
しておく
- TypeProf の lsp-test ブランチ を使用
- Vim 側のプラグインは vim-lsp
- 競合しそうなので vim-lsp-settings はなし
- 自動補完はなし
- 使ってるプラグインと相性が悪かった
- LSP のサーバサイドの自動立ち上げはしておらず手動で立ち上げてそれと vim-lsp を接続する形にしている
下準備
TypeProf 側の準備
ここの 2. TypeProfを手元で動かす
まで進めておきます。
Vim 側の設定
vim-lsp の設定は以下のようになります。
let s:port = "38587" function! s:lsp_setup() abort call lsp#register_server({ \ 'name': 'typeprof', \ "tcp": { server_info-> "localhost:" . s:port }, \ 'allowlist': ['ruby'] \}) endfunction augroup lsp_install autocmd User lsp_setup call s:lsp_setup() augroup END
TypeProf は TCP サーバで立ち上がるのでそのサーバと接続する設定をしています。
Vim 側では自動で LSP のサーバは立ち上がらないので手動で TypeProf の LSP のサーバを立ち上げておく必要があります。
実際に試してみる
1. サンプル環境のダウンロード
ここからサンプル環境をダウンロードしてきます。
ダウンロードしてきたら Gemfile の typeprof
の path
に自分で clone してきた TypeProf のパスを指定しておきます。
source "https://rubygems.org" gem "typeprof", path: %q{TypeProf のパス}
これで bundle install
しておけば OK です。
$ bundle exec typeprof --version typeprof 0.15.2
2. TypeProf の LSP を起動
1.
のサンプル環境で typeprof
のサーバを立ち上げます。
$ bundle exec typeprof -I./ --lsp --port=38587 {"host":"127.0.0.1","port":38587,"pid":1143259}
-I
でロードパスを指定します。
今回は直下のファイルを参照したいので ./
を渡しています。
詳しくはこのあたりを読んでください。
port
は起動毎に変わるようになっているんですが、今回は Vim 側で接続先を決め打ちしているので port
番号を固定しています。
これで vim-lsp と接続する準備が整いました、
3. sample-vim-lsp-typeprof/main.rb
を Vim で開く
sample-vim-lsp-typeprof/main.rb
を Vim で開きます。
Vim 上で :LspStatus
を実行して typeprof: running
が表示されれば OK です。
これで LSP の機能が使える状態になっています。
LSP の機能を使ってみる
コード補完する
インサートモードで <C-x><C-o>
すると LSP のコード補完が動作します。
今回は自動補完ではなくて手動補完で試しています。
定義ジャンプ
:LspDefinition
で定義ジャンプします。
参照箇所の列挙
:LspReferences
で参照箇所の一覧を表示します。
所感
と、言う感じで簡単に試してみました。
TypeProf の LSP の立て方は要課題なんですがそれっぽく動作していますね。
正直、Ruby でコード補完はそこまで困ってないんですが、コードリーディング時の定義ジャンプとかは利用していきたいと思っているのでそのあたりが RBS なしでも安定して動作するようになれば真面目に導入していきたい気持ちが高まってきますね。
定義ジャンプであればパフォーマンスもそこまで気にならないと思いますし。
ちなみに自動補完は deoplete.nvim
+ deoplete-vim-lsp
を使っているんですがサーバに変なリクエスト?と飛ばしてるっぽくて TypeProf 側のサーバで死にまくっていましたね…。