はじめに
最近NeovimにLSPクライアントが入りました。
まだ入ったばかりの機能なので、今後使い方が変更される可能性があります。
Neovimのバージョンは NVIM v0.5.0-252-gee7ac469c, LSはtsserverを使用します。
環境はMicrosoft Terminal内のWSL(Ubuntu 18.04)です。
他の言語で試す場合は、適時読み替えてください。
設定
nvim-lsp
neovim/nvim-lspを使います。
このリポジトリは各LSの設定集です。
vim-lspにおけるvim-lsp-settingsと同じものですね。
deinを使っているのでTOMLファイルに追記します。
[[plugins]]repo='neovim/nvim-lsp'
init.vim
NeovimのLSPクライアントはLuaで書かれているので呼び出しもLuaです。1
"基本的にこれだけでOKlua require'nvim_lsp'.tsserver.setup{}"omnifuncを設定
autocmd Filetype typescript setlocal omnifunc=v:lua.vim.lsp.omnifunc
"lsp.txtそのまま
nnoremap <silent> gd <cmd>luavim.lsp.buf.declaration()<CR>
nnoremap <silent><c-]><cmd>luavim.lsp.buf.definition()<CR>
nnoremap <silent> K <cmd>luavim.lsp.buf.hover()<CR>
nnoremap <silent> gD <cmd>luavim.lsp.buf.implementation()<CR>
nnoremap <silent><c-k><cmd>luavim.lsp.buf.signature_help()<CR>
nnoremap <silent>1gD <cmd>luavim.lsp.buf.type_definition()<CR>
tsserver
nvim-lspが入っていればvim内からコマンドでインストールできるみたいですが、今回はnpmでインストールしました。
:LspInstall tsserver
or npm i -g typescript-language-server
ディレクトリ
デフォルトではルートディレクトリの設定がpackage.jsonになっているので適当に作ります。
npm init -y
npm -D i tyepscript
touch index.ts
使ってみる
準備が終わったので各機能を見ていきます。
補完
手動(<C-X><C-O>
)のオムニ補完です。
実行と同時に新しいバッファが開きますが、なにも表示されずよくわかりません。
Image may be NSFW.
Clik here to view.
virtual textが荒ぶってますが、ちゃんと候補が出てきます。
Image may be NSFW.
Clik here to view.
しかし、文字の途中で補完を呼び出すとうまく動きません。
エラー表示
virtual textで表示されます。
Image may be NSFW.
Clik here to view.
フォーマット
動きます。
vim.lsp.buf.formatting()
Image may be NSFW.
Clik here to view.
ホバー
floating windowで表示されます。
ウィンドウが出ている間にもう一度呼び出すと(この場合K
)floating windowにフォーカスが行きます。
vim.lsp.buf.hover()
Image may be NSFW.
Clik here to view.
シグネチャヘルプ
ホバーと同様に表示されます。vim.lsp.buf.signature_help()
Image may be NSFW.
Clik here to view.
ジャンプ
定義と実装それぞれに移動できます。
vim.lsp.buf.implementation()
Image may be NSFW.
Clik here to view.
vim.lsp.buf.definition
vim.lsp.buf.type_definition()
Image may be NSFW.
Clik here to view.
おわりに
virtual textや補完周りが気になりますが、動くようにはなっていますね。
ドキュメント等にもTODOが目立つので今後に期待です。
備考
NeovimとVimとでは、Luaのvimモジュールに互換性はありません。 ↩