herdr でペインを分割して Claude Code を動かしていると、C-g で開くエディタまで狭くなります。この記事では、$EDITOR を 4 行のラッパースクリプトに差し替えて、編集している間だけペインをタブ全体へ広げる方法を解説します。
設定を終えると、C-g を押した瞬間にエディタが画面いっぱいに開き、保存して抜けると元の分割レイアウトへ戻ります。Neovim の設定も C-g の挙動も変更しません。触るのは PATH の 1 行と $EDITOR の値だけです。
実際、設定をすると以下のようになりました。
この記事で解決する問題
herdr は、コーディングエージェントの端末を預かって常駐させるツールです。1 つのタブをペインへ分割し、それぞれで Claude Code を走らせる使い方ができます。
Claude Code には C-g があります。押すと $EDITOR に設定したエディタが起動し、そこで書いた文章がプロンプトの入力欄に反映されます。入力欄へ直接打ち込むより、長い指示を組み立てやすくなります。
問題は、このエディタが起動する場所です。$EDITOR は、Claude Code が動いているペインの中でそのまま立ち上がります。ペインを 3 分割していれば、Neovim も 3 分の 1 の幅で開きます。折り返しが頻繁に起きて、段落の見通しが立ちません。
Neovim 側の設定をいくら見直しても直りません。狭いのは Neovim ではなく、Neovim が乗っているペインのほうだからです。
動作環境
| 項目 | 値 |
|---|---|
| OS | macOS Tahoe |
| herdr | v0.9.0 |
| Claude Code | v2.1.273 |
| エディタ | Neovim(ターミナル内) |
| シェル | zsh |
| 検証日 | 2026-09-16 |
私は、~/.claude/settings.json は dotfiles への symlink で管理しています。symlink を使っていない場合も、手順はそのまま通ります。
なぜ popup ではなく zoom を使うのか
最初に検討したのは、C-g のときだけ popup で開く方法です。popup は、既存のレイアウトの上へ重ねて表示される一時的なウィンドウを指します。分割の幅に縛られないので、狙いには合っています。
しかし、この方法は取れませんでした。herdr には、popup をプログラムから開く手段がないためです。次の 3 か所を順に確認しました。
設定ファイル
herdr --default-config を実行すると、既定の設定が出力されます。138 行目あたりに popup が登場します。
[[keys.command]]
key = "prefix+alt+g" # prefix キーに続けて alt+g を押したとき
type = "popup" # popup で開く
command = "lazygit" # 開く対象のコマンド
popup は確かに書けます。ただし書ける場所は [[keys.command]] の中だけです。「このキーを押したら popup を開く」という形に限られ、他のプログラムから呼び出す書き方はありません。
サブコマンド
herdr pane --help
list / split / zoom / run / send-text といったサブコマンドが並びます。popup を開くものはありません。
socket API
herdr は socket API を持っており、herdr api schema でその一覧を取得できます。
herdr api schema | grep -i popup
私の環境では、実行すると 0 件でした。設定ファイル、サブコマンド、socket API のどこにも、popup を外から開く口はありません。$EDITOR から popup を呼ぶことも、C-g の飛び先を popup に差し替えることもできない、ということになります。
代わりに使うもの
herdr には herdr pane zoom があります。prefix+z と同じ動作を CLI から実行するサブコマンドで、ペインを一時的にタブ全体へ広げます。
popup と zoom は仕組みが違います。それでも「エディタが画面いっぱいに出る」という結果は同じです。開く場所を変えられないなら、開いている間だけ場所を広げれば足ります。
逆方向の方法もあります。popup で Neovim を開き、書いた内容を herdr pane send-text で Claude Code のペインへ流し込む形です。ただし C-g を使わない別のフローを自作することになるため、この記事では採用していません。
修正対応
方針が決まったので、ここから設定に入ります。作業は 3 つです。ラッパースクリプトを用意し、その置き場所へ PATH を通し、settings.json の EDITOR を差し替えます。
手順 1: ラッパースクリプトを作る
$EDITOR を Neovim へ直接向けず、zoom で挟むスクリプトを 1 枚かませます。ここでは ~/dotfiles/bin/herdr-nvim として保存します。
#!/bin/sh
herdr pane zoom --current --on 2>/dev/null # 現在のペインをタブ全体に拡大
nvim "$@" # 編集する(終了までここで待つ)
herdr pane zoom --current --off 2>/dev/null # 元のレイアウトへ戻す
重要なのは 3 行目です。nvim "$@" は編集が終わるまで次の行へ進みません。この性質のおかげで、拡大と復元がちょうど編集の前後に挟まります。
各行末の 2>/dev/null は、エラー出力を捨てる書き方です。herdr の外、素のターミナルからこのスクリプトを実行すると zoom コマンドは失敗します。エラーを捨てておけば失敗は無視され、Neovim だけが起動します。
保存したら実行権限を付けます。
chmod +x ~/dotfiles/bin/herdr-nvim
ここで一度確かめておくと、あとの切り分けが楽になります。herdr のペインの中で ~/dotfiles/bin/herdr-nvim /tmp/test.md を実行してください。ペインが広がって Neovim が開き、:q で抜けたときに元の分割へ戻れば成功です。
手順 2: bin に PATH を通す
settings.json にスクリプトの置き場所を書く前に、シェルの PATH を通しておきます。env に書いた値は文字列としてそのまま扱われ、$HOME や ~ が展開されないためです。設定ファイル側からホームディレクトリを指す書き方がないので、PATH を通してコマンド名だけで解決させます。
~/.zshrc に 1 行足します。
export PATH="$HOME/dotfiles/bin:$PATH"
bash を使っている場合は、同じ行を ~/.bashrc に書きます。
ここでも一度確かめておきます。新しいシェルを開いて which herdr-nvim を実行してください。/Users/<ユーザー名>/dotfiles/bin/herdr-nvim のようにパスが返れば通っています。何も返らなければ、次の手順へ進んでも C-g は動きません。
手順 3: $EDITOR を差し替える
~/.claude/settings.json の EDITOR を、コマンド名へ変更します。
- "EDITOR": "nvim",
+ "EDITOR": "herdr-nvim",
Claude Code から見れば「$EDITOR がファイルを開いて終了した」だけです。C-g の流れには一切手を入れていないので、プロンプトへの反映もそのまま動きます。
同じ settings.json でも、hooks のコマンド文字列に書いた $HOME は展開されます。こちらはシェルが実行するためです。展開されないのは env の値のほうです。
実際に編集した Pull Request は以下の通りです。最初は EDITOR に絶対パスを書いていましたが、ユーザー名が入ってマシン間で共有できないため、あとから PATH 方式へ直しています。
動作確認
zoom が確実に元へ戻るかどうかを確かめます。分割比率が変わって戻ってくると、C-g を押すたびにレイアウトを直すことになるためです。
まず、ペインの中から自分の位置を引けるかを見ます。
herdr pane current
pane_id: wB:pA のような値が返れば、--current が引数なしで解決できています。
続けて、拡大と復元を順に実行します。
herdr pane zoom --current --on # 応答: zoomed: true
herdr pane zoom --current --off # 応答: zoomed: false
--off の応答に含まれる splits と ratio を確認してください。--on を実行する前と同じ値であれば、レイアウトは復元されています。
最後に Claude Code で C-g を押します。Neovim がタブ全体に広がり、保存して抜けたときに元の分割へ戻れば完了です。
別のエディタに差し替える
Neovim 以外を使う場合も、変更点はスクリプトの中の 1 語だけです。
#!/bin/sh
herdr pane zoom --current --on 2>/dev/null
nano "$@" # nvim から nano へ変更
herdr pane zoom --current --off 2>/dev/null
Emacs をターミナルの中で開くなら emacs -nw "$@" です。
emacsclient -c は使えません。GUI フレームを別ウィンドウで開き、そのまま制御が戻るためです。zoom した直後に unzoom され、さらに Claude Code 側も編集の完了を待てません。ターミナル内に留まる emacsclient -nw -a '' の形にしてください。
判断の基準は 1 つです。エディタが終了するまで制御を返さないかどうか。すぐ制御を返すコマンドは、この仕組みでは動きません。
ファイル名を bin/herdr-nano のように変えるなら、settings.json の EDITOR も herdr-nano に直します。
うまくいかないときは
-
ペインが広がらない:herdr の外で Claude Code を起動している可能性がある。
herdr pane currentを実行し、pane_idが返るかどうかを確認する。返らない場合、そのペインは herdr の管理下にない。 -
Permission denied と出る:
chmod +xが抜けている。 -
エディタが開かない:
which herdr-nvimが何も返さない。~/.zshrcに PATH を書いたあと、新しいシェルを開くかsource ~/.zshrcを実行する。 -
編集内容がプロンプトに反映されない:
$EDITORが終了を待たないコマンドになっている。前節のemacsclient -cと同じ状態。
制限が 1 つあります。すでに prefix+z で拡大してあるペインで C-g を押すと、エディタを抜けた時点で unzoom されます。事前の zoom 状態を読んで復元する手もありますが、行数が倍になるうえ実害は小さいので入れていません。
まとめ
-
C-gで開く$EDITORは、Claude Code が動いているペインをそのまま継承する。 - herdr に popup をプログラムから開く手段はない。設定ファイル、サブコマンド、socket API のいずれにも無い。
-
herdr pane zoom --current --on/--offで$EDITORを挟むと、編集している間だけペインがタブ全体へ広がる。 - 変更するのは PATH の 1 行と
$EDITORの 1 行だけ。C-gの流れも Neovim の設定もそのまま残せる。
herdr 側に popup を開くサブコマンドが追加されれば、このラッパーは不要になります。それまでは 4 行で足ります。
