MulmoTerminal で Shift+Enter が送信されてしまうとき — `terminalSubmit` の設定

MulmoTerminal で Shift+Enter が送信されてしまうとき — `terminalSubmit` の設定

課題: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 = 送信)に設定していることがある。すると:

症状はこの 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 手:

  1. ~/.mulmoterminal/config.json に terminalSubmit を書く
  2. ブラウザのタブを再読み込みする(キーボードはページ読み込み時に値を読む)
  3. アプリを再起動する(スマホのリモートビューは起動時にファイルから値を読む)

キーボードとスマホで読むタイミングが違うのが、この 3 手の理由。再読み込みだけでスマホが直らないときは、再起動を忘れている。

Claude のマスだけに効く

terminalSubmit は Claude Code の割り当てを表すものなので、効くのは Claude のセッションだけ。素のシェル・Codex・コマンドのマスは、esc-cr でも常に素の Enter(\r)で送信する。

これは意図した線引き。シェルの Enter は OS の作法なので、Claude の都合で変えるものではない。「設定を変えたらシェルの Enter もおかしくなった」は起きない。

スマホのソフトキーボードは素の Enter しか送れない

スマホの画面上キーボードには Shift+Enter が無く、Android では Return キーが通常の Enter ですらないことが多い。そのためスマホでは:

複数行の指示はリモートビューの入力欄から送る形になる。

IME 変換中は影響しない

変換中の Enter は変換の確定として扱われ、どちらのモードでも送信にも改行にもならない。日本語で AI に指示を出すときに「変換候補を確定しようとした Enter が送信されてしまう」は起きない。

ボタンから起動したセッションの最初のプロンプトも、この設定に従う

最初のプロンプト入りで起動したセッション——Skill の起動ボタン、コレクションやカスタムビューから開いたチャット——は、そのプロンプトが入力欄に打ち込まれて代わりに送信される。この送信も terminalSubmit に従う。

設定を間違えていると、「ボタンから起動したのに送信されていない」という症状が出る。一見別の不具合に見えるので、ここが繋がっていると知っていると早く直せる。

使ってみる

MulmoTerminal の立ち上げ方は MulmoTerminal 完全ガイド から。既に動いていれば、設定画面でそのまま試せる。

動作確認の最小シナリオ:

  1. 症状を確認する——Claude Code のセッションで Shift+Enter を押して、改行ではなく送信されるか
  2. 送信されるなら、Settings → Terminal keys で terminalSubmit を esc-cr 側に切り替える
  3. ブラウザのタブを再読み込み、アプリを再起動
  4. Shift+Enter で改行が入り、素の Enter で送信されれば成功

やめるときは、設定を "cr" に戻すか項目を消す。使えない値を書いても既定に戻るだけで、Enter が壊れることは無い。

まとめ

関連: MulmoTerminal 公式ガイドの Enter — 送信と改行 / MulmoTerminal のキーボードショートカット(keymap) / xterm.js で Shift+Enter の preventDefault を取る

この記事をシェア

関連記事

記事一覧に戻る