vim-lsp で TypeProf の LSP と接続してみた

RubyKaigi からだいぶ時間が立ってしまっていますが、やってみました。

前提

下準備

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 の typeprofpath に自分で 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.rbVim で開く

sample-vim-lsp-typeprof/main.rbVim で開きます。
Vim 上で :LspStatus を実行して typeprof: running が表示されれば OK です。
これで LSP の機能が使える状態になっています。

LSP の機能を使ってみる

コード補完する

インサートモードで <C-x><C-o> すると LSP のコード補完が動作します。
今回は自動補完ではなくて手動補完で試しています。

f:id:osyo-manga:20211003214409g:plain

定義ジャンプ

:LspDefinition で定義ジャンプします。

f:id:osyo-manga:20211003215102g:plain

参照箇所の列挙

:LspReferences で参照箇所の一覧を表示します。

f:id:osyo-manga:20211003214213g:plain

所感

と、言う感じで簡単に試してみました。
TypeProf の LSP の立て方は要課題なんですがそれっぽく動作していますね。
正直、Ruby でコード補完はそこまで困ってないんですが、コードリーディング時の定義ジャンプとかは利用していきたいと思っているのでそのあたりが RBS なしでも安定して動作するようになれば真面目に導入していきたい気持ちが高まってきますね。
定義ジャンプであればパフォーマンスもそこまで気にならないと思いますし。
ちなみに自動補完は deoplete.nvim + deoplete-vim-lsp を使っているんですがサーバに変なリクエスト?と飛ばしてるっぽくて TypeProf 側のサーバで死にまくっていましたね…。