From 08eab0f2db99256452da76e06b0ba25e1d42cba8 Mon Sep 17 00:00:00 2001 From: "takemi.ohama" Date: Thu, 24 Sep 2026 20:16:11 +0900 Subject: [PATCH 1/8] =?UTF-8?q?=E8=A8=AD=E8=A8=88(PLAN71):=20prefix=20S=20?= =?UTF-8?q?=E3=81=AE=E4=B8=80=E8=A6=A7=E3=81=A8=E3=83=A1=E3=83=8B=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E3=82=92=E3=82=B3=E3=83=9E=E3=83=B3=E3=83=89=20tmux-m?= =?UTF-8?q?enu=20=E3=81=8B=E3=82=89=E3=82=82=E9=96=8B=E3=81=8F=20(#270)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- issues/PLAN71_tmux-menu-design.md | 203 ++++++++++++++++++++++++++++++ issues/PLAN71_tmux-menu.md | 132 +++++++++++++++++++ 2 files changed, 335 insertions(+) create mode 100644 issues/PLAN71_tmux-menu-design.md create mode 100644 issues/PLAN71_tmux-menu.md diff --git a/issues/PLAN71_tmux-menu-design.md b/issues/PLAN71_tmux-menu-design.md new file mode 100644 index 00000000..0ace376d --- /dev/null +++ b/issues/PLAN71_tmux-menu-design.md @@ -0,0 +1,203 @@ +# PLAN71: prefix S のセッションの一覧とメニューをコマンド tmux-menu からも開く の設計 + +要求と受け入れ条件は [PLAN71_tmux-menu.md](PLAN71_tmux-menu.md) にある。この文書は +「どう作るか」だけを扱う。土台の `tmux-session` の設計は PLAN69 にある。確定仕様は +[docs/specifications/tmux-named-session.md](../docs/specifications/tmux-named-session.md) である。 + +## 機能一覧 + +| # | 機能 | 誰が使うか | +| --- | --- | --- | +| F1 | tmux の中で `tmux-menu` を打つと、今の pane にセッションの一覧を出す。選ぶと `prefix S` と同じメニューが出る | tmux の中にいる利用者 | +| F2 | tmux の外で `tmux-menu` を打つと、attach と同時に一覧を出す | tmux の外にいる利用者 | +| F3 | `prefix S` を F1 と同じ定義で開く(一覧を開く定義を 1 か所にする) | tmux の中にいる利用者 | +| F4 | F1〜F3 を base イメージへ入れ、ホストで使う手順を示す | base を建てる利用者と、ホストの tmux の利用者 | + +## 構成要素 + +| 要素 | 変更 | 責務 | +| --- | --- | --- | +| `containers/base/tmux-session` | 変える | 呼ばれた名前 `tmux-menu` を `menu` へ振り分ける。`menu` がセッションを受け取らないときは一覧を開く(決定 1)。一覧を開く `choose-tree` の定義をこのファイルだけに持つ(決定 2) | +| `containers/base/tmux.conf` | 変える | `prefix S` の行を `run-shell` で `tmux-menu` を呼ぶ形に変える(決定 2) | +| `containers/base/Dockerfile` の「tmux セッションの整理コマンド」の節 | 変える | symlink の `RUN` に `tmux-menu` を 1 つ足す | +| `tests/containers/test_tmux_session.py` | 変える | F1・F2・F3 と、`menu -c 端末 <セッション>` の形が変わらないことを確かめる。Dockerfile の symlink の形を固定する(`SHORT_NAMES` に `tmux-menu` を足す) | +| `tests/containers/test_tmux_conf.py` | 変える | `prefix S` の割り当てが `tmux-menu` を呼ぶことを `list-keys` で確かめる | +| `docs/user/environment-variables.md` の「セッションを名指しで扱う」 | 変える | `tmux-menu` の使い方を足す。ホストの手順の symlink を 5 つにし、`~/.tmux.conf` の行を新しい割り当てへ差し替える | +| `docs/specifications/tmux-named-session.md` | 変える(確定仕様化で) | `menu` の 2 つの形と `tmux-menu`、`prefix S` の新しい行 | +| `CHANGELOG.md` | 変える | `[Unreleased]` の `### Added` に足す。反映に `devbase build base --no-cache` が要ることを書く | + +次のものは変えない。 + +- `tmux-session` の `go` / `peek` / `kill` と、`menu -c 端末 <セッション>` が出すメニューの中身 +- `containers/base/tmux-first` / `containers/base/tmux-clean` +- `prefix s`(tmux の既定の `choose-tree -Zs`) + +## 決定の記録 + +### 決定 1: `tmux-menu` は `menu` サブコマンドの短縮名にし、セッションを受け取らない形を一覧を開く動きにする + +利用者が決めた名前 `tmux-menu` と、サブコマンドの名前 `menu` がそろう。`tmux-go` = `go` と同じ +規則で読める。今の `menu -c 端末 <セッション>` はセッションを必ず受け取るため、受け取らない +形は空いている。空いた形に一覧を割り当てれば、今の形の呼び出し元(今の `/etc/tmux.conf` と +ホストへ写した行)は何も変えずに動く。 + +新しいサブコマンド(`ui` など)を足して `tmux-menu` をそちらへ振り分ける案は採らない。 +`tmux-menu` と `menu` が別の動きになり、名前から動きが読めない。今の `menu` を別名へ改名する +案も採らない。ホストへ写した `~/.tmux.conf` の行が壊れる。 + +### 決定 2: 一覧を開く定義は `tmux-session` だけに持ち、`prefix S` は `run-shell "tmux-menu"` で呼ぶ + +`prefix S` と `tmux-menu` が同じ一覧を開くことを、定義を 1 つにして保つ。2 か所に同じ template を +持つと、片方だけを直したときに 2 つの入口の動きが分かれる。実測のとおり、template を +`run-shell` の文字列へ直接書く形は `#{…}` の先の展開で壊れる。スクリプトの中に置けば +`run-shell` の展開を通らない。ホストの手順も `~/.tmux.conf` の 1 行が短くなる。 + +`prefix S` の行を今のまま残し、`tmux-session` にも同じ template を書く案は採らない。一致を +テストで縛ることはできるが、同じ文字列を 2 か所で持つこと自体が残る。 + +### 決定 3: tmux の外では attach 先を引数で取らない + +名前の決まったセッションへ行くなら `tmux-go` がある。`tmux-menu` は「まず一覧を見る」入口で、 +attach 先は tmux の既定(直近のセッション)で足りる。一覧からどのセッションへも移れる。 +セッションを引数で取ると、決定 1 の「セッションを受け取るかで 2 つの形を分ける」規則が崩れる。 + +## 実測(2026-09-24、ホストの tmux 3.7b) + +専用のソケットでサーバを立て、`python3` の `pty` で端末を attach した。`tmux-session` の代わりに +引数を書き出すだけの偽物を置き、一覧で 1 つ上のセッションを選んで Enter を押した。選んだ +セッションの名前は `it's`(`'` を含む)である。 + +| 開き方 | `menu` へ渡った引数 | 判定 | +| --- | --- | --- | +| tmux の中のプロンプトで `tmux choose-tree -Zs -O name '