Skip to content

fix: Windows Terminal Shift+Enter 无法换行 — 改用动态 modifier 位解析#70

Merged
qorzj merged 3 commits into
lessweb:mainfrom
dengmik-commits:main
May 16, 2026
Merged

fix: Windows Terminal Shift+Enter 无法换行 — 改用动态 modifier 位解析#70
qorzj merged 3 commits into
lessweb:mainfrom
dengmik-commits:main

Conversation

@dengmik-commits
Copy link
Copy Markdown
Contributor

@dengmik-commits dengmik-commits commented May 15, 2026

问题

Windows Terminal 下 Shift+Enter 无法换行,行为等同于普通回车,直接提交输入。

此问题在 #52 (e56a112) 中曾尝试修复,当时添加了 enableTerminalExtendedKeys(xterm modifyOtherKeys level 1)和两个额外序列(�[13;2~�[27;2;13~)。

#52 为什么没修好

根本原因是 SHIFT_RETURN_SEQUENCES 使用精确字符串匹配Set.has())来比对 modifier 值。xterm 标准中 Shift 修饰键 = 2,序列为 �[13;2u。但 Windows Terminal 会在 modifier 上附加额外的标志位,实际发送的序列是:

�[13;130u    (modifier = 130 = 128 + 2)

其中 128 是终端特有的标志位。130 & 2 === 2,Shift 确实被按下了——但精确字符串 �[13;130u 不在 Set 中,被视为未知转义序列,key.meta 被设为 true,按键被静默丢弃。

此外,仅靠 xterm modifyOtherKeys�[>4;1m)不够——Windows Terminal 需要 Kitty 渐进增强协议(�[>1u)才会以 CSI 格式上报修饰键。

修复内容

改动两个文件:

src/ui/prompt/useTerminalInput.ts

  • isShiftReturn(raw) — 动态解析 CSI 序列,提取 modifier 参数,用 (mod & 2) !== 0 按位检测 Shift。不关心 terminal 附加的其他标志位,能匹配 2、6、130 等任意包含 Shift 位的 modifier 值。

  • isReturn(raw) — 识别任意 CSI 格式的 Enter(�[13u�[13;\d+u 等),兜底处理终端将 Enter 转义为 CSI 格式的情况。

  • 两个函数都优先回退到已有的 SHIFT_RETURN_SEQUENCESMETA_RETURN_SEQUENCES Set,保证向后兼容。

  • key.return 检测简化为 isReturn(raw)key.shift 检测使用 isShiftReturn(raw)

src/ui/prompt/cursor.ts

  • enableTerminalExtendedKeys() 同时发送 xterm modifyOtherKeys�[>4;1m)和 Kitty 渐进增强(�[>1u)。终端会忽略不认识的序列,同时发送两者安全无副作用。

  • disableTerminalExtendedKeys() 发送对应的关闭序列(�[>4;0m + �[<u)。

验证

诊断脚本确认 Windows Terminal 对 Shift+Enter 发送 �[13;130u。已在 Windows Terminal 的 PowerShell 和 CMD 标签页中实测通过。

…rminal compatibility

SHIFT_RETURN_SEQUENCES now covers both xterm modifyOtherKeys (Shift=2)
and Kitty keyboard protocol (Shift=1) encodings. Also clear input when
key.return is true to prevent escape sequence artifacts from leaking
into the text buffer.
Replace exact string matching in SHIFT_RETURN_SEQUENCES with CSI
parameter parsing that checks modifier bits. Windows Terminal sends
ESC[13;130u (modifier=128+2) where 128 is a terminal-specific flag —
the old code only matched modifier=2 exactly.

Also enable Kitty progressive enhancement (ESC[>1u) alongside xterm
modifyOtherKeys, since Windows Terminal requires the Kitty protocol
to report modified keys.
@dengmik-commits dengmik-commits changed the title fix: Shift+Enter not working on Windows Terminal — use dynamic modifier bit parsing fix: Windows Terminal Shift+Enter 无法换行 — 改用动态 modifier 位解析 May 15, 2026
@qorzj qorzj merged commit b2a0a09 into lessweb:main May 16, 2026
qorzj added a commit that referenced this pull request May 16, 2026
@qorzj
Copy link
Copy Markdown
Collaborator

qorzj commented May 16, 2026

@dengmik-commits 这个PR在main分支已被revert。原因是发现几个问题:

  1. ctrl+j换行功能消失了
  2. 按esc无法中断会话,也无法终止正在执行的shell进程
  3. 按ctrl+c无法中断会话,也无法终止正在执行的shell进程

后两个问题属于P0问题,只能以回滚处理。
终端环境:macOS iTerm2

dengmik-commits added a commit to dengmik-commits/deepcode-cli that referenced this pull request May 18, 2026
… sync

Upstream v0.1.21 reverted PR lessweb#70. Re-apply:
- isShiftReturn() / isReturn() dynamic CSI modifier bit parsing
- Kitty progressive enhancement (ESC[>1u) alongside xterm modifyOtherKeys
- Clear input when key.return is true (safety net)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants