はじめに
環境
- PC: MacBook Air(16 GM)
- 開発環境: vscode
元ネタと前回記事
- note AI駆動開発 Claude Code & Tmux入門 16ワーカーを同時に動かして開発効率爆上げする方法 bashもzshにも対応
- 前々回記事 Gemini CLIを使って並列タスク処理をしたい!(下準備編)
- 前回記事 Gemini CLIを使って並列タスク処理をしたい!(ターミナルに同時に質問編)
この記事は?
前回に比べ、今回はさらに一歩進め、特定のペインを座標で指定してコマンドを実行できるzsh関数 tp
を導入します。
これにより、create_tmux_layout.sh
の引数 N
の値(グリッドサイズ)が変わっても、動的にレイアウトを認識し、柔軟に各ペインを操作できるようになります。
tp
関数の導入方法と、それを使って個別のペインでgemini-cli
を起動したり、ファイルからプロンプトを読み込ませたりする具体的な活用例を解説します。
この記事で実現すること
-
動的なペイン操作:
create_tmux_layout.sh
で作成したN x Nのグリッドサイズを自動で認識し、行・列の座標で特定のペインを操作するtp
関数を実装する。 -
個別ペインでのGemini実行:
tp
関数を使い、指定したペインで個別にgemini-cli
のプロンプトを実行する。 -
個別ペイン & ファイルからのプロンプト読み込み:
gemini-cli
が持つファイル読み込み機能を活用し、.txt
ファイルに書かれた指示を特定のペインで実行させる。
実行結果
動的なペイン操作
個別ペインでのGemini実行
個別ペイン & ファイルからのプロンプト読み込み
ファイル構成
.
├── .zshrc
└── Parallel-Processing-With-CLI/ # お好みの適当なフォルダ名
├── create_tmux_layout.sh
└── README.md
└── prompt.txt
Step 1: 動的グリッド対応の tp
関数を .zshrc
に追加する
まずは、今回の主役であるtp
関数を.zshrc
に追記します。
この関数は、現在のtmux
セッションのペイン総数からグリッドサイズ(N x N)を自動で計算し、指定された座標(行、列)に対応するペイン番号を割り出してコマンドを送信する優れものです。
.zshrc
に追加するコード
以下のzsh関数を、お使いの.zshrc
ファイルにコピー&ペーストしてください。
# tp <row> <col> "command" - (動的N対応版) 座標を指定してペインでコマンドを実行
function tp() {
# --- 引数の数をチェック ---
if [[ "$#" -lt 3 ]]; then
echo "使用方法: tp <行番号> <列番号> "コマンド""
echo "例: tp 1 2 "ls -l""
return 1
fi
# --- tmux環境情報を動的に取得 ---
# 現在のセッション名を取得 (ハードコードしない)
local SESSION=$(tmux display-message -p '#S')
# 現在のセッションのペイン総数を取得
local total_panes=$(tmux list-panes -s -t "$SESSION" | wc -l | tr -d ' ')
# --- グリッドサイズNを動的に計算 ---
# ペイン総数の平方根を計算してNとする (例: 16ペインならN=4)
local N=$(echo "$total_panes" | awk '{ n = int(sqrt($1)); print n }')
# N*N がペイン総数と一致するか検証 (完全な正方グリッドかの確認)
if (( N * N != total_panes )); then
echo "エラー: 現在のペインレイアウトは完全な N x N グリッドではありません。"
echo "ペイン総数: ${total_panes}, 推定N: ${N}"
return 1
fi
# --- 引数を変数に格納し、検証 ---
local row=$1
local col=$2
local cmd=$3
# 行・列番号が数字かつ範囲内かチェック (0からN-1まで)
if ! [[ "$row" =~ ^[0-9]+$ ]] || ! [[ "$col" =~ ^[0-9]+$ ]] || (( row >= N )) || (( col >= N )); then
echo "エラー: この ${N}x${N} グリッドでは、行・列番号は 0 から ${N-1} の範囲で指定してください。"
return 1
fi
# --- ペイン番号を計算し、コマンドを送信 ---
local pane_index=$((row * N + col))
tmux send-keys -t "$SESSION:0.${pane_index}" "$cmd" C-m
echo "✅ [${N}x${N} Grid] pane-R${row}C${col} (ペイン番号: ${pane_index}) で実行: $cmd"
}
設定の反映
.zshrc
を編集した後、以下のコマンドで設定を再読み込みします。
source ~/.zshrc
Step 2: tp
関数を使ってみる
tp
関数の準備ができたので、実際に使ってみましょう。
1. tmux
グリッド環境の起動
まず、create_tmux_layout.sh
で2x2のグリッドを作成します。
./create_tmux_layout.sh 2
2. tp
関数で特定のペインを操作する
tp
関数の基本的な使い方は以下の通りです。行・列の番号は0
から始まることに注意してください。
tp <行番号> <列番号> "実行したいコマンド"
使用例:
2x2のグリッドで、右下のペイン(行:1, 列:1)から左下のペイン(行:1, 列:0)と左上のペイン(行:0, 列:0)に、現在のパス(world
)を表示させてみます。
# (pane-R1C1で実行)
tp 1 0 "echo 'world'"
tp 0 0 "echo 'world'"
Step 3: 本番!! tp
関数とgemini-cli
を組み合わせ
ここからが本題です。tp
関数を使って、各ペインで個別にgemini-cli
を操作します。
1. 個々のペインで異なる指示を出す
例えば、左上のペインと左下のペインに、それぞれ同じ質問を投げてみます。
tp 0 0 "gemini --prompt '1から10までの素数をリストアップして'"
tp 1 0 "gemini --prompt '1から10までの素数をリストアップして'"
これにより、各ペインが独立したAIアシスタントとして機能し始めます。
2. ファイルからプロンプトを読み込んで実行する
gemini-cli
は、ファイルパスを渡すことでその内容をプロンプトとして読み込むことができます。これとtp
関数を組み合わせることで、より複雑な指示を簡単に実行できます。
まず、指示を書き込むためのprompt.txt
を作成します。
こんにちは 今日はどんな気分か一言で!
次に、左下のペイン(行:1, 列:0)で、このファイルを読み込ませてgemini-cli
を実行します。
tp 1 0 "gemini --prompt './prompt.txt'"
tp 0 0 "gemini --prompt './prompt.txt'"
これで、個々のターミナルにgeminiを起動し、prompt.txtを読み込ませ、解答を得ることができました!!☺️
これができると何が嬉しいの?
tp
関数による柔軟なペイン操作とgemini-cli
を組み合わせることで、CLI上での並列作業が飛躍的に効率化します。
例えば、以下のようなワークフローが考えられます。
- Pane (0,0): データ分析のコードを実行させる。
- Pane (0,1): 上記の分析結果を元に、報告書のドラフトを作成させる。
- Pane (1,0): Pane(0,0)と(0,1)のアウトプットを読み込ませ、最終的なレポートをHTML形式で生成するよう指示する。
- Pane (1,1): 同じく、アウトプットを読み込ませ、今度はMarkdown形式でサマリーを生成させる。
このように、複数のAIエージェントが連携して一つのタスクを分担・処理するような、高度な使い方が可能になります。
次回
「これができると何が嬉しいの?」をprompt.txtの指示に書いてできるようにします!
まとめ
今回は、tmux
のペインを座標で指定して操作できるzsh関数tp
を導入し、gemini-cli
と組み合わせることで、より柔軟かつ強力な並列AI開発環境を構築する方法を紹介しました。
create_tmux_layout.sh
のNの値を変更しても動的に追従できるため、これまでのta
(全件操作)とtp
(個別操作)を使い分けることで、CLIでの作業効率は格段に向上するはずです。
ぜひ、ご自身の環境でも試してみてください。
最後に
この記事も、構成のアイデア出しから文章の生成まで、そのほとんどをGeminiのサポートを受けながら作成しました。