はじめに
Claude Codeを使っていると、「このペインでコードを書かせながら、別のペインでテストを回したい」という場面が出てきます。macOS/Linuxユーザーはtmuxでペインを分割してそれぞれにClaude Codeを立ち上げればよいですが、Windowsにはtmuxがありません。
そこで使えるのが psmux です。Rustで書かれたネイティブWindowsのターミナルマルチプレクサで、WSLもCygwinも不要。winget install psmux でインストールし、PowerShellプロファイルにレイアウト関数を登録するだけで、コマンド一発で4つのClaude Codeが並列起動する環境を構築できます。
psmuxとは
psmux は、Windows向けにRustで書かれたネイティブのターミナルマルチプレクサです。
- Windows ConPTYを直接使用(WSL・Cygwin・MSYS2不要)
- tmuxコマンドをそのまま実行できる(
tmuxエイリアスも同梱) -
.tmux.confをそのまま読み込める - tmuxのテーマ・プラグインにも対応
tmuxユーザーなら学習コストほぼゼロで移行できます。
主な機能
| 機能 | 内容 |
|---|---|
| ペイン分割 | 水平・垂直の両方に対応 |
| ウィンドウ管理 | タブ形式で複数ウィンドウ |
| セッション管理 | バックグラウンドセッション維持 |
| マウスサポート | クリックでペイン選択など |
| Vimライクなコピーモード | スクロールバック付き |
| ステータスバー | tmuxフォーマット変数をフルサポート |
インストール方法は psmux GitHub リポジトリ を参照してください。
PowerShellプロファイルにレイアウトプリセットを登録する
毎回ペイン構成を手打ちするのは面倒です。PowerShellのプロファイル($PROFILE)にレイアウトプリセットを定義しておけば、コマンド一発で好みのペイン構成を呼び出せます。
以下は筆者のプロファイル起動直後の様子です。
ターミナルを開くと自動で:
-
利用可能なレイアウトプリセット(
tmux-even・tmux-chrome・tmux-left・tmux-top)の一覧 -
現在アクティブなセッションと、番号指定でkillするコマンド(
tmux-kill 1)
が表示されます。tmux attach -t chrome のように1コマンドで作業を再開できます。
そもそも psmux(tmux)には組み込みのレイアウトプリセットが存在します。Ctrl+b Space で even-horizontal・even-vertical・main-horizontal・main-vertical・tiled を順に切り替えられるので、凝った構成でなければカスタム関数なしでも十分かもしれません。
PowerShell起動時に自動実行される tmux 関連コマンド
$PROFILE に書いたコードは PowerShell 起動のたびに毎回実行されます。以下が筆者の実際のプロファイルに書いている tmux 関連の定義です。
# ============================================================
# tmux 4ペインレイアウト - 全ペインで claude を自動起動
# ============================================================
function Start-ClaudeInAllPanes {
param([string]$Session, [int]$PaneCount)
for ($i = 0; $i -lt $PaneCount; $i++) {
tmux send-keys -t "${Session}:0.$i" "claude" Enter
}
Start-Sleep -Milliseconds 3000
for ($i = 0; $i -lt $PaneCount; $i++) {
tmux send-keys -t "${Session}:0.$i" "" Enter
}
}
# Pattern 1: even (tiled)
# +----------+----------+
# | claude | claude |
# +----------+----------+
# | claude | claude |
# +----------+----------+
function tmux-even {
tmux new-session -d -s even
tmux split-window -h -t "even:0"
tmux split-window -v -t "even:0.0"
tmux split-window -v -t "even:0.1"
tmux select-layout -t even tiled
Start-ClaudeInAllPanes -Session even -PaneCount 4
tmux select-pane -t "even:0.0"
tmux attach -t even
}
# Pattern 1b: chrome (tiled、左上のみ --chrome オプション付き)
# +----------+----------+
# | claude | claude |
# | --chrome | |
# +----------+----------+
# | claude | claude |
# +----------+----------+
function tmux-chrome {
tmux new-session -d -s chrome
tmux split-window -h -t "chrome:0"
tmux split-window -v -t "chrome:0.0"
tmux split-window -v -t "chrome:0.1"
tmux select-layout -t chrome tiled
tmux send-keys -t "chrome:0.0" "claude --chrome" Enter
for ($i = 1; $i -lt 4; $i++) {
tmux send-keys -t "chrome:0.$i" "claude" Enter
}
Start-Sleep -Milliseconds 3000
for ($i = 0; $i -lt 4; $i++) {
tmux send-keys -t "chrome:0.$i" "" Enter
}
tmux select-pane -t "chrome:0.0"
tmux attach -t chrome
}
# Pattern 2: left (左1列メイン + 右3行)
# +----------+-----+
# | |claud|
# | claude +-----+
# | |claud|
# | +-----+
# | |claud|
# +----------+-----+
function tmux-left {
tmux new-session -d -s left
tmux split-window -h -t "left:0"
tmux split-window -v -t "left:0.1"
tmux split-window -v -t "left:0.2"
tmux select-pane -t "left:0.0"
tmux resize-pane -t "left:0.0" -x 60
Start-ClaudeInAllPanes -Session left -PaneCount 4
tmux select-pane -t "left:0.0"
tmux attach -t left
}
# Pattern 3: top (上1行メイン + 下3列)
# +--------------------------+
# | claude |
# +---------+--------+-------+
# | claude | claude | claude|
# +---------+--------+-------+
function tmux-top {
tmux new-session -d -s top
tmux split-window -v -t "top:0"
tmux split-window -h -t "top:0.1"
tmux split-window -h -t "top:0.2"
tmux select-pane -t "top:0.0"
tmux resize-pane -t "top:0.0" -y 30
Start-ClaudeInAllPanes -Session top -PaneCount 4
tmux select-pane -t "top:0.0"
tmux attach -t top
}
# セッション番号指定で kill(引数なしで全kill)
function tmux-kill {
param([string]$Nums = "")
$sessions = tmux list-sessions 2>$null
if (-not $sessions) { Write-Host "no tmux sessions" -ForegroundColor Yellow; return }
$list = @($sessions | ForEach-Object { ($_ -split ':')[0] })
if ($Nums -eq "") {
tmux kill-server
Write-Host "done: kill-server" -ForegroundColor Green
} else {
$digits = $Nums.ToCharArray() | ForEach-Object { [int]::Parse($_) }
foreach ($d in $digits) {
$idx = $d - 1
if ($idx -ge 0 -and $idx -lt $list.Count) {
tmux kill-session -t $list[$idx]
Write-Host ("killed: {0}" -f $list[$idx]) -ForegroundColor Green
}
}
}
}
# ---- 起動時: レイアウト一覧 + アクティブセッション表示 ----
Write-Host "tmux layouts loaded." -ForegroundColor Cyan
Write-Host " tmux-even # 2rows x 2cols"
Write-Host " tmux-chrome # 2rows x 2cols (top-left: --chrome)"
Write-Host " tmux-left # 1col(L) + 3rows x 1col(R)"
Write-Host " tmux-top # 1row(top) + 3cols(bot)"
Write-Host " tmux-kill [nums]"
$_tmux_raw = tmux list-sessions 2>$null
if ($_tmux_raw) {
$_tmux_list = @($_tmux_raw | ForEach-Object { ($_ -split ':')[0] })
Write-Host ""
for ($i = 0; $i -lt [Math]::Min(6, $_tmux_list.Count); $i++) {
Write-Host (" tmux-kill {0,-2} # {1,-12} -> tmux attach -t {2}" -f ($i+1), $_tmux_list[$i], $_tmux_list[$i]) -ForegroundColor Cyan
}
}
psmux はセッションをバックグラウンドで保持するため、ターミナルを閉じてもセッションは消えません。tmux attach -t chrome のように1コマンドで前回の作業を再開できます。
Claude Codeを複数ペインで動かす
レイアウト関数でセッションを起動したら、各ペインで claude を起動するだけです。
# レイアウト起動(例: 均等4分割)
tmux-even
tmux-even を実行すると、2×2の均等分割レイアウトで4つのClaude Codeが自動起動します。
各ペインでそれぞれ独立したClaude Codeセッションが立ち上がり、ステータスバーには [even] 0:claude* と表示されます。
それぞれのClaude Codeは独立したプロセスとして動くため、コード生成・テスト実行・デバッグをペインごとに異なるClaude Codeに割り当て、並行実行できます。
まとめ
| 項目 | 内容 |
|---|---|
| psmuxとは | Rust製のネイティブWindows tmux互換ツール |
| 必要なもの | PowerShell 7+・psmux |
| 使い方 | psmuxでペイン分割 → 各ペインで claude を起動 |
| インストール |
winget install psmux 一発 |
macOS/Linuxでtmuxを使う感覚そのままで、Windowsでも複数のClaude Codeを並列に動かせます。tmuxを知っていれば既存設定がそのまま動くため、追加の学習なしで移行できます。ぜひ試してみてください。

