ITエンジニアによるITエンジニアのためのブログ

Neovimコード補完

この記事では、Neovimのnvim-cmpプラグインを使ったコード補完機能について解説します。このプラグインを使ってNeovimの挿入モードで入力を始めると、コード補完機能で様々な種類の候補を表示してくれるようになります。

補完プラグインのインストールと設定

まずはnvim-cmpと関連プラグインをインストールします。

~/.config/nvim/lua/user/plugins.lua

return packer.startup(function(use)
use "hrsh7th/nvim-cmp"
use "hrsh7th/cmp-buffer"
use "hrsh7th/cmp-path"
use "hrsh7th/cmp-cmdline"
use "saadparwaiz1/cmp_luasnip"
end)

“hrsh7th/nvim-cmp”がコード補完のベースプラグインで、バッファ補完など個別の機能は別プラグインとしてそれぞれインストールします。

それぞれのプラグインの設定は~/.config/nvim/lua/user/cmp.luaにて行い、~/.config/nvim/init.luaで読み込むようにします。

~/.config/nvim/init.lua

require "user.cmp"

nvim-cmpなどそれぞれのプラグインのREADMEに出ている設定をそのままcmp.luaにコピペでも良いですし、変更したい場合はそれを基にして設定を追加するのが良いでしょう。

各補完プラグインの機能

インストールしたそれぞれの補完プラグインの機能は以下の通りです。

バッファ補完

“hrsh7th/cmp-buffer”はバッファ補完用のモジュールで、Neovimのバッファ(開いている個別ファイル)に含まれる文字列の入力補完をしてくれます。個別ファイルごとに適用されるので、例えば1度に2つのファイル(2つのバファー)を開いていても、入力候補に表示されるのは現在選択しているバファーに含まれる内容のみです。

バッファ補完は、例えばクラスファイルを開いていて、そのなかで定義されているメソッドや変数を使いたいときに重宝します。

余談ですが、vim/neovimではバッファ補完は標準装備されており、プラグインをインストールしなくても挿入モードでCtrl+nを押すと候補が表示されます。ではなぜわざわざプラグインをインストールするのかと言うと、nvim_cmpの補完候補リストにファイルパスなどの他のソースと一緒に表示したいので使用します。

ファイルパス補完

“hrsh7th/cmp-path”はファイルシステム・パスの補完モジュールです。例えば、挿入モードで”./”を入力すると、現在のディレクトリ内のファイルやディレクトリが候補として表示されます。なお、ただファイル名を入力しただけでは現在のディレクトリ内のファイルは表示されませんので、注意が必要です。

もしディレクトリを選択した場合は、’/’と追加入力するとさらに子ディレクトリ内のファイルやディレクトリ名が補完されるので便利です。

なお、vim/neovimではバッファー補完と同じくファイルパス補完も標準装備されており、プラグインをインストールしなくても挿入モードでCtrl+x, Ctrl+fを押すと現在のディレクトリー内のファイル名候補が表示されます。

コマンドライン補完

“hrsh7th/cmp-cmdline”はコマンドモードでの補完モジュールで、インストールするとコマンドモードでも補完候補が表示されるようになります。このモジュールには2つの利用方法があり、一つはコマンドモードでの文字列検索に前述のバッファー補完を使う方法、もう一つはコマンドモードでのファイル名入力に前述のファイルパス補完を使う方法です。

~/.config/nvim/lua/user/cmp.lua

-- `/` cmdline setup.
cmp.setup.cmdline('/', {
mapping = cmp.mapping.preset.cmdline(),
sources = {
{ name = 'buffer' }
}
})

-- `:` cmdline setup.
cmp.setup.cmdline(':', {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({
{ name = 'path' }
}, {
{
name = 'cmdline',
option = {
ignore_cmds = { 'Man', '!' }
}
}
})
})

これで、コマンドモードで”/”を使った検索にバッファ内の文字列が、”:”を使ったコマンドでファイルパス候補が表示されるようになります。これは、例えば”:sp”でスプリットバッファを使う時に便利です。

コードスニペット補完

“saadparwaiz1/cmp_luasnip”はluaのコードスニペット(テンプレート)候補を表示します。例えば、”fu”とタイプすると、functionのスニペットが表示されます。Neovimの設定をする時はluaで記述するので、インストールしておくと便利です。

ここで紹介したベーシックなプラグインだけでもコーディングが相当快適になりますが、それ以外にも様々なコード補完プラグインがありますので、興味があればぜひご自身で探してみてください。