Claude Code に別 tmux ペインを覗かせる小ネタ - display-message と capture-pane で「あっち見て」を一行で頼む

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 / #Ptmux の 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.2

Claude 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-app

Claude 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 に短い関数を入れておくと快適です。

~/.zshrc
# 現在のペインの「セッション:ウィンドウ.ペイン」を表示
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 | pbcopy

AGENTS.md / CLAUDE.md に書いておく価値

このネタは、プロジェクトの AGENTS.mdCLAUDE.md に書いておくと、Claude Code 側が「ユーザーがペイン座標を貼ってきたら capture-pane で読む」を当然の所作にしてくれます。

たとえば、

AGENTS.md(抜粋)
## 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 で延ばせます。

~/.tmux.conf
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 に「実行 → 結果確認」の往復を任せられる
  • ~/.zshrctloc / tcap / task あたりの小さな関数を入れておくと爆速
  • プロジェクトの AGENTS.md / CLAUDE.md に tmux 連携ルールを 1 段落書いておけば、毎回説明せずに済む

ペイン番号を手で目視して入力していた人ほど、効果が大きい小ネタです。tcap | pbcopy を仕込んだ瞬間、Claude Code との会話が一段スムーズになりますよ。

参考リンク