🗒️

neovim 0.11からはLSPをほぼネイティブAPIだけで扱える

2025/04/05に公開

3月26日、ついにneovim 0.11 が来ました。このリリースでは LSP関連機能が大幅に強化されました。 これで、いよいよプラグインなしで本格的に使えるようになりました。

今回はネイティブAPIだけでどこまでできるようになったのか紹介します。

追加されたLSP機能一覧

0.11 で追加されたLSP関連の機能はこちらです。

まだまだあるので、詳しくはリリースノートをご覧ください。 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