WSL 上の NixOS (NixOS-WSL) 用システム設定。デフォルトシェルは fish、 最低限のシェルツール(ripgrep, fd, bat, eza, fzf, zoxide)を導入する。
home-manager は使わず、nixos/configuration.nix 以下の system レベル設定
(environment.systemPackages, programs.*)だけで完結させている。
このリポジトリは NixOS-WSL ディストロ内の /home/<username>/dotfiles に置いて使う。
nixos— 通常ビルド。ユーザー名はebi。personal— 個人ビルド。ユーザー名はnixos。個人用ファイル (fish/env.fishのみ、nix コードは置かない)を別の private repo (dotfiles-private)で管理し、ビルド時にbuiltins.fetchGitで取得する (読み込みロジックはnixos/modules/personal.nix)。#nixosのビルドに private repo へのアクセス権は不要。
cd ~/dotfiles
sudo nixos-rebuild switch --flake .#nixos # 通常ビルド(ebi)
sudo nixos-rebuild switch --flake .#personal # 個人ビルドnixos/configuration.nix を編集して上記を実行すれば変更が反映される。
フォーマットは nixfmt(公式フォーマッタ、RFC 166)を使用。
nix fmt は *.nix を再帰的に見つけられないため、ファイルを明示的に渡す:
nix fmt -- (find . -name "*.nix" -not -path "./result/*")#personal が sudo で失敗する場合: root から private repo を
fetchGit する際、この環境では稀に ssh.exe: Invalid argument で失敗する
(原因未特定、一般ユーザー権限では成功する)。その場合は build と
activate を分けて実行する:
nixos-rebuild build --flake .#personal
sudo ./result/bin/switch-to-configuration switchflake.nix—nixos-wsl・nixpkgs・vscode-server・wslwrap-fishの input。usernameとpersonalConfigPathをspecialArgs経由で渡し、nixosConfigurations.nixos/.personalを出力する。nixos/configuration.nix— WSL 有効化・ユーザー(shell = fish)・system.stateVersionなどのトップレベル設定。各モジュールを import する。nixos/modules/personal.nix—personalConfigPath設定時のみ、private repo 内のfish/env.fishを fish 起動時にsourceする。nixos/modules/shell-tools.nix— git, ripgrep, fd, bat, eza, claude-code など汎用 CLI ツール。nixos/modules/fish.nix— fish 本体の有効化と greeting 抑制など基本設定。nixos/modules/fish-abbrs.nix—shellAbbrsの定義(gpp/d++/sss等)。nixos/modules/fish-env.nix— fish 用環境変数の定義用(現時点では未設定)。nixos/modules/fish-plugins.nix— fzf/fzf-fish・tide・zoxide・direnv の 導入とプラグイン固有の設定(キーバインド調整・tide 初期設定など)。nixos/modules/git.nix—/etc/gitconfigの宣言的設定。core.sshCommandで Windows 側ssh.exeを使う。nixos/modules/vscode-server.nix— Remote-WSL 用のservices.vscode-server。nixos/modules/wslwrap.nix— wslwrap.fish 関連の設定を まとめたモジュール。op/powershell/pwsh/cmdを常に Windows 版 exe 実行に、gitは/mnt配下で Windows 版、それ以外で Linux 版に自動 選択する。ssh/ssh-addは 1Password の SSH エージェント(named pipe) を直接使う Windows 側ssh.exe/ssh-add.exeに、clipは Windows 側clip.exeに link する。whichもwslwrap whichに alias してラッパー を解決できるようにする。codeは Remote-WSL を避けてネイティブCode.exeを直接起動する専用の fish 関数。nixos/modules/wezterm.nix— WezTerm 接続時に渡ってくるTERM=weztermを認識できるようpkgs.wezterm.terminfoを導入する。wezterm/wezterm.lua— WezTerm (Windows 側) の設定。Windows のファイル なので Nix のビルド対象外(「WezTerm の設定」参照)。autohotkey/wezterm-toggle.ahk— WezTerm 前面呼び出し/隠す AutoHotkey スクリプト(Windows 側、Nix のビルド対象外。「AutoHotkey の設定」参照)。
- Windows 側の 1Password アプリで Settings → Developer → "Use the SSH agent" を有効化する。
nixos-rebuild switch後、新しいシェルでssh.exe -T git@github.com等が 1Password 管理下の鍵で認証できることを確認する(git 操作はcore.sshCommand経由で自動的にssh.exeを使う)。
WezTerm は Windows 側で動かし、wsl_domains 経由でこの NixOS-WSL ディストロに
接続する。設定ファイル wezterm/wezterm.lua は Windows のファイルシステム
(%USERPROFILE%\.wezterm.lua)に置く必要があるため Nix では管理できず、
ファイル自体だけを git 管理して Windows 側からシンボリックリンクで読み込ませる。
PowerShell (開発者モード有効、または管理者権限で実行):
New-Item -ItemType SymbolicLink -Path $env:USERPROFILE\.wezterm.lua `
-Target \\wsl$\NixOS\home\ebi\dotfiles\wezterm\wezterm.luawsl -l -v の distro 名が NixOS と異なる場合は、上記コマンドのパスと
wezterm/wezterm.lua 内の distro 変数を実際の名前に合わせて書き換える。
WezTerm には Windows Terminal の Quake モードのような表示/非表示トグルが無く、
wezterm.lua 側のキーバインドは WezTerm フォーカス時にしか効かない(隠れている
状態からは呼び出せない)。そのため Windows 側で AutoHotkey v2 を使い、
autohotkey/wezterm-toggle.ahk でフォーカス状態に関係ないグローバルホットキー
を提供する。
Ctrl+Alt+Up… WezTerm を前面に呼び出す(最小化していれば復元)Ctrl+Alt+Down… WezTerm を最小化して背面に隠す
セットアップ:
- Windows に AutoHotkey v2 をインストールする。
autohotkey/wezterm-toggle.ahkを実行する。ログイン時に自動起動させたい 場合はスタートアップフォルダにショートカット(または PowerShell でシンボリック リンク)を作成する。
New-Item -ItemType SymbolicLink `
-Path "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\wezterm-toggle.ahk" `
-Target \\wsl$\NixOS\home\ebi\dotfiles\autohotkey\wezterm-toggle.ahk- NixOS-WSL を
wsl --import等でインストール。 - このリポジトリを
/home/ebi/dotfilesに配置(git clone、または他のディストロからtar -cf - . | wsl.exe -d <distro> -- tar -C /home/ebi/dotfiles -xf -などで転送)。 sudo nixos-rebuild switch --flake .#nixosを実行。