❄️

Nixで初める快適Vim環境構築2022

2022/12/15に公開

はじめに

本記事は広島大学 HiCoder & ゲーム制作同好会GSD Advent Calendar 2022の15日目の記事になります。OB枠で参加です。

2022年は業務でもVimをメインエディタとして使うことになる記念すべき年となりました。
それを支えるNixについて、簡単な用途を紹介しながらVimのミニマルな環境構築を作っていきます。

ざっくり紹介

Neovim

言わずと知れた至高のエディタ。今回はこちらを利用します。

Nix

今回の主役となるパッケージマネージャです。これを利用するLinuxディストリビューションにNixOSがあります。Nix(パッケージマネージャ)ではNix(言語)を利用して宣言的に環境を定義します。LinuxとMacOSで動作し、パッケージマネージャと表現していいか悩むほど様々な事が上手くできます。最近の○○ as Codeの流行りに乗って急速に普及しています(自分の観測範囲)。
環境構築においては環境の全てをNixで管理する必要はありません。徐々に自分の環境にNixを導入していくことも可能です。手始めにzshだけNixで管理するといった入門の仕方もいいかと思います。
Nixを利用することでvimプラグインのバージョンはもちろん、vimのバージョン、プラグインが依存するCLIツールの全てのバージョンを管理する事ができます。そのためプライベートな開発機と業務環境をNixで管理しておくと、業務中にバージョンの差異に起因するVimの不具合を回避できます。業務環境にVimを簡単に導入できたのもNixの支援によるものと思っています。
昨今、利用ユーザが増えたのもあってかNixでNix以外の(不純な)パッケージマネージャの導入も簡単になりました。Nixは最初のパッケージマネージャの導入に利用し、あとはそれを利用するといった使い方も可能ではあるので自分に合った使い方を模索すると良いかと思います。
今回はdotfiles的な環境構築について振れていますが、プロジェクト単位でdevcontainerのような環境構築にも利用が可能です。NeovimでもNixを利用した環境構築方法は採用されており (flake.nix)、Nixユーザであれば1ステップで確定した環境を手元に構築できます。過去にLTで紹介しているのでスライドでざっと雰囲気が掴めるかもしれません。Nixの記法についてはNix-1pでざっくり把握するのがオススメです。
現状、柔軟性と確実性で評価したときにNixを越える技術を知りません。

home-manager

Nixを利用して所謂dotfilesを定義するシステムになります。home-managerもNixで管理します。

nix-darwin

今回は利用しません。筆者は普段MacOSを利用しているのでこちらとhome-managerを組み併せて環境を管理しています。
記事の中では利用はしないもののnix-darwinの環境構築手順に寄せた構成になっています。nix-darwinを導入する際も同じような手順になります。

rokka-nvim

home-managerでneovimの管理を楽にするために開発した自作プラグインマネージャです。
NixでVimの設定を行なうプロジェクトだと他にnixvimなどがあります。
nixvimとは異なりrokka-nvimは基本的な設定はluaで行なうことを想定しています。packer.nvimを利用していたので、それに似た使用感を意識しています。ニッチ過ぎるのであまり触れません。

環境

Windows 11 Pro (22H2) 上の Ubuntu 20.04 LTS (WSL)。0から初めます。

環境構築

Nixの導入

公式のDownload の手順に従います。

# for Windows (WSL2)
$ sh <(curl -L https://nixos.org/nix/install) --no-daemon

# 導入できたか確認
$ nix --version
nix (Nix) 2.12.0

home-managerの導入

導入方法はいくつかありますがNix 2.4から追加されたflakesを利用してhome-managerの管理を行なうことにします。

参考 → Chapter 3. Nix Flakes

flakeを利用するため定義ファイルはGitで管理する必要があります。(最終的なリポジトリ → vim-nix-hicoder-2022)
初回セットアップに限り環境を構築するための環境が無いのが辛いですが、手順に従って flake.nixhome.nix を作成します。
wslSample となっている箇所はお好きな名前に変更して大丈夫です。(ソースコード・コマンドの両方で適宜読み変えて下さい)

# dotfilesを管理するリポジトリの作成
$ mkdir vim-nix-hicoder-2022
$ cd vim-nix-hicoder-2022
$ git init
# お好きなエディタで定義ファイルを作成
$ vim flake.nix
$ emacs home.nix
# flakesでは git で untrack なものを扱えません
# untrack で無ければ modified のままでも問題ありません
$ git add .

# 記入内容の確認 (↓ のような表示になれば入力内容は合っていそうです)
$ nix --experimental-features 'nix-command flakes' flake show
warning: Git tree '/home/ttak0422/vim-nix-hicoder-2022' is dirty
warning: creating lock file '/home/ttak0422/vim-nix-hicoder-2022/flake.lock'
warning: Git tree '/home/ttak0422/vim-nix-hicoder-2022' is dirty
git+file:///home/ttak0422/vim-nix-hicoder-2022
└───homeConfigurations: unknown

# 定義した内容のビルド
$ nix build --no-link .#homeConfigurations.wslSample.activationPackage

# 成果物の実行 (初回のみ ← home-managerが利用できないため)
$ ./result/activate

# 導入できたか確認
$ home-manager --version
22.11

result ディレクトリはgitで管理する必要が無いので .gitignore に追加を忘れずに!

Neovimの導入

home-managerのモジュール定義を参考にNeovim環境を定義します。

# 変更内容を反映。(home-managerが利用できるようになっているのでこれでOK)
$ home-manager switch --flake .#wslSample

# neovimの起動
$ nvim 

設定を進める

プラグインの追加

パッケージは公式で探すのが楽です。

colorschemeのkanagawa.nvimとNixを編集するのでvim-nixを導入します。

# 変更内容を反映。
$ home-manager switch --flake .#wslSample

# neovimの起動
$ nvim

検索して出てこないプラグインの導入

Nixでは非常に多くのパッケージが初めから利用可能ですが、提供されていないパッケージを利用したいことがまれによくあります。今回はvimdoc-jaを利用できるようにしてみます。
パッケージの追加方法も直接記入する方法やnivのようなNix向けのライブラリを利用する方法、PRなど色々な方法がありますが今回はflakeで管理してみます。
今回紹介する方法は提供されているのものと異なるバージョンのパッケージを利用するときにも利用できるテクニックです。

# 変更内容を反映。
$ home-manager switch --flake .#wslSample

# neovimの起動
$ nvim 

自分は別リポジトリとしてVimで使用するほぼ全てのプラグインのバージョンをまとめて管理しています。GitHubActionでまとめて最新に更新したり、調子が悪そうであれば一部プラグインのバージョンを変更したりしています。手元の全ての環境がここで定義したバージョンのプラグインで構成されています。この方法にも満足はできていないので他にいい方法が無いか模索中です。

Nixで嬉しい箇所の紹介 (※rokka-nvimを利用したコードになっています)

最近SKKを利用するようになったのでvimでもskkeletonを利用しています。
skkeletonが依存するdenopsや利用しているskkeleton_indicator.nvimの管理はもちろんdenodictもNixで管理しています。
更に言えばskkeletonではaquaskkの補完サーバを利用しているのですがこのaquaskkもNix経由のhomebrewで管理されています。
https://github.com/ttak0422/ENV/blob/29b5d0a59ded65333233f3ebed6a5dd03fa20cba/modules/home-manager/vim/neovim.nix#L143-L171

LSP無しにVimは語れません。
一般的なプラグインマネージャではセットアップに依存した脆弱なコードに依存せざるを得ませんがNixであれば以下の様に対応できます。
https://github.com/ttak0422/ENV/blob/29b5d0a59ded65333233f3ebed6a5dd03fa20cba/modules/home-manager/vim/lsp/default.nix#L155-L181

さいごに

ここで紹介したのもNixを利用すると嬉しいことのほんの一部です。Nixを使ってよき環境構築ライフを!
最近Emacsを利用しはじめたので来年はNixを利用したEmacs環境構築について書くかもです。もちろんEmacsもNixで管理できます。(nix-doom-emacsなど)
ただ難しいものは難しいです。自分もまだ雰囲気で利用している箇所が多くあります。ですが自分のように既存の環境に徐々にNixを取り入れていくような使い方も可能なので気楽に入門するといいかと思います。

関連

Discussion