Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,16 @@
処理からも見えます。設定を足すツールはこの変数の指す先へ 1 ファイル置けば、`~/.bashrc` を
書き換えずに済みます。zsh と `lfm` は対象外です。
**反映には `devbase build base --no-cache` と、使っている派生イメージの建て直しが要ります。**
- **`prefix S` のセッションの一覧とメニューを、コマンド `tmux-menu` からも開けるようにしました
(PLAN71 / #270)。** tmux の中では今の pane に一覧を出し、tmux の外では attach して一覧を出します
(attach 先は tmux の既定。サーバが無ければ何も作らず終了コード 1)。本体は `tmux-session menu`
で、`tmux-session menu -c 端末 <セッション>` の形は変わりません。`prefix S` の割り当ては
`tmux-menu` を呼ぶ形になりました(開く一覧とメニューは同じ)。ホストの tmux で使う手順
(symlink の 5 つ目の `tmux-menu` と `~/.tmux.conf` の新しい行)は
`docs/user/environment-variables.md` の「セッションを名指しで扱う」にあります。
**反映には `devbase build base --no-cache` と、使っている派生イメージの建て直し、
コンテナの作り直し(`devbase down` → `devbase up`)が要ります。`devbase up` だけでは
反映されません。**

### Changed
- **スナップショットの世代を、アカウントグループ(対象ボリュームの組)ごとの系列で持つように
Expand Down
7 changes: 4 additions & 3 deletions containers/base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -260,20 +260,21 @@ COPY --chmod=0644 tmux.conf /etc/tmux.conf
# tmux セッションの整理コマンド。tmux-first は居座りクライアントを切断して
# 一番若い番号のセッションへ切り替え、tmux-clean は置き去りのセッションを削除する。
# tmux-session は 1 つのセッションを名指しで移る・調べる・落とす (#234)。prefix S の
# メニュー (tmux.conf) からも呼ばれる。
# 一覧とメニュー (tmux.conf) からも呼ばれる。一覧は tmux-menu でも開く (#270)。
# 背景と使い方は各スクリプト冒頭のコメントと docs/user/environment-variables.md を参照。
COPY --chmod=0755 tmux-first /usr/local/bin/tmux-first
COPY --chmod=0755 tmux-clean /usr/local/bin/tmux-clean
COPY --chmod=0755 tmux-session /usr/local/bin/tmux-session

# 短縮名は alias ではなく symlink で用意する。alias は bash の対話シェルにしか効かず、
# zsh などの他シェルや非対話実行 (docker exec など) では使えないため。
# tmux-go / tmux-peek / tmux-kill は呼ばれた名前で tmux-session のサブコマンドになる。
# tmux-go / tmux-peek / tmux-kill / tmux-menu は呼ばれた名前で tmux-session のサブコマンドになる。
RUN sudo ln -sf tmux-first /usr/local/bin/tmux1 \
&& sudo ln -sf tmux-clean /usr/local/bin/tmuxc \
&& sudo ln -sf tmux-session /usr/local/bin/tmux-go \
&& sudo ln -sf tmux-session /usr/local/bin/tmux-peek \
&& sudo ln -sf tmux-session /usr/local/bin/tmux-kill
&& sudo ln -sf tmux-session /usr/local/bin/tmux-kill \
&& sudo ln -sf tmux-session /usr/local/bin/tmux-menu

# フォントの既定。素の fontconfig は sans-serif を中国語フェイス (WenQuanYi Zen Hei) へ
# 向けるため、日本語を描くと中国語の字形で写る (#161)。/etc/fonts/local.conf は
Expand Down
40 changes: 37 additions & 3 deletions containers/base/tmux-session
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
# tmux-session go [-c 端末] <セッション> 移る。そのセッションの他の端末は外す
# tmux-session peek [-n 行数] <セッション> attach せずに端末・プロセス・画面を見る
# tmux-session kill [-n] [-f] [-c 端末] <セッション>... attach・実行中を問わず落とす
# tmux-session menu セッションの一覧を開く (prefix S と同じ, #270)
# tmux-session menu -c 端末 <セッション> prefix S の一覧から呼ばれるメニュー
#
# tmux-go / tmux-peek / tmux-kill という名前 (symlink) で呼ぶと、そのサブコマンドになる。
# tmux-go / tmux-peek / tmux-kill / tmux-menu という名前 (symlink) で呼ぶと、そのサブコマンドになる。
# 短縮名を alias にしないのは、alias が bash の対話シェルにしか効かないため。
#
# セッションの指し方: `$数字` は ID、それ以外は名前の完全一致 (devbase-1 は devbase-10 に
Expand All @@ -25,6 +26,7 @@ case "$PROG" in
tmux-go) SUB="go" ;;
tmux-peek) SUB="peek" ;;
tmux-kill) SUB="kill" ;;
tmux-menu) SUB="menu" ;;
*)
PROG=tmux-session
SUB=""
Expand All @@ -44,10 +46,13 @@ usage() {
tmux-session kill [-n] [-f] [-c 端末] <セッション>...
attach・実行中を問わず落とす。-n は落とさずに予定を出す。
自分の pane があるセッションは -f が無ければ落とさない。
tmux-session menu
セッションの一覧を開く (prefix S と同じ)。選ぶと下のメニューが出る。
tmux の外では attach して一覧を出す。
tmux-session menu -c 端末 <セッション>
移る・中身を見る・落とすのメニューを出す (prefix S の一覧から呼ばれる)。

短縮名: tmux-go = go / tmux-peek = peek / tmux-kill = kill
短縮名: tmux-go = go / tmux-peek = peek / tmux-kill = kill / tmux-menu = menu
<セッション>: `$数字` は ID、それ以外は名前の完全一致。
-c 端末: この端末の代わりに操作する。知らせは端末の状態行へ出す。

Expand Down Expand Up @@ -124,14 +129,23 @@ case "$LINES_N" in
'' | *[!0-9]*) usage_error "-n は 0 以上の整数で指定してください: $LINES_N" ;;
esac

# menu はセッションも -c も受け取らないときに限り一覧を開く (#270)。どちらか一方でも
# あればメニューを出す形として読む。
LIST=0
[ "$SUB" != menu ] || [ $# -ne 0 ] || [ "$HAVE_CLIENT" = 1 ] || LIST=1

case "$SUB" in
kill) [ $# -ge 1 ] || usage_error "セッションを指定してください" ;;
menu) [ "$LIST" = 1 ] || {
[ $# -ge 1 ] || usage_error "セッションを指定してください"
[ $# -eq 1 ] || usage_error "セッションは 1 つだけ指定してください"
} ;;
*)
[ $# -ge 1 ] || usage_error "セッションを指定してください"
[ $# -eq 1 ] || usage_error "セッションは 1 つだけ指定してください"
;;
esac
[ "$SUB" != menu ] || [ "$HAVE_CLIENT" = 1 ] || usage_error "menu には -c が要ります"
[ "$SUB" != menu ] || [ "$LIST" = 1 ] || [ "$HAVE_CLIENT" = 1 ] || usage_error "menu には -c が要ります"

# 知らせの出し先。-c のときは端末の状態行へ出し、標準出力には何も出さない
# (UI から背景の run-shell で呼ばれるため、出力は誰にも見えない)。
Expand All @@ -157,6 +171,26 @@ command -v tmux >/dev/null 2>&1 || fail "tmux が見つかりません"
SESSIONS=$(tmux list-sessions -F '#{session_id} #{session_name}' 2>/dev/null) ||
fail "tmux サーバが起動していません"

# 一覧を開く (prefix S と tmux-menu の共通の定義。/etc/tmux.conf の prefix S はここを呼ぶ)。
# "%%%" は選んだセッションの =名前: に、" \ $ ; ~ を \ で守って置き換わる。'%%' だと ' を
# 含む名前で壊れる。#{q:...} は選んだセッションの ID と、Enter を押した端末の名前をシェル
# 向けに引用する。template を run-shell の文字列へ直接書くと #{...} が先に展開されて壊れる
# ため、定義はこのスクリプトに置く。
# 出す pane は TMUX_PANE で決める。prefix S は run-shell に TMUX_PANE=#{pane_id} を渡す
# (run-shell の中には TMUX_PANE が無く、-t が無いと直近に操作された別の端末に出ることがある)。
if [ "$LIST" = 1 ]; then
TREE_TEMPLATE='run-shell -t "%%%" "tmux-session menu -c #{q:client_name} #{q:session_id}"'
if [ -n "${TMUX:-}" ]; then
if [ -n "${TMUX_PANE:-}" ]; then
exec tmux choose-tree -t "$TMUX_PANE" -Zs -O name "$TREE_TEMPLATE"
fi
exec tmux choose-tree -Zs -O name "$TREE_TEMPLATE"
fi
# tmux の外: attach 先は tmux の既定 (端末の繋がっていないセッションを優先し、
# その中で直近のもの)。attach した画面に一覧を出す。
exec tmux attach-session \; choose-tree -Zs -O name "$TREE_TEMPLATE"
fi

if [ "$HAVE_CLIENT" = 1 ]; then
tmux list-clients -F '#{client_name}' | grep -Fqx -- "$CLIENT" ||
fail "端末がありません: $CLIENT"
Expand Down
9 changes: 5 additions & 4 deletions containers/base/tmux.conf
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ set -g focus-events on
# 含まれないため、宣言しないと Claude Code などが出す URL がクリックできない。
set -ga terminal-features ",xterm-256color:hyperlinks"

# prefix S: セッションを選び、移る・中身を見る・落とすのメニューを出す (#234)。
# "%%%" は選んだセッションの =名前: に、" \ $ ; ~ を \ で守って置き換わる。'%%' だと ' を
# 含む名前で壊れる。#{q:...} は選んだセッションの ID と、押した端末の名前をシェル向けに引用する。
bind-key S choose-tree -Zs -O name "run-shell -t \"%%%\" \"tmux-session menu -c #{q:client_name} #{q:session_id}\""
# prefix S: セッションを選び、移る・中身を見る・落とすのメニューを出す (#234 / #270)。
# 一覧の定義は tmux-session にある (tmux-menu と同じ)。run-shell は渡した文字列の #{…} を
# 先に展開するため、template をここへ書かずにコマンドを呼ぶ。run-shell の中には TMUX_PANE が
# 無いため、押した pane の ID を渡す (無いと直近に操作された別の端末に出ることがある)。
bind-key S run-shell "TMUX_PANE=#{pane_id} tmux-menu"
Loading
Loading