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です🧚‍♀️🧚

extensions/mason.lua

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を使用するよ❗」、と教えておいてあげるとさらに安心🐶

extensions/init.lua

  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-cmprequiresにもcmp-nvim-lspを入れてあげましょう😉

extensions/init.lua

  use {
    'hrsh7th/nvim-cmp',
    config = function() require 'extensions.nvim-cmp' end,
+   requires = {
+     'hrsh7th/cmp-nvim-lsp',
+   }
  }

Sources

んでもってさらに、 「補完ソースはcmp-nvim-lspを通して取得するんだよ🦜 」と、nvim-cmpに宣言しておきましょう😆

extensions/nvim-cmp.lua

cmp.setup {
  mapping = map.preset.insert {

    -- (中略)

  },

+ sources = cmp.config.sources {
+   { name = 'nvim_lsp' },
+ },
}

Re Config

もう一個だけ。

以前、nvim-lspconfig.luaの中に、こんなコードを入れていると思います。

extensions/nvim-lspconfig.lua

  -- Enable completion triggered by <c-x><c-o>
  vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc'

Capabilitiesの説明で示されているように、 「omnifuncサポートが切断される」とのことなので、上記のコードを外しておいてもいいでしょう😉

Question

「結局omnifuncってなんやったん❓」ってなるんですけど、わたしもよく知らないんですよねー😅

Completion

ってことで、luaファイルを開いて、なんか適当に入力してみましょう。

Note

このサイトでは、今後も基本的にはlua_lsを使用して進みます。

cmp-nvim-lsp 1

補完候補が出ましたね🤗

操作について、わたしが分かる範囲だけ簡単に書くと、 デフォルトではCtrl-nまたはで下に、 Ctrl-pまたはで上に、メニュー内でカーソルが移動します。

cmp-nvim-lsp 2

Functionの項目にカーソルを合わせればDocumentも表示してくれるはずです🤓

あ、あとはもちろんmappingに設定した操作も可能です❗

Everybody is laughing

みんな嬉しそう

( If it does not work well... )

Warning

補完候補が上手く出てこない場合はluaファイルを開いた状態で:LspInfoを確認してみてください。

lsp-info

Clientlua_lsが認識されている状態であれば、nvim-cmpcmp-nvim-lspが上手く連携できていないだけだと思われます😉

...もしlua_lsが認識されていなければ、それは "履 い て な い" んです、PAAAANTS!! 🤷‍♀️

急いでnvim-lspconfig / mason.nvim / mason-lspconfig.nvimまで戻って "履 い て" 来てください 👉🩲👈

I'll take you all.

この時点でも相当な満足感でしょう⁉️

これだけでも機能としては十分に感じられますが、こんなもんじゃ収まりません マジで😆

メドレーはまだまだ続く... 🎶

Success

Everybody is happy

みんな幸せ