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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
530
❄️ NixCon2025に参加した
momeemt
0
520
🔨 小さなビルドシステムを作る
momeemt
4
1.4k
情報科学類で学べる専門科目38選
momeemt
0
1k
Wasmで拡張できる軽量マークアップ言語 Brack
momeemt
0
660
❄️ NixOS/nixpkgsにSATySFiサポートを実装する
momeemt
2
870
Intel系FPGA上へのRISC-Vプロセッサの実装
momeemt
0
550
情報科学若手の会 2024 LT「WebAssemblyで拡張可能な軽量マークアップ言語の開発」
momeemt
0
73
Nixでつくるdotfiles
momeemt
2
1.3k
Other Decks in Programming
See All in Programming
Contextとはなにか
chiroruxx
0
150
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
150
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
260
Vite+ Unified Toolchain for the Web
naokihaba
0
180
ふつうのFeature Flag実践入門
irof
7
3.6k
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
LLM Plugin for Node-REDの利用方法と開発について
404background
0
160
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
770
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
210
さぁV100、メモリをお食べ・・・
nilpe
0
130
CSC307 Lecture 17
javiergs
PRO
0
320
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
180
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
GitHub's CSS Performance
jonrohan
1033
470k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
430
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
sira's awesome portfolio website redesign presentation
elsirapls
0
270
WCS-LA-2024
lcolladotor
0
620
Exploring anti-patterns in Rails
aemeredith
3
400
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
550
Music & Morning Musume
bryan
47
7.2k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
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は実装できませんでした。今後に期待