cmp-nvim-lsp
今回は、いよいよコード補完を実現させます🤗
nvim-cmp source for neovim's built-in language server client.
nvim-cmp neovimの組み込み言語サーバークライアント用ソース。
それはもう「ちょうど夜が明けて、やがて窓から日が差してくるみたいに」。
Here comes the sun king 1
太陽王がやってきた
Capabilities
Language servers provide different completion results depending on the capabilities of the client. Neovim's default omnifunc has basic support for serving completion candidates.
言語サーバーは、クライアントの能力に応じて、異なる補完結果を提供します。 Neovimのデフォルトのomnifuncは、補完候補を提供するための基本的なサポートを備えています。
nvim-cmp supports more types of completion candidates, so users must override the capabilities sent to the server such that it can provide these candidates during a completion request. These capabilities are provided via the helper function require('cmp_nvim_lsp').default_capabilities
nvim-cmpはより多くの種類の補完候補をサポートしているため、補完要求時にこれらの候補を提供できるように、 ユーザーがサーバーに送信する機能をオーバーライドする必要があります。 この機能は、ヘルパー関数 require('cmp_nvim_lsp').default_capabilities を使用して提供されます。
As these candidates are sent on each request, adding these capabilities will break the built-in omnifunc support for neovim's language server client. nvim-cmp provides manually triggered completion that can replace omnifunc. See :help cmp-faq for more details.
これらの候補はリクエストごとに送信されるため、この機能を追加すると、neovim の言語サーバークライアントの組み込みの omnifunc サポートは切断されます。 nvim-cmp は、omnifunc に代わる手動トリガーによる補完機能を提供します。詳しくは :help cmp-faq を参照してください。
最も重要なのは、"サーバに送信する機能をオーバーライドする必要がある" というところでしょうか。 次項からやっていきましょう。
Setup / Install
オフィシャルに示されているコードと順番が逆になってしまいますが、先にCapabilities
からやっていきます。
Capabilities
本来は使用する言語サーバーのsetup
ごとにcapabilities
をオーバーライドする必要がありますが、
このサイトではmason-lspconfig
でまとめて行う方法をとってきました☀️
なので、これもまとめて簡単にやっちゃいましょう😎
mason.lua
を開いてこんなんしとけばOKです🧚♀️🧚
require('mason-lspconfig').setup_handlers {
function(server_name)
- require('lspconfig')[server_name].setup {}
+ require('lspconfig')[server_name].setup {
+ capabilities = require('cmp_nvim_lsp').default_capabilities(),
+ }
end,
}
一網打尽ですね🏝️
併せてpacker
に「mason-lspconfig
の設定にcmp-nvim-lsp
を使用するよ❗」、と教えておいてあげるとさらに安心🐶
use {
'williamboman/mason.nvim',
config = function() require 'extensions.mason' end,
requires = {
'williamboman/mason-lspconfig.nvim', 'neovim/nvim-lspconfig',
+ 'hrsh7th/cmp-nvim-lsp',
}
}
これだけやっておけば、あとはmason-lspconfig
が全ての言語サーバーに適用してくれるはずです。
Plugin Install
で、その流れのままnvim-cmp
のrequires
にもcmp-nvim-lsp
を入れてあげましょう😉
use {
'hrsh7th/nvim-cmp',
config = function() require 'extensions.nvim-cmp' end,
+ requires = {
+ 'hrsh7th/cmp-nvim-lsp',
+ }
}
Sources
んでもってさらに、 「補完ソースはcmp-nvim-lsp
を通して取得するんだよ🦜 」と、nvim-cmp
に宣言しておきましょう😆
cmp.setup {
mapping = map.preset.insert {
-- (中略)
},
+ sources = cmp.config.sources {
+ { name = 'nvim_lsp' },
+ },
}
Re Config
もう一個だけ。
以前、nvim-lspconfig.lua
の中に、こんなコードを入れていると思います。
-- Enable completion triggered by <c-x><c-o>
vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc'
Capabilities
の説明で示されているように、
「omnifunc
サポートが切断される」とのことなので、上記のコードを外しておいてもいいでしょう😉
Completion
ってことで、lua
ファイルを開いて、なんか適当に入力してみましょう。
補完候補が出ましたね🤗
操作について、わたしが分かる範囲だけ簡単に書くと、 デフォルトではCtrl-nまたは↓で下に、 Ctrl-pまたは↑で上に、メニュー内でカーソルが移動します。
Function
の項目にカーソルを合わせればDocument
も表示してくれるはずです🤓
あ、あとはもちろんmapping
に設定した操作も可能です❗
Everybody is laughing
みんな嬉しそう
( If it does not work well... )
補完候補が上手く出てこない場合はlua
ファイルを開いた状態で:LspInfo
を確認してみてください。
Client
にlua_ls
が認識されている状態であれば、nvim-cmp
とcmp-nvim-lsp
が上手く連携できていないだけだと思われます😉
...もしlua_ls
が認識されていなければ、それは "履 い て な い" んです、PAAAANTS!! 🤷♀️
急いでnvim-lspconfig
/ mason.nvim
/ mason-lspconfig.nvim
まで戻って "履 い て" 来てください 👉🩲👈
I'll take you all.
この時点でも相当な満足感でしょう⁉️
これだけでも機能としては十分に感じられますが、こんなもんじゃ収まりません マジで😆
メドレーはまだまだ続く... 🎶