Neovim luaのlsとしてemmyluaを使ってみる
この記事はVim駅伝の2025-09-12の記事です。
前回の記事はthincaさんのMeguro.vim #31 を開催しましたです。
Vim駅伝は常に参加者を募集しています。詳しくはこちらのページをご覧ください。
Neovimのlua用language serverといえばlua-language-serverが(たぶん)定番です↓
が、さいきんemmylua_lsがHomebrewに追加されたことで俄に気になりはじめました↓
emmylua-analyzerには、language serverを起動するemmylua_lsだけでなくemmylua_checkというコマンドも用意されており、エディタとcliでのチェックを共通化できるのがポイントです。
cliコマンドがあったほうがAIエージェントに「ここの問題を修正して」と指示しやすくなるんじゃないかなと思い導入してみました。
設定
筆者の既存のlua-lsの設定は以下に書いたような感じです。
これをemmyluaに移行します。すでにlspconfigにはemmyluaの設定ファイルが存在するので、これを利用します。
前掲の記事のとおり、Neovim >= 0.11であれば、lspconfigを読み込んでemmylua_lsをenableするだけで起動設定は完了です。
-- lspconfigの読み込みはプラグインマージャによって異なる
add('neovim/nvim-lspconfig')
-- lua_lsから移行
-vim.lsp.enable('lua_ls')
+vim.lsp.enable('emmylua_ls')
これだけだとNeovimや各プラグイン独自のオブジェクトでエラーが出まくるので、それらへの参照を追加します。
Neovimのlsp設定の方にはworkspace_required
のみを設定しています。
return {
workspace_required = true,
}
細かい設定はここ↑には書かず、.emmyrc.json
に記述します。これにより、cliのemmylua_checkのほうでも設定を使えます。
なお、以下は記事での解説のためにコメントをつけていますが、emmyluaは現時点ではjsoncに対応していないため、実際の設定からはコメントを除いてください。
{
"runtime": {
"version": "LuaJIT"
},
"workspace": {
"checkThirdParty": false,
"library": [
// 自分のnvim設定
"$HOME/.config/nvim/lua",
// $VIMRUNTIMEの中身
"$HOME/.nix-profile/share/nvim/runtime",
// プラグインのインストール先
// プラグインマネージャにより異なるため個人の環境に合わせて変更する
// mini.nvimの場合はstart/とopt/に分かれているのでこう書いている
"$HOME/.local/share/nvim/site/pack/deps/start/mini.nvim",
"$HOME/.local/share/nvim/site/pack/deps/opt"
],
"ignoreGlobs": [
// 筆者が個人的に作っている、もう使わなくなったluaファイル置き場
"**/deprecated/**/*.lua",
// プラグインのテストファイル等
"**/*_spec.lua"
]
}
}
以下のredditを参考にしました。
neovimのlsp設定のみにする場合
.emmyrc.json
を設けず、neovimのlsp設定のみにする場合、workspace.library
に現在のruntimepathを渡す必要があります。
これはlspconfigのlua_lsの設定例が参考になります。
こんな感じで設定すると良いと思います。
return {
on_init = function(client)
client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, {
workspace = { library = vim.api.nvim_get_runtime_file('', true) },
})
end,
settings = {
Lua = {
runtime = { version = 'LuaJIT' },
workspace = { checkThirdParty = false },
},
},
workspace_required = true,
}
所感
lua-language-serverよりはプラグインの型の読み込み等が速くなった印象です。型の警告がより厳しく(?)出るようになったので、一部は@diagnostic disable
をつけて黙らせました。設定項目がオプショナルなのを正しく定義できていないプラグインが結構あるのかなと思いました。
また、型などの拡張記法は、lua-language-serverと少し挙動が異なる部分があります。lua-language-serverでは、以下の2つ文字列型のエイリアスが同じように解釈されるようです。
---@alias modes "r" | "w"
---@alias modes '"r"' | '"w"'
が、emmylua_lsだと別の型に(前者は普通の文字列として、後者は「クォーテーションを含む文字列」として)解釈されます。見た目が違うのでemmylua_lsの解釈のほうが正しく感じられますが。
とりあえず、動作が速めになったのは体験がよいので、しばらく使ってみようと考えています。
Discussion