neovim 0.11からはLSPをほぼネイティブAPIだけで扱える
3月26日、ついにneovim 0.11 が来ました。このリリースでは LSP関連機能が大幅に強化されました。 これで、いよいよプラグインなしで本格的に使えるようになりました。
今回はネイティブAPIだけでどこまでできるようになったのか紹介します。
追加されたLSP機能一覧
0.11 で追加されたLSP関連の機能はこちらです。
- language serverのデフォルトコンフィグを設定する (vim.lsp.config)
- language serverを自動的に起動する (vim.lsp.enable)
- LSPを利用して自動補完する (vim.lsp.completion)
- LSP関連のキーマップが追加された (DEFAULTS Mappings を参照)
まだまだあるので、詳しくはリリースノートをご覧ください。 News-0.11
これらのAPIのおかげで、language server自体のインストール以外はほぼなんでもできるようになりました。
おさらい: LSP関連プラグインたちについて
まずは0.11までほぼ必須だったLSPプラグインたちをおさらいしていきます。知っていたら次の章まで飛ばしてよいです。
- nvim-lspconfig: コンフィグ集。0.11以前はlanguage serverのセットアップも担当していた。
- mason: エディタツールを管理するパッケージマネージャーのプラグイン。language serverのインストールを担当する。linterやformatterもまとめて管理できる。
- mason-lspconfig: nvim-lspconfig の設定を利用してlanguage serverの起動、セットアップをするプラグイン。masonを介したlanguage serverの自動インストール機能もある。
0.11以前と0.11以降の書き方の違い
0.11以前でlanguage serverの自動インストールとセットアップをする設定はこのようになります。
-- パッケージマネージャー(mason)をセットアップする
require 'mason'.setup()
-- masonを介してlanguage serverを自動インストールする
local mason_lspconfig = require 'mason-lspconfig'
mason_lspconfig.setup {
automatic_installation = true,
ensure_installed = {'ts_ls', 'lua_ls'}, -- 自動でインストールしたいlanguage server
}
-- language serverの設定をする
local lspconfig = require 'lspconfig'
mason_lspconfig.setup_handlers {
function(server_name)
lspconfig[server_name].setup {}
end,
-- nvim-lspconfig の設定をカスタムしつつ使う
lua_ls = function()
lspconfig.lua_ls.setup {
settings = {
Lua = {
diagnostics = {
globals = { 'vim' }
},
}
},
}
end
}
同じことをする0.11以降の設定はこちらです。なお、nvim-lspconfigはこのPRのものを使う必要があります。
-- (同じ) パッケージマネージャー(mason)をセットアップする
require 'mason'.setup()
-- (同じ) masonを介してlanguage serverを自動インストールする
local ensure_installed = {'ts_ls', 'lua_ls'}
require 'mason-lspconfig'.setup {
automatic_installation = true,
ensure_installed = ensure_installed, -- 自動でインストールしたいlanguage server
}
-- (NEW) language serverの設定をする
vim.lsp.config('lua_ls', {
-- nvim-lspconfig が設定したコンフィグにsettingsを追加する
settings = {
Lua = {
diagnostics = {
globals = { 'vim' }
},
}
},
})
vim.lsp.enable(ensure_installed)
違うのは最後のlanguage serverを設定する部分です。nvim-lspconfigはコンフィグ集としてだけ使われるようになり、 neovimのAPIだけで設定できるようになりました。
このように、masonを使ったlanguage serverのインストール以外は ほとんどneovimのAPIだけで完結するようになりました。
LSPを使った自動補完ができるようになった
0.11では LSPを使った補完もできるようになりました。 オムニ補完(<C-x><C-o>
)だけでなく、キー入力中の補完も使えます。 autotriggerをtrueに設定するだけで出来ます。
vim.cmd[[set completeopt+=menuone,noselect,popup]]
vim.lsp.start({
name = 'ts_ls',
cmd = …,
on_attach = function(client, bufnr)
vim.lsp.completion.enable(true, client.id, bufnr, {
autotrigger = true, -- 自動補完を有効にする
convert = function(item)
return { abbr = item.label:gsub('%b()', '') }
end,
})
end,
})
参考: Lua module: vim.lsp.completion
autotriggerを有効にすると、挿入モード中にLSPを使った補完が出てきます。
結構ちゃんと動くので、補完系プラグインも無くしてもよいかもしれません。
まとめ: ほぼプラグインなしでLSPを使う準備が整った
0.11で入った機能により、実に様々なことができるようになりました。
- language serverのコンフィグを設定する
- language serverを自動的に起動させる
- LSPを使った自動補完を使う
language serverのインストールには対応してないので、まだmasonはあったほうが便利です。しかし、nvim-lspconfigはほぼコンフィグ集として使えるようになりました。かなり嬉しいですね。
不要になったプラグインも増えたので、この機会にdotfilesを見直してみてはいかがでしょうか。
Discussion