StoneRen

修复claude code中换行问题

Mar 01, 2026

记录一次 Claude Code 更新后,Shift+Enter 换行失效的排查过程。

问题描述

在使用 Claude Code CLI 时,Shift+EnterCmd+Enter 原本可以在输入框中插入换行,但某次更新后,这两个快捷键都变成了直接提交消息。

根本原因

Claude Code 使用自己的 TUI 输入库(基于 React/Ink),不走系统的 readline

在某个版本更新后,普通终端发送的 Shift+Enter 信号与 Enter 无法被区分,导致直接提交。

这不是:

  • macOS 系统问题
  • shell 配置问题(.zshrc / .inputrc
  • 终端字体或显示问题

解决思路

问题的核心在于:终端是否能将 Shift+Enter 转换为 Claude Code 可识别的转义序列 \x1b[13;2u(kitty keyboard protocol)。

终端支持自定义按键映射解决可能性
WezTerm已有方案
iTerm2同 WezTerm
VSCode 终端✅(sendSequence)已有方案
Mac 自带 Terminal建议换终端

各终端解决方案

WezTerm

~/.config/wezterm/wezterm.luaconfig.keys 中添加:

-- 解决 shift+enter 不能在 claude code 中换行的问题
{
    key = "Enter",
    mods = "SHIFT",
    action = act.SendString("\x1b[13;2u"),
},

VSCode / Kiro 内置终端

打开 keybindings.jsonCmd+Shift+POpen Keyboard Shortcuts (JSON)),添加:

{
    "key": "shift+enter",
    "command": "workbench.action.terminal.sendSequence",
    "args": { "text": "\u001b[13;2u" },
    "when": "terminalFocus"
}

iTerm2

PreferencesProfilesKeys → 添加新映射:

  • Keyboard Shortcut: Shift+Enter
  • Action: Send Escape Sequence
  • Value: [13;2u

Mac 自带 Terminal

不支持自定义转义序列映射,建议换用 WezTerm 或 iTerm2。

临时替代方案

如果暂时无法配置终端,可以用以下方式换行:

  • 在行尾输入 \ 然后按 Enter(续行符)
  • 使用 Ctrl+J(readline 传统换行)

总结

本质是 Claude Code 更新后依赖 kitty keyboard protocol 来区分 EnterShift+Enter。只要让终端发送正确的转义序列 \x1b[13;2u,问题即可解决。

PRESENT 2026 ©StoneRenver:2603052204