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
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
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
590
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
Oxcを導入して開発体験が向上した話
yug1224
4
320
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
AIで効率化できた業務・日常
ochtum
0
140
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.6k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.3k
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.1k
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
350
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
710
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
Prompt Engineering for Job Search
mfonobong
0
350
YesSQL, Process and Tooling at Scale
rocio
174
15k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
330
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
Accessibility Awareness
sabderemane
1
140
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
630
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は実装できませんでした。今後に期待