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

Solution 1 : まずはシンプルに
==========

以下を`~/.zshrc`に書く。

```zsh:~/.zshrc
# Autostart if not already in tmux.
if [[ ! -n $TMUX ]]; then
  tmux new-session
fi
```

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

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

```zsh:~/.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とか選択的インターフェースを使って見た目もかっこよくしましょう。

```zsh:~/.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](https://github.com/junegunn/fzf), [peco](https://github.com/peco/peco), [percol](https://github.com/mooz/percol))

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

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

```zsh:~/.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を起動しないようにする
==================================================

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

```zsh:~/.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](https://qiita-image-store.s3.amazonaws.com/0/54869/527ddff9-3267-72f7-a644-5a85ef73d791.png)

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

tmuxの中にいない状態で，

```shell-session
$ zsh
```

のようにしてインタラクティブシェルを起動するときも，上のようにtmuxを起動するかどうか聞く挙動をしてしまう。
どんどん入れ子になっていくと気持ち悪いので，ログインシェルでないときは，tmuxのセッションを起動or選択する機能を切ることにする。

ログインシェルでは

```shell-session
$ echo $-
569XZghiklms
```

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

```shell-session
$ echo $-
569XZghikms
```

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

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

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

* [dotfiles/tmux.zsh at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/zshfiles/functions/tmux.zsh)