本文へスキップ
🧩

NeovimのLSP・Formatter管理でMasonを使うのをやめた

#

Neovim

#

Nix

NeovimでLSP・Formatter・Linterの管理を行っていたmason.nvimというプラグインからNixでの管理に移行した。

##概要

これまでは Neovim の LSP・Formatter 管理に mason.nvim というプラグインを使っていました。 しかし、現在は Mason を使わず、Nix で管理する構成に変更しています。 

##Mason をやめた理由

Mason は、Neovim 上から LSP や Formatter、Linter などを簡単にインストールできるため、気になったツールを手軽に試せます。 導入した当初は特に不満もなく使っていました。しかし、使い続けているうちにいくつか気になる点が出てきました。

  1. Nix と Mason で管理が分かれていた
  2. インストールするツールのバージョンを lock ファイルで固定できない
  3. Mason 経由でのインストールに失敗することがある
  4. Nix とは別に Mason 側の更新作業が必要になる

1 は、どちらかと言うと自分が悪いのです。開発環境のほとんどを Nix で管理していたのに、Neovim から使う LSP や Formatter だけ Mason で管理していたことです。
同じツールであっても、利用する場所によって管理方法が分かれていました。
2 は、他の環境に移行したときに、以前と同じバージョンのツールを再現できないことです。
3 は、Mason 経由でツールをインストールするときに npmcargo などのツールが環境に入っていないと失敗することがあります。
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 にまとめるほうが扱いやすくなりました。

Discussion