はじめに
tmuxを使っている人だと、シェル起動時にtmuxへ自動で入る設定にしているケースは多いと思います。
これは便利なのですが、設定によってはウィンドウを複数開いたときに全ウィンドウが同じセッションへ接続され、表示や操作が同期してしまうことがあります。
方針
この記事では、macOS + zsh を前提に、以下の挙動になるように~/.zshrcを調整します。
- まず、残っている(detachedな)セッションがあれば最優先で再開する
- 残っていなければ、
0からの連番(0,1,2...)で新規セッションを作る
作業の続きは拾いたいが、なければ新しい作業枠を自動で作りたいという挙動になっています。
前提環境
- OS: macOS
- Shell: zsh
- Terminal: Ghostty
- tmuxがインストール済み
~/.zshrc の設定
以下を~/.zshrcに追加(または既存のtmux自動起動ブロックを置き換え)します。
# tmux
if [[ -o interactive ]] && [[ -z "$TMUX" ]] && command -v tmux >/dev/null; then
# (Ghosttyだけで発動させたいなら下を追加)
# [[ -z "$GHOSTTY_RESOURCES_DIR" ]] && return
# detachedな既存セッションがあれば最優先で再開する
resume_session=$(
tmux list-sessions -F '#{session_name} #{session_attached} #{session_activity}' 2>/dev/null \
| awk '$2 == 0 { print $1, $3 }' \
| sort -k2,2nr \
| awk 'NR==1 { print $1 }'
)
if [[ -n "$resume_session" ]]; then
tmux attach -t "$resume_session"
else
# 数値セッションがなければ 0 からの連番で新規作成する
integer next=0
typeset -A used
for name in "${(@f)$(tmux list-sessions -F '#{session_name}' 2>/dev/null)}"; do
if [[ "$name" == <-> ]]; then
used[$name]=1
fi
done
while [[ -n "${used[$next]}" ]]; do
((next++))
done
tmux new-session -s "$next"
fi
fi
動作確認
Ghosttyを開いた時に、以下のように動作すれば反映完了です。
- detachedセッションがある: そのセッションへ再接続
- detachedセッションがない:
0から連番で新規作成 - 例:
0と2が存在するなら次は1
この形にしておくと、既存作業の再開と新規作業の切り分けをどちらも自動化でき、Ghosttyの複数ウィンドウ運用がかなり安定します。