はじめに
今年の3月にNeovimがv0.11にアップデートされていたようなのですが、
その内容がNeovim界隈で話題になっているようです。
私は普段Neovimを使っているのですが、全然知らなかったし調べてみたら確かにアツいアプデだったので、今更ですが内容を紹介しようと思います
1. LSPの設定がビルトインに
これが一番アツい内容です
まずは具体的な実装を元に、アプデ前後でどう変わったのか見てみましょう。
従来では
従来(v0.10以前)では、LSPの設定は以下の3つのプラグインを使って設定するのがデファクトスタンダートとなっていました。
-
nvim-lspconfig
LSPに対する設定を簡略化してくれるプラグイン -
mason
LSPのインストール・アップデートを行うLSPマネージャ -
mason-lspconfig
masonで管理しているLSPにnvim-lspconfigで設定した内容を渡すためのプラグイン
これらを使った従来のLSPの設定方法は以下のようになります。
local mason = require("mason")
local mason_lspconfig = require("mason-lspconfig")
-- こんな感じでインストールしたいLSPをベタガキする
local lsp_list = {
"pyright",
}
mason.setup()
mason_lspconfig.setup({
ensure_installed = lsp_list,
})
local lspconfig = require("lspconfig")
mason_lspconfig.setup_handlers({
-- mason-lspconfigを使って全てのLSPを一括でsetup
function(server_name)
lspconfig[server_name].setup({})
end,
-- 個別LSPに設定が必要な場合はnvim-lspconfigを使って設定
["pyright"] = function()
lspconfig.pyright.setup({
settings = {
python = {
pythonPath = ".venv/bin/python",
analysis = {
typeCheckingMode = "basic",
autoSearchPaths = true,
useLibraryCodeForTypes = true,
diagnosticMode = "openFilesOnly",
},
},
},
})
end,
})
v0.11では
v0.11だとこうなります
local mason = require("mason")
local mason_lspconfig = require("mason-lspconfig")
local lsp_list = {
"pyright",
}
mason.setup()
mason_lspconfig.setup({
ensure_installed = lsp_list,
})
- local lspconfig = require("lspconfig")
-
- mason_lspconfig.setup_handlers({
- -- mason-lspconfigを使って全てのLSPを一括でsetup
- function(server_name)
- lspconfig[server_name].setup({})
- end,
- -- 個別LSPに設定が必要な場合はnvim-lspconfigを使って設定
- ["pyright"] = function()
- lspconfig.pyright.setup({
- settings = {
- python = {
- pythonPath = ".venv/bin/python",
- analysis = {
- typeCheckingMode = "basic",
- autoSearchPaths = true,
- useLibraryCodeForTypes = true,
- diagnosticMode = "openFilesOnly",
- },
- },
- },
- })
- end,
- })
+ vim.lsp.config("*", {})
+ vim.lsp.enable(lsp_list)
何が起こったというのでしょうか。
24行あった箇所が、たったの2行になっています
v0.11では以下のような内容のアップデートが入りました。
-
vim.lsp.config()
とvim.lsp.enable()
によって、プラグインを経由せずにLSPを簡単に構成・有効化できるようになった -
{neovimのruntimepath}/lsp/*.lua
に個別LSP用の設定ファイルを置き、vim.lsp.enable({'pyright', ...})
のように呼ぶだけで設定できるようになった
先ほどの実装では、vim.lsp.config("*", {})
によって全てのLSP(*
)に対して設定を済ませています。
そしてvim.lsp.enable(lsp_list)
でLSPを有効化しているというわけです。
あれ、元々あったpyrightの個別設定はどこに行ったの?
はい、ちゃんとあります。
- {neovimのruntimepath}/lsp/pyright.lua
return {
settings = {
python = {
pythonPath = ".venv/bin/python",
analysis = {
typeCheckingMode = "basic",
autoSearchPaths = true,
useLibraryCodeForTypes = true,
diagnosticMode = "openFilesOnly",
},
},
},
}
{neovimのruntimepath}
については以下コマンドで確認できます。
:lua print(vim.inspect(vim.api.nvim_list_runtime_paths()))
一般的には、luaでconfig管理されている方は~/.config/nvim
になるかと思います。
各LSPの設定ファイルを{neovimのruntimepath}/lsp/*.lua
に配置しておくだけで、勝手に設定を反映してくれます!
これにより、設定をベタガキしなくてよくなったので色々楽になりました!
結果的に、従来と比べてかなり記載がすっきりしたかと思います!
v0.11以降もnvim-lspconfigを使い続けるべきか?
結論、私はビルトインのvim.lsp.config
に完全に乗り換えました。
今回例に出したpyright以外にも諸々LSP入れていますが、今の所支障は出ていません。(fidgetの表示が減った気がする。。)
ただ、元々nvim-lspconfigでcapability周りの細かい設定をされていた方は、互換性の問題がもしかしたら発生するかもしれないですね。
とりあえず移行してみて様子見するのが良いかと思います。
2. 自動補完がビルトインに
LSPの設定と併せて、自動補完もビルトインになりました!
公式のコードスニペットを丸々コピペして動かしてみました。
元々入れていた自動補完系のプラグインは切っています。
vim.api.nvim_create_autocmd("LspAttach", {
callback = function(ev)
local client = vim.lsp.get_client_by_id(ev.data.client_id)
if client:supports_method("textDocument/completion") then
vim.lsp.completion.enable(true, client.id, ev.buf, { autotrigger = true })
end
end,
})
確かに自動補完効いていますね!
dictのmethodの一覧が表示されています。
ただ、自動補完については元々使っていたnvim-cmpの方が使い勝手良いので私は移行しないことにしました!
ビルトインの方も設定によってはもっといい感じになるのかもしれないです。(有識者求)
3. ホバーの改良
ホバーウィンドウに Markdown の Tree‑sitter ハイライトが適用されるようになり、コードブロックもシンタックスハイライトされるようになりました!
docstringの中にmarkdownのコードブロックを埋め込んでみたのですが、ちゃんとハイライトされてますね!
ちなみに、もう一点ホバーに関して以下の変更があったのですが、私の設定方法が悪いのかうまく動きませんでした。。
- ウィンドウ枠のスタイル指定が可能に
-
vim.o.winborder = 'rounded'
のようにオプションで指定可能
-
最後に
今回紹介した以外にも細々とした内容のアップデートがあったのですが、LSP周りをビルトインで強化してくれてるのは確かにアツいな〜と思いました。
neovimのLSP周りは入門者には複雑すぎて敷居を上げる要因にもなっていると感じていたので、この辺りが仕様としてスッキリできたのは延いてはNeovimの普及にも一役買ってくれるのではないでしょうか。
では、良いVimライフを!