最近
herdr
を使っている。tmux みたいに prefix キー(デフォルトは Ctrl+B)を押してから次のキーでペイン操作をするタイプのツールで、複数の AI コーディングエージェントを一つのターミナルで飼うのに便利。
このプレフィックスを tmux 時代の癖で Ctrl+J に変えたかったんだけど、そのままでは動かない。Ctrl+J はターミナル上では生バイトの LF (0x0A) そのもので、Enter キーと全く同じ扱いになる。区別するには kitty keyboard protocol (CSI-u) という拡張が必要だけど、手元の外側ターミナル(Terminal.app)がこれに非対応で、herdr クライアント自身も外側ターミナルに拡張モードを要求していない。結果、herdr からは「Enter が押された」としか見えず、そのままペインに素通りして改行になってしまう。
なので OS レイヤー(Karabiner-Elements)で Ctrl+J を別の chord に変換することにした。行き着いた先は Ctrl+Alt+J。herdr の公式ドキュメントで「どの OS・ターミナルでも確実に届く安全な選択肢」として推奨されている組み合わせで、readline のバインドとも Mac のメディアキーとも衝突しない。
~/.config/karabiner/assets/complex_modifications/herdr-ctrl-j-prefix.json に以下を置く。
{
"title": "herdr: Ctrl+J を prefix (Ctrl+Alt+J) に変換",
"rules": [
{
"description": "ターミナル内で Ctrl+J -> Ctrl+Alt+J (herdr prefix)",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "j",
"modifiers": { "mandatory": ["control"], "optional": ["caps_lock"] }
},
"to": [
{ "key_code": "j", "modifiers": ["left_control", "left_option"] }
],
"conditions": [
{
"type": "frontmost_application_if",
"bundle_identifiers": [
"^com\\.apple\\.Terminal$",
"^com\\.github\\.wez\\.wezterm$",
"^com\\.googlecode\\.iterm2$",
"^com\\.mitchellh\\.ghostty$"
]
}
]
}
]
}
]
}
frontmost_application_if の条件でターミナル系アプリが最前面のときだけ発動するようにしてあるので、他のアプリでは Ctrl+J は普段通り Enter として動く。配置したら Karabiner-Elements の Complex Modifications タブからこのルールを Enable にする。
herdr 側は ~/.config/herdr/config.toml で prefix を指定する。
[keys]
prefix = "ctrl+alt+j"
herdr server reload-config で反映すれば完了。Ctrl+J を押すと裏で Ctrl+Alt+J に化けて herdr の prefix として認識される。readline の Ctrl+B(一文字戻る)もそのまま生きているし、音量やシステム設定が暴発することもない。
改行を打ちたいときは Ctrl+J が使えなくなった分、\ + Enter か Shift+Enter を使う。herdr のペインは kitty keyboard protocol に対応しているので、Terminal.app 配下でも Shift+Enter は普通に効く。
体感としては「Caps Lock を Ctrl にしているキーボードで、左手だけで prefix を押せる」感じになって、かなり快適になった。tmux の癖をそのまま持ち込みたい人には試す価値があると思う。