🚗

忙しい人向け nvim-lspconfigのnvim v0.11対応

に公開

はじめに

Neovim v0.11でLSP周りに大きな変更が加わりました。

  • runtimepath内のlspフォルダにLanguage Serverの設定ファイルを置けるようになった
  • vim.lsp.configで設定を上書きできるようになった
  • vim.lsp.enableでLanguage Serverを有効化できるようになった

これまではnvim-lspconfigの各Language Serverのsetup関数で実現していましたが、Neovim本体の機能で設定と有効化が可能になりました。
さらに、nvim-lspconfigはsetup関数の更新を凍結したため、いずれ新方式で書き換える必要があります。

急いでいない方は以下の記事を参考に設定してください。

https://zenn.dev/kawarimidoll/articles/b202e546bca344

急いで書き換える

共通の設定を書き換える

全てのLanguage Serverに共通の設定は以下のように記載できます。

vim.lsp.config('*', {
  -- 共通設定
})

nvim-cmpのcapabilitiesを設定する場合は以下のように記載します。

vim.lsp.config('*', {
  capabilities = require('cmp_nvim_lsp').default_capabilities(),
})

これで各Language Serverのsetupでcapabilitiesを設定する必要がなくなりました。

各Language Serverの設定を書き換える

以下のようなsetupを書き換えます。
language_server_nameの部分はlua_lsrust_analyzerなどに適宜読み替えてください。

init.lua
require('lspconfig').language_server_name.setup {
  settings = {
    awesome_setting = 'awesome',
  },
}

setup関数の引数を返却するファイルを作成します。場所は.config/nvim/after/lsp/language_server_name.luaです。

.config/nvim/after/lsp/language_server_name.lua
---@type vim.lsp.Config
return {
  settings = {
    awesome_setting = 'awesome',
  },
}

忘れずにvim.lsp.enableを実行してください。

init.lua
vim.lsp.enable('language_server_name')

mason-lspconfigのsetup_handlersで有効化していたLanguage Serverの書き換え(2025年5月7日更新)

mason-lspconfigのv2.0.0ではsetup_handlersが廃止されました。
その代わり、MasonでインストールしたLanguage Serverが自動的に有効化されるようになりました。
そのため、設定部分だけをこれまでの内容に従って書き換えれば動作します。

有効化の詳細については以下をご確認ください(この記事の更新時点でのリンクです。必要に応じて最新版をご確認ください)。

https://github.com/mason-org/mason-lspconfig.nvim/blob/d39a75bbce4b8aad5d627191ea915179c77c100f/README.md#automatically-enable-installed-servers

mason-lspconfig v1の場合(更新前の内容)。

mason-lspconfigのsetup_handlers関数で設定していた場合、設定部分はこれまでの記載内容で書き換えることが可能です。
あとは有効化ができれば書き換え完了です。

vim.lsp.enableはtableを受け取ることができるため、以下を追記してください。

init.lua
vim.lsp.enable(require('mason-lspconfig').get_installed_servers())

lazydev.nvimを使っているけど移行しても大丈夫か

大丈夫。

nodeとdenoを自動で切り分けて起動したい

冒頭で紹介したkawarimidollさんの記事を参考に、自動で切り分けてください。
もしくは.nvim.luaでプロジェクトごとに設定するのも良いでしょう。
.nvim.luaについては:h exrcでヘルプを参照してください。

Neovim v0.11.1の場合(2025年4月28日追記)

Neovim v0.11.1からworkspace_requiredという項目が追加されました。
workspace_requiredを使用することで、package.jsondeno.jsonが存在する場合のみ起動するように設定でき、自動的な切り分けが可能になります。

.config/nvim/after/lsp/ts_ls.lua
---@type vim.lsp.Config
return {
  root_markers = {
    'package.json',
  },
  workspace_required = true,
}
.config/nvim/after/lsp/deno.lua
---@type vim.lsp.Config
return {
  root_markers = {
    'deno.json',
    'deno.jsonc',
    'deps.ts',
  },
  workspace_required = true,
}

おわり

書き換える前は新しく何かができるわけでもないので非常に億劫でした。
しかし、これまで密結合だったLSP関連のリポジトリの役割が明確になり、素晴らしい変更だと感じています。

  • Neovim本体でプラグインなしでもLSPサポート
  • lspconfigは各種Language Serverの共通設定(実行ファイル名やファイルタイプなど)
  • masonはLanguage Serverなどのツールをインストールしてパスを通す
  • mason-language-serverはmasonでインストールするLanguage Serverのためのツール群

新たな入門記事が待たれます。

GitHubで編集を提案

Discussion