105
81

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-01-27

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の中にいる安心感を享受できるようになった(急に分割したくなったりするじゃないですか)。みなさんも端末のタブ機能なんて使ってないで,ぜひどうぞ。

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

105
81
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
105
81

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?