Zsh
Linux
tmux

[tmux] 端末起動時に自動で新規セッションを作成 or 既存セッションにアタッチ

More than 1 year has passed since last update.


Solution 1 : まずはシンプルに

以下を~/.zshrcに書く。


~/.zshrc

# Autostart if not already in tmux.

if [[ ! -n $TMUX ]]; then
tmux new-session
fi

但し,このままだと,新しく端末を立ち上げるたびにどんどんセッション数が増えていって,面倒なことこの上ない。


Solution 2 : デタッチしたら端末を閉じる


~/.zshrc

if [[ ! -n $TMUX ]]; then

tmux new-session && exit
fi

そうだけど,そうじゃない。


Solution 3 : 既にtmuxセッションが存在している時には選択してattatchできるようにする

と便利ですね。

tmux list-sessionsを実行すると

main: 3 windows (created Wed Jan 27 11:49:33 2016) [88x34] (attached)

1: 1 windows (created Wed Jan 27 17:59:17 2016) [213x54]

のようにセッション名: n windows ( ...と返ってくるので,cutでセッション名を取得すればいい。

せっかくだからfzfとか選択的インターフェースを使って見た目もかっこよくしましょう。


~/.zshrc

if [[ ! -n $TMUX ]]; then

# get the IDs
ID="`tmux list-sessions`"
if [[ -z "$ID" ]]; then
tmux new-session
fi
ID="`echo $ID | $PERCOL | cut -d: -f1`"
tmux attach-session -t "$ID"
fi

環境変数$PERCOLにはお好きな選択的インターフェースアプリケーションの名前を入れておく。

(ex. fzf, peco, percol)

しかし,これでは新たにセッションをつくることができない。


Solution 4 : 既にセッションが存在するときにも新たにセッションを作れるようにする


~/.zshrc

if [[ ! -n $TMUX ]]; then

# get the IDs
ID="`tmux list-sessions`"
if [[ -z "$ID" ]]; then
tmux new-session
fi
create_new_session="Create New Session"
ID="$ID\n${create_new_session}:"
ID="`echo $ID | $PERCOL | cut -d: -f1`"
if [[ "$ID" = "${create_new_session}" ]]; then
tmux new-session
fi
tmux attach-session -t "$ID"
fi

"Create New Session:"という項目が追加され,これを選択すると新規セッションが作られる。

":"の前の文言は何でもいいが,”:”は抜かしてはいけない。


Solution 5 : セッション選択中にESCキーなどで抜けた時にはtmuxを起動しないようにする

とさらにいいかもしれません。


~/.zshrc

if [[ ! -n $TMUX ]]; then

# get the IDs
ID="`tmux list-sessions`"
if [[ -z "$ID" ]]; then
tmux new-session
fi
create_new_session="Create New Session"
ID="$ID\n${create_new_session}:"
ID="`echo $ID | $PERCOL | cut -d: -f1`"
if [[ "$ID" = "${create_new_session}" ]]; then
tmux new-session
elif [[ -n "$ID" ]]; then
tmux attach-session -t "$ID"
else
: # Start terminal normally
fi
fi


screen_001.png


Solution 6: インタラクティブシェルでは選択画面を表示しない

tmuxの中にいない状態で,

$ zsh

のようにしてインタラクティブシェルを起動するときも,上のようにtmuxを起動するかどうか聞く挙動をしてしまう。

どんどん入れ子になっていくと気持ち悪いので,ログインシェルでないときは,tmuxのセッションを起動or選択する機能を切ることにする。

ログインシェルでは

$ echo $-

569XZghiklms

インタラクティブシェルでは

$ echo $-

569XZghikms

で分かるように,インタラクティブシェルではオプション'-l'が指定されないことがわかるので,それで判定($- == *l*)する。


~/.zshrc

if [[ ! -n $TMUX && $- == *l* ]]; then

# get the IDs
ID="`tmux list-sessions`"
if [[ -z "$ID" ]]; then
tmux new-session
fi
create_new_session="Create New Session"
ID="$ID\n${create_new_session}:"
ID="`echo $ID | $PERCOL | cut -d: -f1`"
if [[ "$ID" = "${create_new_session}" ]]; then
tmux new-session
elif [[ -n "$ID" ]]; then
tmux attach-session -t "$ID"
else
: # Start terminal normally
fi
fi



まとめ

Solution 6 をzshrcに書いて,いつでもtmuxの中にいる安心感を享受できるようになった(急に分割したくなったりするじゃないですか)。みなさんも端末のタブ機能なんて使ってないで,ぜひどうぞ。

その他のエイリアスなどはこちら