Claude Codeをtmuxのポップアップウィンドウで継続的に走らせる方法
どうも、TAKUYAです。
AIコーディングでは専らClaude Codeを使っています。最初はtmuxでターミナルの右側にペインを分割して使っていたのですが、幅が狭すぎてメッセージやdiffがまともに表示できず、使いづらかったです。 <Prefix>+zでペインを最大化すればいいのですが、毎回やるのは面倒でした。 そこで、ポップアップウィンドウでClaude Codeを起動するようにしました。キーバインドを押せばセッションが開き、閉じてもバックグラウンドで動き続けるので、すぐに再開できます。 この記事では、それを実現するためのtmuxの設定方法を紹介します。
動画で見る(英語):
ポップアップウィンドウはサブプロセスを維持できない
tmuxのdisplay-popupコマンドを使うとポップアップウィンドウを表示でき、ちょっとしたツールにすぐアクセスするのに便利です。 僕はlazygitでgitの状態をサッと確認するのに使っています:
bind -r g display-popup -d '#{pane_current_path}' -w80% -h80% -E lazygit
僕のプレフィックスキーはctrl-tなので、ctrl-t gに割り当てています。 LazyGitのような短命なプロセスにはこれで十分です。開いて、変更をステージして、コミットして、閉じる。それだけです。
しかし、Claude Code(や他のAIツール)をtmuxのポップアップウィンドウで動かすには問題があります。 会話を複数回のやり取りにわたって継続したいからです。 同じようにClaude Codeをバインドすると:
bind -r y display-popup -d '#{pane_current_path}' -w80% -h80% -E claude
...ポップアップを閉じるとClaude Codeのプロセスも一緒に終了してしまいます。 セッションを終了せずにポップアップを閉じる方法がないのです。 毎回新しいセッションを開始しなければならず、これでは意味がありません。
作業ディレクトリごとに専用のtmuxセッションを作る
解決策は、Claude Codeを別のtmuxセッション内で実行し、そのセッションにポップアップからアタッチすることです。つまり、tmuxセッションをネストして使います。 ポップアップを閉じてもセッションはバックグラウンドで動き続けます。 設定は以下の通りです:
bind -r y run-shell '\
SESSION="claude-$(echo #{pane_current_path} | md5sum | cut -c1-8)"; \
tmux has-session -t "$SESSION" 2>/dev/null || \
tmux new-session -d -s "$SESSION" -c "#{pane_current_path}" "claude"; \
tmux display-popup -w80% -h80% -E "tmux attach-session -t $SESSION"'
それぞれ解説します:
- 作業ディレクトリからユニークなセッション名を生成
SESSION="claude-$(echo #{pane_current_path} | md5sum | cut -c1-8)"
現在のペインの作業ディレクトリをMD5でハッシュし、先頭8文字をセッション識別子として使います。claude-a1b2c3d4のようなセッション名になります。ポイントは、ディレクトリごとに独立したClaude Codeセッションが作られることです。
- セッションがまだ存在しない場合のみ作成
tmux has-session -t "$SESSION" 2>/dev/null || \
tmux new-session -d -s "$SESSION" -c "#{pane_current_path}" "claude --dangerously-skip-permissions"
has-sessionでセッションの存在を確認し、重複作成を防ぎます。既にそのディレクトリのセッションがあればスキップし、なければ作業ディレクトリを設定した(-c)デタッチ状態(-d)の新しいセッションを作成し、Claude Codeを起動します。
- ポップアップからセッションにアタッチ
tmux display-popup -w80% -h80% -E "tmux attach-session -t $SESSION"
80%サイズのポップアップを開き、バックグラウンドのセッションにアタッチします。 サイズはお好みで変更してください。 ポップアップを閉じても(<prefix> dやデタッチのキーバインド)、セッションは生き続けます。やったね!
僕のDotfilesはこちら
以上です。とてもシンプルで直感的なハックです。 AIコーディングのワークフローに役立てば嬉しいです :) それでは、プロダクティブな一日を!