##概要
これまでは Neovim の LSP・Formatter 管理に mason.nvim というプラグインを使っていました。
しかし、現在は Mason を使わず、Nix で管理する構成に変更しています。
##Mason をやめた理由
Mason は、Neovim 上から LSP や Formatter、Linter などを簡単にインストールできるため、気になったツールを手軽に試せます。 導入した当初は特に不満もなく使っていました。しかし、使い続けているうちにいくつか気になる点が出てきました。
- Nix と Mason で管理が分かれていた
- インストールするツールのバージョンを lock ファイルで固定できない
- Mason 経由でのインストールに失敗することがある
- Nix とは別に Mason 側の更新作業が必要になる
1 は、どちらかと言うと自分が悪いのです。開発環境のほとんどを Nix で管理していたのに、Neovim から使う LSP や Formatter だけ Mason で管理していたことです。
同じツールであっても、利用する場所によって管理方法が分かれていました。
2 は、他の環境に移行したときに、以前と同じバージョンのツールを再現できないことです。
3 は、Mason 経由でツールをインストールするときに npmやcargo などのツールが環境に入っていないと失敗することがあります。
4 は、Nix の更新とは別に Mason 側のツールも更新する必要があり、管理の手間が増えていたことです。
これらを Nix にまとめれば、LSP や Formatter もほかの開発ツールと同じ方法で管理できます。
##Nix で管理する
Mason で管理していた LSP や Formatter、Linter は、programs.neovim.extraPackages を使って Nix からインストールするようにしました。
programs.neovim.extraPackages = with pkgs; [ lua-language-server nixd nixfmt stylua];これで、Neovim から使うツールも他のパッケージと同じように Nix で管理できます。
LSP の設定自体は Nix に移さず、Neovim 側で行っています。
vim.lsp.enable("lua_ls")vim.lsp.enable("nixd")Formatter も同様に、実行ファイルは Nix でインストールし、どのファイルタイプで何を使うかは conform.nvim 側で設定しています。
formatters_by_ft = { lua = { "stylua" }, nix = { "nixfmt" },}つまり、Nix は LSP や Formatter のインストールを担当し、Neovim はそれらをどう使うかだけを担当する構成です。
##移行してどうなったか
Mason を外したことで、Neovim から使う LSP や Formatter もほかの開発ツールと同じ Nix 環境で管理できるようになりました。
一方、Mason のように Neovim 上からすぐツールを試せる手軽さは失われます。
そのため、Nix を使っていない環境で Mason をやめる利点はあまりないと思います。
自分の場合はすでに開発環境のほとんどを Nix で管理していたため、LSP や Formatter も Nix にまとめるほうが扱いやすくなりました。