记录一次 Claude Code 更新后,Shift+Enter 换行失效的排查过程。
问题描述
在使用 Claude Code CLI 时,Shift+Enter 和 Cmd+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.lua 的 config.keys 中添加:
-- 解决 shift+enter 不能在 claude code 中换行的问题
{
key = "Enter",
mods = "SHIFT",
action = act.SendString("\x1b[13;2u"),
},VSCode / Kiro 内置终端
打开 keybindings.json(Cmd+Shift+P → Open Keyboard Shortcuts (JSON)),添加:
{
"key": "shift+enter",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "\u001b[13;2u" },
"when": "terminalFocus"
}iTerm2
Preferences → Profiles → Keys → 添加新映射:
- Keyboard Shortcut:
Shift+Enter - Action:
Send Escape Sequence - Value:
[13;2u
Mac 自带 Terminal
不支持自定义转义序列映射,建议换用 WezTerm 或 iTerm2。
临时替代方案
如果暂时无法配置终端,可以用以下方式换行:
- 在行尾输入
\然后按 Enter(续行符) - 使用
Ctrl+J(readline 传统换行)
总结
本质是 Claude Code 更新后依赖 kitty keyboard protocol 来区分 Enter 和 Shift+Enter。只要让终端发送正确的转义序列 \x1b[13;2u,问题即可解决。