最近 Nix にハマっていて、普段使っているPCの環境設定を Nix w/ home-manager で(作った|作っている)ので紹介する。
https://github.com/tars0x9752/home
いわゆる dotfiles のようなものだが、文字通り dotfile の集合というわけではないため、ここでは Nix configs と呼ぶことにする。(と言いつつリポジトリ名は home としている。それはそれでシンプルで気に入っている。)
なお、以下に記載する内容はすべてこの記事の執筆時点もの。将来的に全く別の構成になったとしてもこの記事の内容は更新しない。(と思う。)
Nix との馴れ初め
Nix の存在はとある OSS の OCaml プロジェクトが使っているのを見てから知った。それから興味を持ってずっと気になっていたが、ようやく最近まとまった時間ができたのでガッツリ触ってみた、という感じ。
最初は Non-NixOS(zorin) でただのパッケージマネージャーとして触りはじめ、次に home-manager、そして home-manager にある程度なれた後に NixOS に入れ替えた。
まだまだわからないこともたくさんあるし、よく言われる "steep learning curve" に苦しんだりしつつも、今では Nix なしの生活は考えられないくらい生活の一部になっている。
Nix configs
主な構成
- NixOS/Nix (Flakes enabled)
- home-manager
- i3wm
- polybar
- rofi
- WezTerm
- bash with ble.sh
home-manager は NixOS の module としてではなく standalone で使い、home-manager と NixOS の設定は flake 内でそれぞれ別々の output としている。また、基本的には home-manager でほとんどを管理するようにしている。NixOS のシステム固有の設定のみ configuration.nix
に書いている。将来的に NixOS 以外のマシンでも使いたくなったときに使いやすいようにするため。
Nix configs を管理する上でよく使うコマンド、例えば switch とか update とかは flake の devShells と deveshell を使って nix develop
からコマンドとして叩けるようにしている。switch や update 以外にも gc とか generation の list 表示とか、あとは遊びでただ hello world 表示するだけのコマンドとかも入れてある。またそれを更にラップして make でも叩けるようにしてある。
devShells + nix develop
じゃなくてシンプルに shell の alias や関数として登録するとか、あるいは flake の apps と nix run
を使うとかもありかもしれないが、まあこの辺りはまだどうするのがベストか試行錯誤しているところ。なんだかんだ言って make のお手軽さも良いのでそのままずっと make を使っているかもしれない。
DE/WM関連
ディスプレイサーバーは無難に X で、WM は i3wm(i3-gaps) を使っている。i3 デフォルトのステータスバーなどは使わず、代わりに bar として polybar を使っている。また dmenu の代わりに rofi を menu/launcher/その他 として使っている。
polybar ではワークスペース情報やステータス的なものを表示するほか、pulseaudio のコントロールも polybar 上のモジュールでできるようにしていて、マウスホイールで音量調整、左クリックでミュートのトグル、右クリックで pavucontrol 起動、ホイールクリックで sink 切り替えなどができる。
ちなみにステータスではファイルシステムの /
の使用量を%
で常に表示するようにしている。/
と /home
はパーティションというかそもそもの物理ディスク自体を分けているが、Nix Store 的に /
が膨れやすいためすぐ見れるようにしていて、使用量が増えてきたなと思ったらガベコレするようにしている。
rofi では drun の menu の他、rofi-calc (100 YEN to 1 USD
みたいなのも処理できる、かしこい電卓)と rofi-emoji (絵文字ピッカー)、電源メニュー (再起動やログアウト、シャットダウン等)などの modi を用意し、i3 のショートカットでそれぞれ個別に呼び出せるようにしてある。
i3wm / polybar / rofi の3つについてはいわゆる Ricing 的なことにそれなりに労力かけたりもした。(そこに一番時間を使ったかもしれない)
ファイルマネージャー は CLI では ranger、GUI では Thunar を使っている。どちらもまあ使いやすいと思う。が、ファイルマネージャーを開きたいという機会が今のところそこまで多くなく、ヘビーに使っているわけではない。
ターミナル関連
ターミナルエミュレーターは WezTerm を使っている。
よく名前を聞くような Alacritty や kitty はどちらも日本語入力まわりがイマイチだったので WezTerm に流れ着いた。WezTerm は最初から問題なく日本語入力できている。
また機能も豊富なようで(と言っても自分はそんなにいろんな機能使ってない)、かつドキュメントもかなり充実していて、color scheme もデフォルトで何百種類とかなりたくさん入っているなど、個人的にはとても気に入っている。
shell は bash + ble.sh で、プロンプトには starship を使っている。
Nix では bash のインタラクティブシェルを使う場面がそこそこあるので bash を普段使いするようにした。ble.sh について Nix との相性でいうと一部 nix develop 時に若干気になるところはあるものの基本的には問題なく使えており、自動補完やシンタックスハイライトにはとてもお世話になっている。
テキストエディタ
ガッツリ何かするときは VSCode、ターミナル上で軽く編集したいだけみたいな場面は Neovim。といっても自分は vimmer ではないのでちょっとコミットメッセージ書いたりとか軽くファイルを数行編集するときに使うくらい。そしてごくたまに nano。
doom emacs や nano emacs にも手を出してみたがそこまでモチベーションが続かず VSCode と Neovim 構成に落ち着いた。
Neovim については coc だとかのプラグインやらなんやらも宣言的に管理していて一発で入るようになっている。VSCode についてはただ VSCode を入れるようにしているだけ(VSCode 内の機能で十分なため)
日本語入力
fcitx5 + mozc
を使っている。邪魔な capslock は無効化し、また inputMethod のオンオフは mac 風に henkan / muhenkan でできるようにしている。
この辺の、毎回どうやるんだっけとなりがちな、地味に面倒だけど必須で欲しい設定を何も考えずに一発で再現できるのがとてもスバラシイ。
フォント
home-manager はフォントの管理もできる。のでフォントまわりの設定も configuration.nix
ではなく home-manager に寄せている。
今明示的に入れているのはとりあえず JetBrainsMono や Noto の NerdFont と、 Source Han (源ノ角)系のフォント、それと Fira Code と Roboto Mono あたり。
font の入れ方とかも fontconfig どうやるんだっけとか毎回調べたりせずただ宣言するだけでいいので楽ちん。
GPU
NixOS を入れている laptop には Nvidia と Intel の内蔵GPUが入っており、常時接続の外部ディスプレイにつながっているポートが物理的に Nvidia の GPU 固定なため、Nvidia PRIME の sync mode で Nvidia と Intel のGPU両方を常に有効な状態にして使っている。
その他
プログラミング言語系はグローバルではあまり入れていない。その辺は nix-shell や devShell あたりでプロジェクトごとにやる方針。なので今のところ Nix congis にはほとんど入ってない。
あとはまあ普通の dotfiles 的なことをしている。shell の alias/function 定義とか cli ツールの設定ファイルの管理とか。
他になにか特筆すべきことあったかな...とりあえずはこんなところ。
感想的なもの
宣言的に管理できる & immutable って素晴らしい。
ただ、自分で derivation を書く必要が出てきた場合はどうしても手間がかかる。また、Nix の思想と相性が悪いソフトウェアもあって、(たとえばそもそもが mutable なプログラムとか、ビルド/インストール方法があんまりお行儀よくないプログラムとか)、その辺は苦労または妥協が必要になったりする。あと、やっぱり入門ハードルが高い。まだわからないことはいろいろある。
Nix Expression Language は文法自体は普通に好みだけど、動的型付けなところは好きではない(...よく知らないけどパッケージ管理という性質上そうする必要があったのかな。)
Nix が流行って対応したプロジェクトが増えたらいろいろな環境構築が楽になりそう。けど、学習ハードルの高さ的に流行ることはなさそう。
そんな感じ。
Flake はだいぶ勘どころがわかってきたので入門記事的なものを書いてもいいかもしれない。と、言いつつそもそもそんなに需要がなさそうな気もするので書かないかもしれない。
オワリ。