Dance with Agents

tmuxを使い込むことになったら

この記事はtmux――接続が切れても作業を続けられる道具の続きです。必要になった日に読む用なので、まだそうでないなら閉じて大丈夫です。

まず、3つの階層

tmuxの説明が分かりにくくなる最大の原因は、入れ子が3段あるのに一気に説明されることだと思います。先に整理しておきます。

イメージ 中に持てるもの
セッション 作業場そのもの。プロジェクト1つに1つ ウィンドウを複数
ウィンドウ 作業場の中のタブ ペインを複数
ペイン 画面を分割した1区画 —

最初はセッションだけで足ります。 ウィンドウとペインは、画面を分けたくなってからで間に合います。

そして全部の操作がCtrl+bから始まります。これは「これからtmuxへの指示を出します」という合図で、tmuxが自分宛ての入力と、中で動いているプログラム宛ての入力を区別するための仕組みです。

覚えておくと楽になるキー

Ctrl+bを押してから、次のキーを押します(同時押しではありません)。

キー すること
d 場に置いたまま抜ける
c 新しいウィンドウを作る
n / p 次 / 前のウィンドウへ
" 上下に分割する
% 左右に分割する
x 今いるペインを閉じる
& 今いるウィンドウを閉じる
$ セッションの名前を変える
, ウィンドウの名前を変える

分割の"と%は、記号の形が分割の向きと逆に見えるので混乱しがちです。%は縦棒が含まれているので左右、"は横並びの点なので上下、と覚えると少しましになります。

片付ける——これを忘れると溜まります

tmuxの場は抜けても消えません。それが利点なのですが、終わったと伝えないと残り続けます。

tmux ls                        # 今ある場を一覧する
tmux kill-session -t work      # 「work」を終わらせる
tmux kill-session -a           # 今いる場以外を全部終わらせる

-aは公式のマニュアルに「all sessions but the specified one is killed」と書かれているとおり、指定した以外を全部落とします。溜まりすぎたときの掃除に便利です。

エージェントを使っているときは、これが特に大きいです。 放置した場でエージェントが動き続けると、見ていないところで作業が進んだり、処理が走りっぱなしになったりします。用が済んだら落とす。 習慣にしておくと安全側に倒れます。

名前を付け直す

地味ですが、よく使います。作業の途中で「これ、さっき付けた名前と違う内容になったな」となるからです。

tmux rename-session 新しい名前        # 今いるセッションの名前を変える
tmux rename-session -t 古い名前 新しい名前

Ctrl+b $ でも同じことができます。

セッション名は、あとでattachするときの手がかりです。 0や1のまま増やしていくと、どれが何だったか分からなくなります。プロジェクト名を付けておくと、tmux lsを見た瞬間に思い出せます。

打つ回数を減らす——管理人のalias

ここからは実際の設定です。管理人の.zshrcには、alias 3つと関数1つを書いてあります。

alias ta='tmux new-session -A -s'       # attach(あればつなぐ/無ければ作る)
alias tk='tmux kill-session -t'         # kill(終わらせる)
alias tl='tmux list-sessions 2>/dev/null || echo "セッションなし"'   # list(一覧する)

# tn <名前>: tmuxの中なら現在のセッションを改名、外なら作って入る
tn() {
  if [ -z "$1" ]; then
    echo "使い方: tn <セッション名>" >&2
    return 1
  fi
  if [ -n "$TMUX" ]; then
    tmux rename-session "$1"
  else
    tmux new-session -A -s "$1"
  fi
}

t+動作の頭文字、という付け方です。使うときはこうなります。

ta work      # 「work」につなぐ(無ければ作る)
tl           # 一覧
tn 別名       # tmuxの中で打つと、いまのセッションの名前を変える
tk work      # 「work」を終わらせる

rename用のaliasは、既存のコマンドとぶつかって廃止した

以前はtr='tmux rename-session'と書いていました。 t+renameの頭文字なので、並びとしては素直です。

ところがtrは、もともとUNIXにあるコマンドの名前でした。 文字を置き換えたり削ったりするもので、tr -d '='のように使います。aliasは同じ名前の既存コマンドを覆い隠すので、この書き方をしていた間、本物のtrが打てなくなっていました。

2026-09-09に、rename-sessionをtnのほうへ寄せました。tnはもともと「新しく作る」係でしたが、tmuxの中で打ったときだけ「名前を変える」に振り分けます。 外で打てば今までどおり作って入るので、覚えることは増えません。

aliasを付けるときは、その名前が既に埋まっていないか確かめます。 type trやwhich trで、何かが返ってくれば先客がいます。

-Aが、いちばんの当たり

知っておく価値が一番高いのは、taとtnの両方で使っている-Aです。

普通のtmux new -s workは、すでにworkがある状態で打つとエラーになります。 「あるのか無いのか思い出せないから、とりあえずtmux lsで確認してから……」という一手間が毎回発生します。

-Aを付けると、それが消えます。公式のマニュアルにこうあります(手元のman tmuxでも同じ文が読めます)。

The -A flag makes new-session behave like attach-session if session-name already exists

(-Aを付けると、そのセッション名が既にある場合、new-sessionはattach-sessionのように振る舞う)

つまり ta work の1つだけ覚えておけば、無ければ作るし、あればつなぎ直す。 存在を気にしなくてよくなります。

aliasの仕組みと、ターミナルを閉じても消えないように設定に残す方法はaliasという救世主に書きました。

.tmux.confに、最初に書いておくとよいもの

設定はホームディレクトリの.tmux.confに書きます(隠しファイルなのでlsでは見えません)。管理人の設定から、違いが分かりやすいものだけ抜き出します。

# マウスで操作できるようにする(ペインの選択、サイズ変更、スクロール)
set -g mouse on

# 番号を1から始める。キーボードの並びと合って押しやすい
set -g base-index 1
setw -g pane-base-index 1

# ウィンドウを閉じたら番号を詰め直す
set -g renumber-windows on

最初に書くならmouse onです。 これがないと、スクロールすらキー操作になります。書いた瞬間に「使える道具」に変わるので、体感がいちばん大きいと思います。

base-index 1は好みですが、既定だと0始まりで、キーボードの1から順に押していくと1つずつずれます。 直しておくと地味にストレスが減ります。

mouse onの副作用:コピペがいつもの動きじゃなくなる

mouse onにすると、ドラッグでの範囲選択がtmuxに横取りされます。 今まで当たり前にできていた「ドラッグして選択、コピー」が、そのままでは働かなくなるということです。tmuxのmouseは既定でoffなので、この現象はmouse onにした人だけが踏みます。ペインの切り替えやスクロールと引き換えの副作用だと思ってください。

Macなら、Optionキーを押しながらドラッグすると、tmuxの横取りを一時的に解除できます(iTerm2で確認済み。参考)。これでいつもどおり選択してCmd+Cでコピーできます。Terminal.appでも同じキー操作が案内されていることが多いですが、確実なのはiTerm2です。

リモートから繋いでいるときほど、この現象に出会いやすいです。知らずに使うと「コピペができなくなった」と焦るので、先に知っておくと安心です。

そもそも、自分で書かなくていい

ここまで設定を並べておいてなんですが、この手のファイルは、エージェントに書いてもらうのがいちばん早いです。

マウスで操作できて、ウィンドウ番号が1から始まる .tmux.conf を作って

これで通ります。書式を覚える必要はありません。 すでに.tmux.confがある場合も、「読んで、マウス操作だけ足して」と頼めば、今の内容を壊さずに追記してくれます。

前の節のaliasも同じです。「taでtmux a -tを呼べるように.zshrcに足して」で済みます。設定ファイルの置き場所も、書き方も、反映のしかたも、使う人が覚えている必要はありません。

ただし、設定ファイルは壊すと影響が毎回出ます。 とくに.zshrcは、書き間違えるとターミナルを開くたびにエラーが出ます。任せる前に、この2つだけやっておいてください。

  • 控えを取る — 「先に.zshrc.bakにコピーしてから直して」と一緒に頼めば済みます
  • 反映して確認する — 直したら新しいターミナルを開いて、エラーが出ないか見る

そして、何を書いたのか説明してもらってください。 「今足した行、それぞれ何をしてる?」と聞けば答えます。自分の設定ファイルの中身が分からないまま増えていくのが、いちばん困る状態なので。

実体験:これでは直らなかった、という話

管理人の設定には、こういう1行も書いてあります。

set -sg escape-time 50

iPhoneから繋いで日本語を打つと入力が壊れる、という現象に対して加えたものです。Escキーの判定時間を縮める設定で、濁点が独立した文字として送られてエスケープシーケンスと誤解釈されるのを避けられないか、という狙いでした。

結論から言うと、これでは解決しませんでした。 設定に残っているのはその名残です。

最終的に収まったのは、tmuxの設定ではなくターミナルアプリを替えたときでした。何がどれだけ効いたのかも含めて、moshという、切れない接続に書いてあります。スマホから日本語で指示を出したい人には、そちらのほうが本命です。

組み合わせて効くもの

  • mosh — 接続そのものが切れないようにする道具。切れないようにするのがmosh、切れても作業が死なないようにするのがtmuxなので、守備範囲が違います。一緒に使うのが定番です
  • Tailscale — そもそも別のデバイスから自分のパソコンへ届くようにする話

まとめ

  • 階層はセッション → ウィンドウ → ペイン。最初はセッションだけでいい
  • kill-sessionを忘れると溜まる。 エージェントが動いたまま残るので、特に気をつける
  • tmux new-session -A -s を覚えておくと、「あったっけ?」が消える
  • .tmux.conf はまず set -g mouse on から

リモート開発環境の記事

リモート開発環境のページへ →