neovimのLSPクライアントを設定する簡単な方法

Heiker](https://dev.to/vonheikemen)

Heiker

2022年2月26日投稿・2023年9月20日更新

neovimで「LSP(Language Server Protocol)のサポートを追加する」という時、多くの人がこれらのプラグインを使います。

これらを組み合わせて動くようにするのは、かなりの労力が必要です。難しいわけではないんですが、労力を要し、みんながやる気になるわけではありません。

でも、もっと簡単な方法を教えます。私が作ったプラグイン(lsp-zero)を使えば、これらを簡単に統合できます。

以下が、使い始めるために必要な設定です。

local lsp_zero = require('lsp-zero')

lsp_zero.on_attach(function(client, bufnr)
  lsp_zero.default_keymaps({buffer = bufnr})
end)

require('mason').setup({})
require('mason-lspconfig').setup({
  handlers = {
    lsp_zero.default_setup,
  },
})

全画面モードを終了する

「それだけでいいの?」と思うでしょうが、そうです...でも、いくつか依存関係をインストールする必要があります。

ここからは、例の設定を全て動くようにするために必要な構成を作っていきましょう。

初心者向け

必要条件

  • Neovimの基本的な知識:ノーマルモードインサートモードコマンドモードと、それらの間を移動する方法。
  • Neovim バージョン 0.8.0以上。
  • unix系のシステムを使っているならば、git、curlまたはwget、unzip、tar、gzipが必要。
  • windows + powershellを使っているならば、git、tar、そして7zipかpeazipかarchiverかwinzipかWinRARが必要です。

これら全てが必要な理由は、言語サーバーをneovimから管理したいからです。

はじめに

まず設定ファイルinit.luaを作ります。ファイルの場所はオペレーティングシステムによって異なります。なので最初にするのはNeovimの設定フォルダの場所を調べることです。このコマンドをターミナルで実行してください。

nvim --headless -c 'echo stdpath("config")' -c 'echo ""' -c 'quit'

全画面モードを終了する

設定フォルダを作りましょう。ターミナルやファイルエクスプローラーを使って作成できます。

設定フォルダの中にinit.luaという空のファイルを作成します。

ここまでできたら、このコマンドを使ってNeovimから設定ファイルにアクセスできます。

nvim -c 'edit $MYVIMRC'

全画面モードを終了する

次にNeovimが設定を読み込めるかテストします。エディタのテーマを明るいものに変えてみましょう。init.luaファイルを開いてこれをコピーしてください。

vim.cmd.colorscheme('morning')

全画面モードを終了する

Neovimを再起動します。テーマが変わっているはずです。エラーが出た場合、Neovimのバージョンが要件を満たしていないということです。Neovimのgithubリポジトリ、リリースセクションから最新バージョンの実行ファイルを見つけることをお勧めします。

どうすればいいか?

  • Neovim v0.7を使っている場合、lsp-zeroのcompat-07ブランチをインストールできます。このチュートリアルをフォローしてください。
  • Neovim v0.6かv0.5を使っている場合、lsp-zeroのバージョンv1をインストールできます。バージョン1のチュートリアルをフォローしてください。

もしすべてうまくいっていたら、今度はもっと快適なテーマに変更しましょう。

vim.cmd.colorscheme('habamax')

全画面モードを終了する

プラグインマネージャー

注:技術的にはプラグインマネージャーは必要ありませんが、プラグインマネージャーは私たちの生活を楽にしてくれます。

lazy.nvimを使います。それは単純に人気があるからです。lazy.nvimには多くの機能がありますが、ここでは基本的な使用法を紹介します。

lazy.nvimの素晴らしい点は、luaを使ってインストール方法をドキュメントで示してくれることです。

init.luaに以下のコードを追加しましょう。

local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'

-- lazy.nvimがなければインストール
if not vim.loop.fs_stat(lazypath) then
  print('lazy.nvimをインストール中....')
  vim.fn.system({
    'git',
    'clone',
    '--filter=blob:none',
    'https://github.com/folke/lazy.nvim.git',
    '--branch=stable',
    lazypath,
  })
  print('完了。')
end

vim.opt.rtp:prepend(lazypath)

全画面モードを終了する

lazypath変数に注目してください。これはstdpath('data')関数の結果を格納していて、これによりNeovimのデータフォルダの場所を教えてくれます。これによって、オペレーティングシステムに依存せずにパスを変更する必要がなくなります。このフォルダの場所をNeovimで確認するには、次のコマンドを実行します。

:echo stdpath('data') . '/lazy/lazy.nvim'

全画面モードを終了する

lazy.nvimを使うには、lazyモジュールの.setup()関数を呼び出す必要があります。

require('lazy').setup({
  ---
  -- プラグインのリスト...
  ---
})

全画面モードを終了する

プラグインの追加

ここでlazy.nvimの使い方を学びます。簡単なプラグイン、tokyonight.nvimというNeovim用のテーマで試してみましょう。

準備ができたら、次の手順でプラグインをダウンロードしてみましょう。

  1. プラグインリストにプラグインを追加します。
require('lazy').setup({
  {'folke/tokyonight.nvim'},
})

全画面モードを終了する

githubからプラグインをダウンロードするには、ユーザ名とリポジトリ名をlazy.nvimに指定するだけで十分です。

  1. テーマを設定する行を削除します。
  2. init.luaの最後に新しいテーマを設定します。
vim.opt.termguicolors = true
vim.cmd.colorscheme('tokyonight')

全画面モードを終了する

  1. 変更を保存します。
  2. Neovimを再起動します。

Neovimを開くと,lazy.nvimのダウンロードを示すメッセージが表示されるはずです。そして,浮動ウィンドウが表示され,プラグインをダウンロードするプロセスを見ることができるはずです。最終的に,私たちがインストールしたプラグインはロードされます。

lsp-zeroの設定

ここで、lsp-zeroとその依存関係をプラグインリストに追加します。

require('lazy').setup({
  {'folke/tokyonight.nvim'},
  {'VonHeikemen/lsp-zero.nvim', branch = 'v3.x'},
  {'williamboman/mason.nvim'},
  {'williamboman/mason-lspconfig.nvim'},
  {'neovim/nvim-lspconfig'},
  {'hrsh7th/nvim-cmp'},
  {'hrsh7th/cmp-nvim-lsp'},
  {'L3MON4D3/LuaSnip'},
})

全画面モードを終了する

それから、設定コードを設定の最後に追加できます。

local lsp_zero = require('lsp-zero')

lsp_zero.on_attach(function(client, bufnr)
  lsp_zero.default_keymaps({buffer = bufnr})
end)

require('mason').setup({})
require('mason-lspconfig').setup({
  handlers = {
    lsp_zero.default_setup,
  },
})

全画面モードを終了する

変更を保存し、Neovimを再起動して、プラグインのダウンロードが完了するのを待ちます。

LSPサーバのインストール

Lua用のLSPサーバで試してみましょう。

Neovimでinit.luaファイルを開き、:LspInstallコマンドを実行します。mason-lspconfig.nvimプラグインがサーバのリストを提示します。Neovimはこのようなメッセージを表示するはずです。

"lua"のファイルタイプにインストールしたいサーバを選択してください:
1: lua_ls
番号を入力し、<Enter>を押すかマウスでクリックしてください(qまたは空欄はキャンセル):

全画面モードを終了する

現時点ではlua_lsが1つだけのオプションです。1を押してEnterキーで確定します。浮動ウィンドウが表示されます。サーバのダウンロードが終わると、メッセージが出ます。

現在のLSPサーバはインストール後に自動的に起動できません。Neovimを再起動する必要があります。サーバがコード解析を始めると、グローバル変数vimの警告に気がつくはずです。それは全てがうまく行っていることを意味します。

プロジェクトのルートをlua_lsに認識させるためには、.luarc.jsonというファイルをNeovimの設定フォルダに作成する必要があります。このファイルは空でも構いません。存在するだけで十分です。

必要なら、.nvim_lua_ls()関数を使って、Neovim用にlua_lsを特別に設定することができます。

require('mason-lspconfig').setup({
  handlers = {
    lsp_zero.default_setup,
    lua_ls = function()
      local lua_opts = lsp_zero.nvim_lua_ls()
      require('lspconfig').lua_ls.setup(lua_opts)
    end,
  },
})

全画面モードを終了する

これで準備は完了です。Neovimを再起動してinit.luaを開くと、設定のサポートがわずかに改善されます。

完成例

local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'

-- lazy.nvimがなければインストール
if not vim.loop.fs_stat(lazypath) then
  print('lazy.nvimをインストール中....')
  vim.fn.system({
    'git',
    'clone',
    '--filter=blob:none',
    'https://github.com/folke/lazy.nvim.git',
    '--branch=stable',
    lazypath,
  })
  print('完了。')
end

vim.opt.rtp:prepend(lazypath)

require('lazy').setup({
  {'folke/tokyonight.nvim'},
  {'VonHeikemen/lsp-zero.nvim', branch = 'v3.x'},
  {'williamboman/mason.nvim'},
  {'williamboman/mason-lspconfig.nvim'},
  {'neovim/nvim-lspconfig'},
  {'hrsh7th/nvim-cmp'},
  {'hrsh7th/cmp-nvim-lsp'},
  {'L3MON4D3/LuaSnip'},
})

-- テーマを設定
vim.opt.termguicolors = true
vim.cmd.colorscheme('tokyonight')

-- LSPの設定
local lsp_zero = require('lsp-zero')

lsp_zero.on_attach(function(client, bufnr)
  lsp_zero.default_keymaps({buffer = bufnr})
end)

require('mason').setup({})
require('mason-lspconfig').setup({
  handlers = {
    lsp_zero.default_setup,
    lua_ls = function()
      local lua_opts = lsp_zero.nvim_lua_ls()
      require('lspconfig').lua_ls.setup(lua_opts)
    end,
  },
})

全画面モードを終了する

今後について

lsp-zeroのgithubリポジトリを訪れてください。ドキュメントを読むか、:help lsp-zeroコマンドを使ってください。

lsp-zeroが作成するキーバインディングについても学んでください:

また、mason.nvimのドキュメントも確認してみてください。

lsp-zeroについて質問があれば、こちらでも、githubのディスカッションセクションでも、またはmatrixで[#lsp-zero-nvim:matrix.org](https://

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/vonheikemen/configurando-el-cliente-lsp-nativo-de-neovim-en-2022-la-manera-facil-3c17