🌟

Neovim luaのlsとしてemmyluaを使ってみる

に公開

Neovimのlua用language serverといえばlua-language-serverが(たぶん)定番です↓

https://github.com/luals/lua-language-server

が、さいきんemmylua_lsがHomebrewに追加されたことで俄に気になりはじめました↓

https://github.com/EmmyLuaLs/emmylua-analyzer-rust

emmylua-analyzerには、language serverを起動するemmylua_lsだけでなくemmylua_checkというコマンドも用意されており、エディタとcliでのチェックを共通化できるのがポイントです。
cliコマンドがあったほうがAIエージェントに「ここ修正して」と指示しやすくなるんじゃないかなと思い導入してみました。

設定

筆者の既存のlua-lsの設定は以下に書いたような感じです。

https://zenn.dev/kawarimidoll/books/6064bf6f193b51/viewer/14edd4

https://zenn.dev/kawarimidoll/books/6064bf6f193b51/viewer/c185e3

https://zenn.dev/kawarimidoll/books/6064bf6f193b51/viewer/018161

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

これをemmyluaに移行します。すでにlspconfigにはemmyluaの設定ファイルが存在するので、これを利用します。

https://github.com/neovim/nvim-lspconfig/blob/030a72f0aa4d56f9e8ff67921e6e3ffd0e97bf07/lsp/emmylua_ls.lua

前掲の記事のとおり、Neovim >= 0.11であれば、lspconfigを読み込んでemmylua_lsをenableするだけで起動設定は完了です。

.config/nvim/init.lua
 -- lspconfigの読み込みはプラグインマージャによって異なる
 add('neovim/nvim-lspconfig')

 -- lua_lsから移行
-vim.lsp.enable('lua_ls')
+vim.lsp.enable('emmylua_ls')

Neovimのlsp設定の方にはworkspace_requiredのみを設定しています。

.config/nvim/after/lsp/emmylua_ls.lua
return {
  workspace_required = true,
}

で、細かい設定はここ↑には書かず、.emmyrc.jsonに記述します。これにより、cliのemmylua_checkのほうでも設定を使えます。
なお、以下は記事での解説のためにコメントをつけていますが、emmyluaは現時点ではjsoncに対応していないため、実際の設定からはコメントを除いてください。

.config/nvim/.emmyrc.json
{
  "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を参考にしました。

https://www.reddit.com/r/neovim/comments/1mdtr4g/emmylua_ls_is_supersnappy/

所感

lua-language-serverよりはプラグインの型の読み込み等が速くなった印象です。型の警告がより厳しく(?)出るようになったので、一部は@diagnostic disableをつけて黙らせました。設定項目がオプショナルなのを正しく定義できていないプラグインが結構あるのかなと思いました。
動作が速めになったのは体験がよいので、しばらく使ってみようと考えています。

Discussion