課題:Shift+Enter で送信されてしまう
MulmoTerminal の Claude Code セッションに、少し長い指示を書こうとしている。
このバグを直して。
条件はこれ。
テストも足して。
1 行目を書いて、Shift+Enter で改行しようとしたら送信された。まだ書き終わっていないのに。
そして同じ日、スマホから返信しようとしてリモートビューの送信ボタンを押すと、入力欄にテキストが入るだけで送信されない。
この 2 つは同じ原因。不具合ではない。Claude Code 側のキー設定と MulmoTerminal の既定が食い違っているサインだ。
なぜ起きるのか:決めているのは MulmoTerminal ではない
Enter を押したときに送信するか改行を入れるかを最終的に決めているのは、MulmoTerminal ではなく Claude Code の TUI。そしてその判定は、キーの「名前」ではなくターミナルが送るバイト列で行われる。
関係するバイトは 2 つ。
| バイト列 | どのキーが送るか |
|---|---|
CR(\r) |
素の Enter |
ESC + CR(\x1b\r) |
Option/Alt+Enter、および MulmoTerminal の Shift+Enter |
Claude Code の標準は CR = 送信 / ESC+CR = 改行。これが MulmoTerminal の既定(terminalSubmit: "cr")なので、設定を変えていない限りはこの記事の設定は不要だ。
ただし、人によっては Claude Code を逆向き(CR = 改行 / ESC+CR = 送信)に設定していることがある。すると:
- Shift+Enter が送信になる(逆の側が送信扱いだから)
- スマホの送信がテキストを入れるだけになる(素の Enter を送っているから)
症状はこの 2 つが同時に出る。片方だけ出ている場合は別の問題を疑ったほうがいい。
MulmoTerminal の解決:1 行で合わせる
{ "terminalSubmit": "esc-cr" }
これで、キーボードもスマホも、Claude Code 側の設定に合わせて動く。
| モード | Enter | Shift+Enter / Option/Alt+Enter | スマホ送信 |
|---|---|---|---|
cr(既定) |
送信 | 改行 | \r で送信 |
esc-cr |
送信(内部では \x1b\r) |
改行(\r) |
\x1b\r で送信 |
どちらのモードでも、人から見た意味は同じ(Enter が送信、Shift+Enter が改行)。合わせているのは、Claude Code 側がどのバイトを送信扱いにしているかだ。
選ぶ基準
esc-cr を選ぶのは、Shift+Enter が改行ではなく送信になってしまう場合だけ。言い換えると、素の Enter が送信されず改行になってしまう場合。
判断が付かないときは既定のままにして、おかしいときに切り替える。書き間違えても安全で、"cr" / "esc-cr" 以外の値は無視されて既定に戻る。Enter が壊れることは無い。
詳細・gotcha
反映に 3 手かかる
Settings → Terminal keys から変えるのが一番早い。両モードが挙動の言葉で並んでいて、クリックで切り替わる。
手でファイルを書いた場合は 3 手:
~/.mulmoterminal/config.jsonにterminalSubmitを書く- ブラウザのタブを再読み込みする(キーボードはページ読み込み時に値を読む)
- アプリを再起動する(スマホのリモートビューは起動時にファイルから値を読む)
キーボードとスマホで読むタイミングが違うのが、この 3 手の理由。再読み込みだけでスマホが直らないときは、再起動を忘れている。
Claude のマスだけに効く
terminalSubmit は Claude Code の割り当てを表すものなので、効くのは Claude のセッションだけ。素のシェル・Codex・コマンドのマスは、esc-cr でも常に素の Enter(\r)で送信する。
これは意図した線引き。シェルの Enter は OS の作法なので、Claude の都合で変えるものではない。「設定を変えたらシェルの Enter もおかしくなった」は起きない。
スマホのソフトキーボードは素の Enter しか送れない
スマホの画面上キーボードには Shift+Enter が無く、Android では Return キーが通常の Enter ですらないことが多い。そのためスマホでは:
- Enter は上の表の通りに動く(
crなら送信、esc-crなら送信) - 画面上のキーボードから改行は入れられない
複数行の指示はリモートビューの入力欄から送る形になる。
IME 変換中は影響しない
変換中の Enter は変換の確定として扱われ、どちらのモードでも送信にも改行にもならない。日本語で AI に指示を出すときに「変換候補を確定しようとした Enter が送信されてしまう」は起きない。
ボタンから起動したセッションの最初のプロンプトも、この設定に従う
最初のプロンプト入りで起動したセッション——Skill の起動ボタン、コレクションやカスタムビューから開いたチャット——は、そのプロンプトが入力欄に打ち込まれて代わりに送信される。この送信も terminalSubmit に従う。
設定を間違えていると、「ボタンから起動したのに送信されていない」という症状が出る。一見別の不具合に見えるので、ここが繋がっていると知っていると早く直せる。
使ってみる
MulmoTerminal の立ち上げ方は MulmoTerminal 完全ガイド から。既に動いていれば、設定画面でそのまま試せる。
動作確認の最小シナリオ:
- 症状を確認する——Claude Code のセッションで
Shift+Enterを押して、改行ではなく送信されるか - 送信されるなら、Settings → Terminal keys で
terminalSubmitをesc-cr側に切り替える - ブラウザのタブを再読み込み、アプリを再起動
Shift+Enterで改行が入り、素の Enter で送信されれば成功
やめるときは、設定を "cr" に戻すか項目を消す。使えない値を書いても既定に戻るだけで、Enter が壊れることは無い。
まとめ
- Enter で送信するか改行するかを決めているのは MulmoTerminal ではなく Claude Code の TUI。判定はキーの名前ではなくバイト列(
CR/ESC+CR)で行われる - Claude Code を逆向きに設定していると、Shift+Enter が送信になり、スマホの送信ボタンが反応しなくなる——この 2 つは同じ原因
terminalSubmit: "esc-cr"で合わせる。既定("cr")のままでいい人のほうが多い- 反映はアプリ再起動+タブ再読み込みの 3 手。キーボードとスマホで値を読むタイミングが違うため
- 効くのは Claude のマスだけ。シェル・Codex は常に素の Enter で送信する。IME 変換中は影響しない
関連: MulmoTerminal 公式ガイドの Enter — 送信と改行 / MulmoTerminal のキーボードショートカット(keymap) / xterm.js で Shift+Enter の preventDefault を取る

