Nix Home-ManagerでNeovimの環境構築
筆者について
2024年9月初めからHome-Managerを使いはじめ、9月半ばくらいからNixOSを使いはじめました。
vim-jp slackでは#tech-nixチャンネルがあり、日本語情報が多く交換されています。
私もvim-jp slackのほうで情報収集、質問をしました。
Nixの日本語情報が多いのでぜひ参加をすすめます。
NixでNeovimの環境構築をするメリット
- ビルド済みバイナリが手に入る。
Nixを使うと、ビルド済みのバイナリパッケージを直接取得できるため、手動でのビルド作業を省略できます。
例えば、telescope-fzf-native.nvimを導入する際、通常はビルド手順を実行しないと libfzf.so は生成されませんが、Nix経由ではあらかじめビルドされたパッケージが提供されているため、この手順をスキップすることができます。
- プラグインマネージャーによる初回の
git clone
の実行を避けて、即完成されたNeovimを使うことができる。
環境
- NVIM v0.10.2
- lazy.nvim
解説
オプションについてはHome Manager OPTION SEARCHを駆使することで楽に調べることができます。
programs.neovim.plugins
programs.neovim.pluginsに指定するとruntimepathに追加されてneovim起動時に自動的にロードしてくれるようになります。
例えば/nix/store/r9apcpdgh4zaa32iqjd3xgc5acwr0491-vim-pack-dir/pack/myNeovimPackages/start/lazy.nvim
になります。
config.lib.file.mkOutOfStoreSymlink
config.lib.file.mkOutOfStoreSymlink
を使用すると、dotfilesリポジトリにsymlinkを貼ることでNixの特性である書き込み禁止の制約を逃れることができます。
ただし、config.lib.file.mkOutOfStoreSymlink
には制約があり引数にフルパスを記述しないといけません。例: /home/alice/dotfiles-nix/home-manager/console/neovim
また、/home/alice/dotfiles-nix/home-manager/console/neovim
のような表記はconfigを使い${config.home.homeDirectory}/dotfiles-nix/home-manager/console/neovim
のように置き換えることができます。
let in間にinherit (config.lib.file) mkOutOfStoreSymlink
と記述するとmkOutOfStoreSymlink
と省略できるようになり、何度も使用する場合は便利です。
関数の定義元はこのようになっています。
plugin管理
programs.neovim.extraLuaConfigの中でpluginのパッケージを宣言しています
110行目ではskkeletonの設定にNixの置換を使いたくないので、xdg.dataFile.<name>.sourceを使いファイルリンクを貼ります。
mkEntryFromDrv
drvを引数に、もしdrvがderivationの場合は
{
name = "${lib.getName drv}"; # ハッシュとversion無しのパッケージ名
path = drv;
}
pluginsに{name = "hello"; path = pkgs.hello; }
を指定されている場合はlib.isDerivation
がfalseなためdrvをそのまま返します。
pkgs.linkFarm
次にpkgs.linkFarmを使います。
pkg.linkFarmは引数を元に複数のpluginを1つのディレクトリにまとめる役割をします。
nameに指定した値でファイルリンクが作成され、パッケージ名とpluginのリポジトリ名が異なる場合を解決することができます。
最後にlazy.nvimにnixにて作成したpluginのディレクトリを指定するために@LazyPath@を置換します。
> eza --tree /nix/store/8mvymm4m716ny8xngavdlxrcl2ghjcxm-lazy-plugins
/nix/store/8mvymm4m716ny8xngavdlxrcl2ghjcxm-lazy-plugins
├── bufferline.nvim -> /nix/store/lrz3k70kz5l755pjiyywh566aas3h9nw-vimplugin-bufferline.nvim-2024-10-24
├── cmp-buffer -> /nix/store/p9zxhc3rdsrzr3a04ppzfc579khgzsnr-vimplugin-cmp-buffer-2022-08-10
├── cmp-cmdline -> /nix/store/l7yv0drp0pf7pk2ag0fyj3lsskpa2sib-vimplugin-cmp-cmdline-2024-03-22
...
# パッケージ名とリポジトリ名が異なる場合
├── LuaSnip -> /nix/store/ra8zr3flv77rw0skhll9wpkarl1v2bid-vimplugin-lua5.1-luasnip-2.3.0-1-unstable-2024-11-03
...
後は通常通りで、luaにてpluginの設定や、neovimのオプションの設定を書くことができます。
例: ~/.config/nvim/lua/plugins, ~/.config/nvim/lua/conf
参考
おまけ
nix repl
nix repl -f '<nixpkgs>'
をshellで実行することでnix言語を実行することができます。
nix-repl> lib.isDerivation pkgs.hello
true
また、lfを使うことでflake導入後のオプション探しに役にたてることができます。
nix-repl> :lf .
nix-repl> outputs.homeConfigurations."takumi@debian-wsl".config.xdg.dataHome
"/home/takumi/.local/share"
nvfetcher
を使うことでnixpkgsに存在しないプラグインを導入することが格段に楽になります。
ここでは説明しませんが、いくつか役にたちそうなファイルを示します。
- https://github.com/s0racat/dotfiles-nix/blob/1e20cc30c2a28f65c3b0272112009cc8f43c3c3e/nvfetcher.toml
- https://github.com/s0racat/dotfiles-nix/blob/1e20cc30c2a28f65c3b0272112009cc8f43c3c3e/flake.nix#L38
- https://github.com/s0racat/dotfiles-nix/blob/1e20cc30c2a28f65c3b0272112009cc8f43c3c3e/flake.nix#L87-L90
- https://github.com/s0racat/dotfiles-nix/blob/1e20cc30c2a28f65c3b0272112009cc8f43c3c3e/home-manager/console/neovim/plugins.nix
Home-Managerによるパッケージのインストールを回避する
副作用が発生する場合があるので、Home-Managerのモジュールを読むことをおすすめします。
Discussion