Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
❄️ tmux-nixの実装を通して学ぶNixOSモジュール
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Mutsuha Asada
May 24, 2025
Programming
1k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
❄️ tmux-nixの実装を通して学ぶNixOSモジュール
Nix meetup #3 大阪
Mutsuha Asada
May 24, 2025
More Decks by Mutsuha Asada
See All by Mutsuha Asada
Reproducible Containers (ASPLOS'20)
momeemt
0
550
❄️ NixCon2025に参加した
momeemt
0
540
🔨 小さなビルドシステムを作る
momeemt
4
1.4k
情報科学類で学べる専門科目38選
momeemt
0
1.1k
Wasmで拡張できる軽量マークアップ言語 Brack
momeemt
0
680
❄️ NixOS/nixpkgsにSATySFiサポートを実装する
momeemt
2
890
Intel系FPGA上へのRISC-Vプロセッサの実装
momeemt
0
570
情報科学若手の会 2024 LT「WebAssemblyで拡張可能な軽量マークアップ言語の開発」
momeemt
0
73
Nixでつくるdotfiles
momeemt
2
1.4k
Other Decks in Programming
See All in Programming
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
150
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
170
Webフレームワークの ベンチマークについて
yusukebe
0
170
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
120
Agentic UI
manfredsteyer
PRO
0
180
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
110
Inside Stream API
skrb
1
740
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.4k
Contextとはなにか
chiroruxx
1
330
Creating Composable Callables in Contemporary C++
rollbear
0
150
スマートグラスで並列バイブコーディング
hyshu
0
160
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.4k
Featured
See All Featured
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
620
Music & Morning Musume
bryan
47
7.2k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
Everyday Curiosity
cassininazir
0
230
A Soul's Torment
seathinner
6
3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
First, design no harm
axbom
PRO
2
1.2k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
The Curse of the Amulet
leimatthew05
1
13k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Transcript
Nix meetup #3 2025.05.24 浅田睦葉 @mutsuha_asada tmux-nixの実装を通して学ぶ NixOSモジュール
🎓 所属 ・筑波大学情報学群情報科学類 B4 🐣 興味 ・コンパイラツールチェーン、LLVM、開発者体験 ・2年ほどNixOSとNixを利用している (2022/12~) ・Nix周辺への貢献
・NixOS/nix: 1 PR merged ・NixOS/nixpkgs: 36 PRs merged, 197 PRs reviewed ・NixCon2025のテーマを悩み中です 😕 自己紹介 2 @momeemt @mutsuha_asada @momee.mt https://momee.mt
概要 ・既存のtmuxでは高度なカスタマイズの際にtmux.confを書く必要がある → プラグインの設定も含めてできるだけNixに閉じたモジュールを作りたい ・具体的な実装を通じて、NixOSモジュールを学ぶことが目標です 🚩 📚 目次 1.既存のtmux向けモジュールの機能と実装 2.tmux-nixの目標
3.tmux-nixの実装 4.展望・まとめ 3
(先に) tmux-nixの紹介 4
1. 既存のtmux向けモジュールの機能と実装 5
tmuxとは① (概要) ・ターミナルマルチプレクサ(Terminal Multiplexer) ・セッション/ウィンドウ/ペインに分割することで複数のターミナルを管理できる ・単にSSH先でプロセスを維持するという目的にも使用される 6 ▲ 発表者のtmux環境 Ctrl-A
<n|p> でWindow前後を切り替えて使っている
7 tmuxとは② (ssh接続時) sshd login shell ② attach P1 ...
Pn ③ 子プロセスの作成 アクティブ ... TCP/22 PTY (slave) ① fork sshd login shell ③ closeを確認 P1 ... Pn SIGHUP 処理中のプロセスが 削除されてしまう ... ① ❌切断 PTY SIGHUP SIGHUP SIGHUP kernel SSH切断 ④ SIGHUP ② PTYをclose
8 tmuxとは③ (セッションの維持) sshd login shell ② attach tmux client
③ tmux new TCP/22 PTY (slave) ① fork ④ UNIX socket tmux server PTY #1 PTY #n ... P1 ... Pn アクティブ SSH切断 sshd login shell tmux client SIGHUP ① ❌切断 PTY tmux server PTY #1 PTY #n ... P1 ... Pn アクティブ ② PTYをclose ③ closeを確認 kernel ④ SIGHUP tmux server 👉 の子プロセスは生き残る (対話シェルでない)
・Nixはビルドを記述するためのDSL → ビルドを少し広く捉えてツールや環境をセットアップするためにも使える ・実際にNixOSやhome-managerを使ってネットワークやエディタの設定ができる ・どのように実現しているか? ・`environment.etc.<name>.text` → /etc 配下へ ・`home.file.<name>.text`
→ ユーザー空間へ ・`xdg.config.<name>.text` → XDG Base Directoryへ ・これらの属性に渡した文字列はファイルとして書き出される 9 ✏️ ツールの設定をNixで記述する
・NixOSやhome-managerはすでにtmuxをNix式で扱うための属性を提供している ・`programs.tmux` ・home-managerにおける属性一覧 10 programs.tmux ▲ 発表者のtmuxの設定の一部
・programs.tmux.baseIndex ・ウィンドウ/ペイン番号が何番から開始するかを設定できる ・デフォルトは0だが、発表者は1にしている(実世界に生きているので) ・tmux.confにおける次の設定に変換される ・`set -g base-index ${baseIndex}` ・`setw -g
pane-base-index ${baseIndex}` 11 設定できる項目の例① ▲ 時代は1-indexed
・programs.tmux.plugins ・nixpkgsのtmuxPluginsに定義されているプラグインを渡すと適用できる ・TPM (Tmux Plugin Manager) を使わなくて良い → これだけでもprograms.tmuxを使う価値がある 12
設定できる項目の例② ▲ 追加のconfigも書ける
13 (余談) pkgs.tmuxPlugins ▲ 25.05時点では53個ある
・378行なのでおそらく読みやすい ・色々あるが、let-in式の本体から読むと良い ・必要に応じて束縛を読みに行く ・optionsが「定義」 、configが「実装」に対応 ・optionsでモジュール構造を決定する ・configで設定を記述する ・まずはconfigを読んでみる 14 programs.tmuxの実装を眺める①
・lib.mkMerge ・複数の属性セットを再帰的にマージする関数 ・※ `//`は上書きする ・束縛部で`tmuxConf`を構成して xdg.configFile.”tmux/tmux.conf”.textで 設定ファイルを書き出している ・特にset系やbind系のコマンドの構成は 他に比べると読みやすいはず 15
programs.tmuxの実装を眺める②
16 programs.tmuxの概観 programs.tmux options config pkgs.tmuxPlugins programs.tmux.* を定義 必要に応じて渡す .config/tmux/tmux.conf
を生成するための構造を生成 ユーザ設定 ビルドシステム ① optionsの評価
17 programs.tmuxの概観 programs.tmux options config pkgs.tmuxPlugins programs.tmux.* を定義 必要に応じて渡す .config/tmux/tmux.conf
を生成するための構造を生成 ユーザ設定 ビルドシステム ① optionsの評価 ② configを生成
programs.tmuxの概観 programs.tmux 18 options config pkgs.tmuxPlugins programs.tmux.* を定義 必要に応じて渡す .config/tmux/tmux.conf
を生成するための構造を生成 ユーザ設定 ビルドシステム ① optionsの評価 ② configを生成 ③ ビルド tmux.conf
2. tmux-nixの目標 19
・DSLが薄い ・よく使われる設定、キーバインド以外はサポートされていない → extraConfigからtmuxコマンドを書いて渡さなければいけない ・ステータスバーやペイン間の移動、色設定、etc... ・一方でfine-grainedな設定ができない箇所もある ・たとえば、base-indexやresize-amountは個別に設定できない ・ややチグハグ気味に感じる → すでに多くのユーザが利用しているAPIに破壊的変更を加えるのは難しい
(し、大多数は個別設定よりも互換性を重視するだろう) 20 programs.tmuxへの不満①
・プラグインサポートが貧弱 ・programs.tmuxはtmuxプラグインのderivationを受け取ることができる ・しかし、起点のスクリプトを自動実行してくれるだけで 設定は各プラグインのextraConfigに任されている → たとえばtmux-yankなどはキーバインドが絡むのでNix式で書ける方が嬉しい 21 programs.tmuxへの不満②
・tmux.confレスでtmuxを設定できるNixOSモジュール ・まずは発表者のtmux.confをNix式で表現できるようにして、 それからプラグインやマイナーな設定についても対応できるようにする 22 tmux-nixの目標
3. tmux-nixの実装 23
・システム全体の設定を行うための再利用可能なコンポーネント ・/etc/nixos/configuration.nix もNixOSモジュール ・中身 ・ 「どのようなフィールドが設定できるか」 (= options) ・ 「フィールドに設定する値」
(= config) ・他のモジュール群を展開するためのimports ・つまり、普段書いているNix式と特別変わりない(はず) 24 NixOSモジュールとは①
・オプション定義 ref ・型定義に相当する ・lib.types.int.betweenなど、動的型付き言語ならではの制約もある → ここまで分かればあとは書くだけです ・本来、手続き的だったシステムを宣言的なシステムに変換するためには 「圧倒的な作業 💪」が求められることを実感できます
25 NixOSモジュールとは②
・NixOSモジュールはどうテストするか → pkgs.nixosTestを使います ・KVMが立ち上がり、 書いたモジュールをビルドできる ・nixosTest.testScriptに 仮想マシンを操作するための Pythonスクリプトを渡す → machine.suceedに渡したコマンドが
成功するかどうかを検査してくれる 26 テスト
・プラグインがサポートする変数を設定するような options・configを実装する 27 tmuxPlugins.cpuの設定を実装する
・これって本当に作業なんですよね ・人間は良い抽象を考えて、コードはLLMに書かせれば良いかもしれない → 時代に取り残されそうなのでtmux-nixはLLMベースで書いてみることにした ・先に感想を言うと、本当に面白くないです レビューが中心になる 28 (余談) Vibecodingってこのためにあったんだ‼️ 😄
・Codex(OpenAI) ・なんと実行時にネットワークアクセスをすることができない ・ビルド時にネットワークアクセスができないNixと相性が良さそうですね☺️ → 良いわけない。nix fmt, nix develop, nix flake check、全部ダメ ・Copilot Agent ・こちらは結構良いです ・Gemini 2.5 Proはほどほど。tmux-nixの実装のメインはこの子がやってます ・Claude 4 Sonnetは相当賢いです、すぐrate limitが来ますが
29 使ってみる ・反映すると.tmux.confが生成されました ▲ tmux-nixを利用している様子
4. 展望・まとめ 30
31 展望 ・tmux-nixであらゆるtmuxの設定をNix式で完結できるようにする → これは`man tmux`を全部読む、という意味です泣 ・nixosTestは現状では生成される設定ファイルを見ているだけなので挙動も見れたら良さそう ・他52種類のプラグインに対応して、tmux版のnixvimのような立ち位置を目指したい ・tmux-nix以外ですが ・LLMとNixの相性が今のところかなり悪いと思っているので効率的に作業する方法を知りたい
32 まとめ ・現在開発を行っているtmux-nixを通して、NixOSモジュール開発の概要を紹介した ・ターミナルマルチプレクサであるtmuxについて紹介した ・tmuxを起動することでsshdのログインシェルから対話環境が切り離されるため、ssh接続を切っ たとしてもプロセスが終了せず、処理を継続できる ・NixOSやhome-managerを利用することでツールやネットワークの設定を記述することができる ・home-managerではprograms.tmuxを設定することでtmux.confを生成できる ・programs.tmuxはbaseIndexなどの基本設定や、nixpkgsなどで提供されているtmuxプラグイン のderivationsを受け取ってTPMレスにプラグインを管理できる
・programs.tmuxのソースコードは定義であるoptions、設定であるconfigに分離していた ・実はこれはNixOSモジュールの基本構造で、NixOSモジュールはシステム全体の設定を行うため の再利用可能なコンポーネント ・programs.tmuxはDSLが薄く、Nix式を使ってプラグインの設定をするためのAPIが提供されてい ないので微妙。tmux-nixを作ってtmuxをNixで管理してハッピーになりたい! ・さて、残念ながら発表が始まるまでに完璧なtmux-nixは実装できませんでした。今後に期待