tmuxを自動起動する方法(複数セッションにも対応)

ターミナルを立ち上げるたびに手動でtmuxを入力・実行するのは控えめに言っても超面倒ですよね。今回はtmux初心者向けに、「ターミナルを開いた時にtmuxを自動起動する方法」を解説します。

tmux自体の基本的な説明・使い方は別の記事にて解説しています。

まずはシェルのプラグインを見てみよう

まずシェルのプラグインをチェックしておきましょう。たとえば、ZshのプラグインマネージャーOh My Zshでは、公式でtmuxプラグインを提供しています。

Oh My Zshでの例

Oh My Zshであれば次のように変数の設定とプラグインを追加するだけです。

.zshrc
export ZSH_TMUX_AUTOSTART=true
plugins=(... tmux)

プラグインのREADMEを見てみると、他にも変数やエイリアスの設定などがあります。

プラグイン以外での設定方法

ここではzshを前提に書いていますが、内容自体は他のシェルでも構文を書き換えれば設定可能です(AIに聞けばすぐ変換してくれそう)。

次のようなスクリプトをシェルの設定ファイル(~/.zshrcなど)に書きます。

.zshrc
if [[ -z "$TMUX" && -z "$VIM" && "$TERM_PROGRAM" != "vscode" && $- == *l* ]] ; then
tmux attach-session -t default || tmux new-session -s default
fi

セッションを複数使う派向けの解説は記事の後半でします。

ここから小分けに解説していきます。

条件式

条件式は入れ子を防ぐためのもので、それぞれ次のような意味です。

  • -z "$TMUX":tmuxが起動してない
  • -z "$VIM":Vim/Neovimの中ではない
  • "$TERM_PROGRAM" != "vscode":VSCodeの中ではない
  • $- == *l*:ログインシェルである

エディタ関係は各自の環境に応じて設定しましょう。

セッションの指定・作成

Terminal window
tmux attach-session -t default || tmux new-session -s default

tmux attach-session -t <target-session>で指定したセッションに接続します。

「接続に失敗 = セッションが無かった」場合、tmux new-session -s <session-name>で指定した名前のセッションを作って接続します。

セッション名指定のオプションがコマンドによって違うので注意です(-t-s)。

シェルの設定ファイルのどこに書けばいいの?

条件式の中で未定義の環境変数などを使っていないのであれば、シェルの設定ファイルの冒頭でも問題ありません。

tmux終了時に自動終了したい場合

ここまではローカルで使うtmuxの話でしたが、tmuxはサーバー側にインストールして使うケースもあります。

ssh先で接続を切りたい時に「tmux内でexit、tmux起動前のシェルでexit」だと2回exitがあって面倒です。
こういった場合はexitを入れておきます。

判定は環境によって調整
if [[ -z "$TMUX" && -z "$VIM" ]] ; then
tmux attach-session -t default || tmux new-session -s default
exit
fi

tmuxのセッションから抜けた時、tmux起動前の元のシェルに戻るのではなく そのままssh接続を終了 します。

ローカル側でtmuxを使う場合は不要だと思います。

複数のセッションを使う派の人

ここまでの解説は「基本セッションをdefaultの1つだけで運用する」想定でした。

「セッションを複数使い分けている」「接続するセッションは選びたい」という場合、次のように設定できます。

.zshrc
if [[ -z "$TMUX" && -z "$VIM" && "$TERM_PROGRAM" != "vscode" && $- == *l* ]] ; then
# セッション一覧を取得
sessions=$(tmux list-sessions -F "#{session_name}: #{session_windows} windows" 2>/dev/null)
if [[ -z "$sessions" ]]; then
# セッションが0個の場合は新規作成
tmux new-session -s default
else
selected_session=$(echo "$sessions" | fzf --select-1 | cut -d: -f1)
# fzfでキャンセルされた場合は何もしない
if [[ -n "$selected_session" ]]; then
tmux attach-session -t "$selected_session"
fi
fi
fi

選択UIとしてfzfを採用していますが、他のCLIでも置き換え可能です。


tmuxの自動起動の解説でした。筆者は今のところセッション1つでやりくりしてます。

記事を書いている中でtmux attach-sessiontmux attachだったり結構コマンドのエイリアスが用意されているのを発見しました。まだまだ奥が深いぞtmux。