Dance with Agents

Enterを押すと送信されてしまう――改行と送信を入れ替える

実践mac

まだ書き終わっていないのに、送られる

ターミナルでEnterを押すと、その場で実行されます。ステップ2で触れたとおり、これがGUIとの一番大きな違いです。

シェルにコマンドを打つぶんには、これで正しい。1行打って、Enterで実行。迷う余地がありません。

問題はエージェントとの対話です。指示は数行になることが多く、箇条書きにしたくなる場面もあります。ところが改行のつもりでEnterを押した瞬間、書きかけのまま送信されます。エージェントは中途半端な指示を受け取って動き出し、使う人はそれを止めて書き直すことになります。

改行するだけなら、方法は用意されている

Claude Codeの場合、改行を挿入する手段は最初から複数あります(公式ドキュメントのMultiline input)。

方法 条件
Ctrl+J どのターミナルでも設定不要
\ を打ってからEnter どのターミナルでも
Shift+Enter iTerm2・ターミナル.app・Windows Terminalなどではそのまま使える
Option+Enter MacでOptionキーをMetaとして扱う設定にしてある場合

これで足りるなら、ここから先は要りません。

それでも、指はEnterを押す

足りない理由は単純で、Enterが「送信」のままだからです。他のあらゆる入力欄でEnterは改行なので、集中して書いているときほど無意識に押します。押した瞬間に送信されるのだから、注意力で防ぐのは分が悪い。

そこで発想を逆にします。Enterを改行にして、送信をOption+Enterに移す。 送信のほうを、意識して押すキーにするわけです。管理人のiTerm2はそう設定してあります。

なぜ入れ替えられるのか

キーボードのEnterとCtrl+Jは、別々の文字を送っています。Enterが送るのはCR(復帰、\r)、Ctrl+Jが送るのはLF(改行、\n)です。ターミナルで動くアプリ側は、キーを見ているのではなく、送られてきたこの文字を見ています。

Claude Codeの既定は、CR(Enter)が送信、LF(Ctrl+J)が改行です(公式のキーバインド一覧ではchat:submitがEnter、chat:newlineがCtrl+J)。

つまり、Enterキーが送る文字のほうを差し替えれば、アプリ側の設定を触らずに改行と送信が入れ替わります。

iTerm2での設定

iTerm2の「Settings」→「Profiles」→対象のプロファイル→「Keys」タブ→「Key Mappings」で、+ボタンから2つ登録します。どちらもActionは「Send Text with vim Special Chars」を選びます。この方式は\nや\rといった記法をそのまま解釈します(iTerm2公式)。

押すキー 送る文字
Return(修飾キーなし) \n
Option+Return \r

これで、Enterが改行、Option+Enterが送信になります。

設定はプロファイル単位です。ローカル用とSSH接続用でプロファイルを分けているなら、必要なほうに個別に登録することになります。

もうひとつ、SSHで別のパソコンに接続して作業している場合に間違えやすい点があります。キーを文字に変換しているのは手元のターミナルアプリなので、設定するのは手元側で、接続先ではありません。 接続先の設定をいくら見ても、そこには何もありません。

シェルのほうは、これで壊れない

Enterが送る文字を変えてしまって、普段のコマンド実行は大丈夫なのかという話ですが、zshはCtrl+J(LF)にもaccept-line——つまり行の実行——を割り当てています。手元での確認はこれで足ります。

bindkey | grep '\^J'
"^J" accept-line

そのため、Enterでコマンドを実行する操作はこれまでどおりです。ただし、EnterとCtrl+Jを別のものとして扱うアプリでは挙動が変わる可能性はあります。

Claude Codeだけでよければ

同じことは、Claude Code側の設定でもできます。/keybindingsと打つと~/.claude/keybindings.jsonが開くので、Chatのキー割り当てを書き換えます(公式ドキュメント)。

{
  "$schema": "https://www.schemastore.org/claude-code-keybindings.json",
  "bindings": [
    {
      "context": "Chat",
      "bindings": {
        "enter": "chat:newline",
        "alt+enter": "chat:submit"
      }
    }
  ]
}

どちらを選ぶかは、及ぶ範囲の違いです。ターミナル側で設定すれば、同じ画面で動かす別のCLIツールにもまとめて効きます。 Claude Code側で設定すれば、影響はClaude Codeの中だけに収まります。他のツールをほとんど使わないなら、後者のほうが副作用を考えずに済みます。

しばらくは戸惑う

入れ替えた直後は、書き終わったのに送信されない、という戸惑いが必ずあります。数日で慣れますが、合わなければ登録した設定を削除すれば元どおりです。

長い指示を書く機会が増えてきたら、試す価値のある設定だと思います。ターミナルの設定は配色やフォントだけでなく、こういう入力の作法まで含めて変えられます。

ターミナル / UNIXコマンドの記事

ターミナル / UNIXコマンドのページへ →