
Claude Code に別 tmux ペインを覗かせる小ネタ - display-message と capture-pane で「あっち見て」を一行で頼む
Claude Code で作業していると、こんなシーンがよくあります。
- 別ペインで
npm run devを走らせている → エラーが出てる気がする - 別ペインで
pytest --watchを回している → 失敗テストの詳細を見たい - 別ペインで
tail -f /var/log/...を流している → 直近のログ行を確認したい
Claude Code は自分が動いているペインの外は見えませんが、tmux コマンドを実行する権限はあります。つまり、「別ペインの座標」さえ正確に伝えれば、Claude 自身が tmux capture-pane でキャプチャして読んでくれるわけです。
そのための「現在地を一行で取る」小ネタが今回の主題。
まず結論: この一行を覚えればOK
確認したいペインで実行します。
tmux display-message -p 'セッション:#S, ウィンドウ:#I, ペイン:#P'出力例:
セッション:work, ウィンドウ:1, ペイン:2あとは Claude Code に、
tmux の セッション:work, ウィンドウ:1, ペイン:2 の中身を確認して
と頼むだけ。Claude Code が tmux capture-pane を実行してテキストを読み取ってくれます。
これだけだと本当に小ネタで終わってしまうので、ここから少し膨らませます。
なぜこれが効くのか(仕組み)
display-message -p の役割
tmux display-message は、本来 tmux のステータスバーに一時メッセージを表示するコマンドです。-p(print)を付けると、メッセージを表示する代わりに標準出力に書き出すようになります。スクリプトから tmux の状態を取得するための事実上の標準手段。
中で使っている #S / #I / #P は tmux の format 変数で、
| 変数 | 意味 |
|---|---|
#S | セッション名 |
#I | ウィンドウのインデックス |
#P | ペインのインデックス |
#W | ウィンドウ名 |
#T | ペインタイトル |
#{pane_id} | ペイン ID(例: %2) |
#{pane_pid} | ペインのプロセス ID |
#{pane_current_command} | ペインで今動いているコマンド名(node, pytest, tail など) |
#{pane_current_path} | ペインのカレントディレクトリ |
-t <target-pane> を付けずに実行すると、そのコマンドを実行したペイン自身の情報が返ります(=「今ここ」が分かる)。
Claude Code 側で何が起きるか
座標を渡された Claude Code は、tmux capture-pane を使って中身を読みます。代表的な呼び出しはこれ。
tmux capture-pane -p -t work:1.2-p は print(標準出力に出す)、-t は target-pane の指定。書式は セッション名:ウィンドウインデックス.ペインインデックス。
スクロールバック込みで読みたいときは -S / -E で開始 / 終了行を指定できます。
tmux capture-pane -p -t work:1.2 -S -200 # 直近 200 行 + 現在画面
tmux capture-pane -p -t work:1.2 -S - -E - # スクロールバック全部Claude Code に「直近 200 行も含めて確認して」と頼めば、適切なオプションを選んで実行してくれます。
一歩進めた「依頼文ごと出す」版
毎回「セッション:◯◯, ウィンドウ:◯, ペイン:◯ の中身を確認して」と書き写すのが面倒なら、依頼文ごと一発で生成すると楽です。
tmux display-message -p 'tmux の セッション:#S, ウィンドウ:#I, ペイン:#P の中身を確認して'出力例:
tmux の セッション:work, ウィンドウ:1, ペイン:2 の中身を確認してこれをそのままコピペすれば、依頼文として完成しています。
Claude Code がそのまま実行できる版
Claude Code が解釈する手間も省きたい場合、capture-pane コマンドそのものを出力させてしまうのが最速です。
tmux display-message -p 'tmux capture-pane -p -t #S:#I.#P'出力:
tmux capture-pane -p -t work:1.2Claude Code には「下記を実行して中身を要約して」と渡すだけ。考える余地がない分、誤読が起きません。
下記を実行して中身を確認して、要点を教えて
tmux capture-pane -p -t work:1.2ペインを「指す」もうひとつの書式: ペインID
tmux にはインデックス(セッション:ウィンドウ.ペイン)とは別に、セッション・ウィンドウ・ペインそれぞれに不変の IDがあります。
| 種類 | 書式 | 取り方 |
|---|---|---|
| セッション ID | $N | #{session_id} |
| ウィンドウ ID | @N | #{window_id} |
| ペイン ID | %N | #{pane_id} |
インデックスはペインを閉じたり並び替えると変わるのに対し、ID はそのセッションが生きている限り変わりません。長時間動く監視タスクや、スクリプトで安定的に指したい場合は ID を使うほうが安全です。
tmux display-message -p 'tmux capture-pane -p -t #{pane_id}'出力:
tmux capture-pane -p -t %2%2 のように渡しておけば、ペインの並び順が変わっても同じペインを指し続けます。
さらに有用な「今どこ?」コマンド集
実務で便利な display-message パターンをいくつか。
1. 今のペインで何が走っているか
tmux display-message -p '#S:#I.#P [#{pane_current_command}] @ #{pane_current_path}'出力例:
work:1.2 [node] @ /home/me/srv/projects/my-appClaude Code への状況説明として「ここで何が動いてるか」を 1 行で渡せます。
2. 全ペインを一覧する
tmux list-panes -a -F '#S:#I.#P #{pane_id} [#{pane_current_command}] #{pane_current_path}'-a で全セッション横断、-F でフォーマット指定。出力例:
work:0.0 %0 [zsh] /home/me
work:1.0 %1 [nvim] /home/me/srv/projects/my-app
work:1.1 %2 [node] /home/me/srv/projects/my-app
work:1.2 %3 [pytest] /home/me/srv/projects/my-app
side:0.0 %4 [tail] /var/logこれを Claude Code に渡して「pytest が動いてるペインの最新出力を見て、失敗テストを直して」と頼めば、Claude が %3 を target にして capture してくれます。
3. 別ペインのコマンドを Claude Code に叩かせる
別ペインに対してキー送信もできます。たとえば「テストペインで npm test を叩いて」を Claude に依頼するなら、
tmux send-keys -t work:1.2 'npm test' Enterを渡すだけ。Claude Code が send-keys でコマンドを送り、続けて capture-pane で結果を読む、という「実行 → 結果確認」の往復を自動化できます。
シェル alias / 関数にしておく
毎回 display-message のフォーマット文字列を書くのは面倒なので、~/.zshrc / ~/.bashrc に短い関数を入れておくと快適です。
# 現在のペインの「セッション:ウィンドウ.ペイン」を表示
tloc() {
tmux display-message -p '#S:#I.#P'
}
# capture-pane コマンドをそのままコピペ用に出力
tcap() {
tmux display-message -p 'tmux capture-pane -p -t #S:#I.#P'
}
# 依頼文ごと出力
task() {
tmux display-message -p 'tmux の セッション:#S, ウィンドウ:#I, ペイン:#P の中身を確認して'
}使い方:
$ tloc
work:1.2
$ tcap
tmux capture-pane -p -t work:1.2
$ task
tmux の セッション:work, ウィンドウ:1, ペイン:2 の中身を確認してmacOS なら pbcopy パイプも仕込んでおくと、Cmd+V するだけで Claude Code のチャット欄に貼れて1 アクションで依頼完了します。
tcap | pbcopyAGENTS.md / CLAUDE.md に書いておく価値
このネタは、プロジェクトの AGENTS.md や CLAUDE.md に書いておくと、Claude Code 側が「ユーザーがペイン座標を貼ってきたら capture-pane で読む」を当然の所作にしてくれます。
たとえば、
## tmux 連携
ユーザーが「セッション:S, ウィンドウ:W, ペイン:P」のような形式でペイン座標を提示した場合、
`tmux capture-pane -p -t S:W.P` で内容を取得して読むこと。
スクロールバックも含めて読みたい場合は `-S -200` などで遡る。
長時間稼働するプロセスのペイン(dev server、test watcher、ログ tail 等)は、
セッション ID / ペイン ID(`%N`)形式で指定されることがあるが、同じく `capture-pane -t %N` で読める。これだけ書いておけば、「セッション:work, ウィンドウ:1, ペイン:2 を見て」とだけ伝えれば、後は Claude が自動的にやってくれるようになります。
tmux 側の補足: ペイン番号を画面に出すキーバインド
「あ、今どのペイン番号だっけ」と忘れた時のために、prefix + q を覚えておくと便利です。各ペインの番号が大きく数秒間表示されます(押している間に数字キーを押すとそのペインへジャンプ)。
ペイン番号表示時間は display-panes-time で延ばせます。
set -g display-panes-time 3000 # ミリ秒まとめ
- Claude Code に別ペインを覗かせたいときは、
tmux display-message -p 'セッション:#S, ウィンドウ:#I, ペイン:#P'で現在地を取得して伝えるのが一番速い - もう一歩進めて、依頼文ごとあるいは
tmux capture-paneコマンドそのものを出力させると、コピペ 1 回で済む - 不変な参照にはペイン ID(
%N)、人間が読む状況把握には#{pane_current_command}/#{pane_current_path}が便利 - 別ペインに対しては
tmux send-keysでコマンドを送れる。Claude Code に「実行 → 結果確認」の往復を任せられる ~/.zshrcにtloc/tcap/taskあたりの小さな関数を入れておくと爆速- プロジェクトの
AGENTS.md/CLAUDE.mdに tmux 連携ルールを 1 段落書いておけば、毎回説明せずに済む
ペイン番号を手で目視して入力していた人ほど、効果が大きい小ネタです。tcap | pbcopy を仕込んだ瞬間、Claude Code との会話が一段スムーズになりますよ。