cmp-nvim-lsp
今回は、いよいよコード補完を実現させます🤗
nvim-cmp source for neovim's built-in language server client.
nvim-cmp neovimの組み込み言語サーバークライアント用ソース。
それはもう「ちょうど夜が明けて、やがて窓から日が差してくるみたいに」。
Here comes the sun king
太陽王がやってきた
Setup / Install
まずはnvim-cmpのrequiresにcmp-nvim-lspを入れてあげましょう😉
use {
'hrsh7th/nvim-cmp',
config = function() require 'extensions.nvim-cmp' end,
+ requires = {
+ 'hrsh7th/cmp-nvim-lsp',
+ }
}
Sources
前回作成したnvim-cmp.luaを開いて、「補完ソースはcmp-nvim-lspを通して取得するんだよ🦜 」とnvim-cmpに宣言しておきましょう😆
cmp.setup {
mapping = map.preset.insert {
-- (中略)
},
+ sources = cmp.config.sources {
+ { name = 'nvim_lsp' },
+ },
}
Capabilities
cmp-nvim-lspのセットアップにおいて最も重要なのは、
"サーバに送信する機能をオーバーライドする必要がある" というところでしょうか。
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ごとにcapabilitiesをオーバーライドする必要がありますが、
これもまとめて簡単に (ざっくりと) やっちゃいましょう😎
cmp.setupの最後にでも、こんな感じで追記します。
cmp.setup {
...
+ vim.lsp.config('*', {
+ capabilities = require('cmp_nvim_lsp').default_capabilities()
+ })
}
一網打尽ですね🏝️
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まで戻って "履 い て" 来てください 👉🩲👈
Sun King
この時点でも相当な満足感でしょう⁉️
これだけでも機能としては十分に感じられますが、こんなもんじゃ収まりません マジで😆
メドレーはまだまだ続く... 🎶
Everybody is happy
みんな幸せ