Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
❄️ tmux-nixの実装を通して学ぶNixOSモジュール
Search
Mutsuha Asada
May 24, 2025
Programming
1.2k
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
640
❄️ NixCon2025に参加した
momeemt
0
640
🔨 小さなビルドシステムを作る
momeemt
4
1.5k
情報科学類で学べる専門科目38選
momeemt
0
1.2k
Wasmで拡張できる軽量マークアップ言語 Brack
momeemt
0
780
❄️ NixOS/nixpkgsにSATySFiサポートを実装する
momeemt
2
1k
Intel系FPGA上へのRISC-Vプロセッサの実装
momeemt
0
640
情報科学若手の会 2024 LT「WebAssemblyで拡張可能な軽量マークアップ言語の開発」
momeemt
0
81
Nixでつくるdotfiles
momeemt
4
1.8k
Other Decks in Programming
See All in Programming
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
980
Simple Storage Service(S3) is not simple
iwatsukayura
0
280
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
470
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
110
速習iPhone Duo対応
yuukiw00w
2
980
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
200
ジョジョの世界をXRで再現する
mofurune
0
160
SREの越境 / SRE Collaboration
y0hgi
2
310
カツオ、ご期待ください
suneo3476
0
180
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
370
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
250
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
110
Featured
See All Featured
Google's AI Overviews - The New Search
badams
0
1.6k
We Are The Robots
honzajavorek
0
400
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Raft: Consensus for Rubyists
vanstee
142
7.8k
Mobile First: as difficult as doing things right
swwweet
225
10k
Ruling the World: When Life Gets Gamed
codingconduct
0
400
Music & Morning Musume
bryan
48
7.4k
Thoughts on Productivity
jonyablonski
76
5.4k
Documentation Writing (for coders)
carmenintech
77
5.6k
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は実装できませんでした。今後に期待