Skip to content

fix(tui): 命令面板换绑 Ctrl+P(Ctrl+Esc 在 Windows 被开始菜单抢占且三条送达路径全断) - #41

Closed
yq04 wants to merge 1 commit into
huiliyi37:mainfrom
yq04:fix/palette-hotkey-ctrl-p
Closed

fix(tui): 命令面板换绑 Ctrl+P(Ctrl+Esc 在 Windows 被开始菜单抢占且三条送达路径全断)#41
yq04 wants to merge 1 commit into
huiliyi37:mainfrom
yq04:fix/palette-hotkey-ctrl-p

Conversation

@yq04

@yq04 yq04 commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

问题

命令面板原绑定 Ctrl+Esc,三条送达路径全部断裂,实测在任何终端都不可用:

路径 结果
Windows 宿主 Ctrl+Esc 被系统抢占(打开开始菜单),按键事件根本到不了终端
传统转义序列 Ctrl+Esc 与单独 Esc 同码(0x1B),解析层不可区分(input-handler.ts 的 lone-ESC 派发恒为 ctrl: false
kitty 增强键盘 Ctrl+Esc 编码 \x1B[27;5uresolveEscapeSequence 未映射该码位 → unknown

app.tsescape + ctrl 分支在当前解析器下不可达——面板实际上只能通过程序化 activateOverlay 打开。

方案

Ctrl+P(0x10 单控制字符) 作为命令面板开关,所有终端可靠送达:

  • :空闲或任意 overlay 激活时按 Ctrl+P → 激活命令面板(复用 activateOverlay 统一入口:live.clear() 防叠影 + resetNav + overlay 内 Esc 即时派发)
  • :面板已开时再按 Ctrl+P → 关闭(toggle 语义)
  • 切换:其他 overlay(如 history-search)开着时按 Ctrl+P → 切到命令面板

历史回溯入口不受影响(Ctrl+P 原为 InputLine 的 historyPrev):

  • 单行 / 翻历史(原有行为不变)
  • Ctrl+N 下一条(readline 对偶保留)
  • Ctrl+R 全屏历史搜索 overlay(多行编辑时方向键只做行间导航的防误触设计不变,翻上一条历史经 Ctrl+R 可达)

escape + ctrl 分支保留不删——当前不可达但无害,若未来解析器补充 kitty \x1B[27;5u 映射即可复用。

行业对照

  • codex(Rust TUI):ctrl+p 为列表 move_up 别名(keymap.rs)——readline 惯例键位,无命令面板
  • grok-build:textarea 库 ctrl_p_moves_cursor_up(readline 惯例),无命令面板
  • kimi-cli / Claude Code:均无命令面板(斜杠命令为主),无一使用 Ctrl+Esc 做 TUI 快捷键

测试

  • 新增 palette-hotkey.test.ts 6 条契约(原始 stdin 字节 \x10 注入,走完整解析链):打开 / toggle 关闭 / 从其他 overlay 切换 / 不打扰输入框草稿 / InputLine 不再响应 ctrl_p / Ctrl+N 保留
  • 更新 engine-input-line.test.ts 多行 Ctrl+P 旧契约为新契约
  • 引擎域 522 测试 520 通过(1 失败为预存在的 approval-key.test.ts Windows 路径判定问题,上游基线同样失败)
  • tui 全域失败集合与基线完全一致,零新增失败
  • 键位文档同步:/help 文本、首屏 tips、README 中英文

…码/kitty 27;5u 未映射)

- app.ts 全局快捷键新增 ctrl_p:开关命令面板(已开则关,其他 overlay 开着则切换),复用 activateOverlay 统一入口(live.clear 防叠影 + resetNav + Esc 即时派发)
- input-line.ts 移除 ctrl_p→historyPrev(Ctrl+P 让位);ctrl_n 保留 readline 对偶;多行翻历史经 Ctrl+R 兜底
- 原 escape+ctrl 分支保留(当前解析器不可达,留给未来 kitty 增强键盘映射)
- 键位文档同步:slash-commands /help、welcome 首屏 tips、README 双语
- 新增 palette-hotkey.test.ts 6 条契约(真实 stdin 字节注入,0x10 走完整解析链);更新 engine-input-line 多行 ctrl_p 旧契约为新契约
@huiliyi37

Copy link
Copy Markdown
Owner

已回合 dev 主线(cherry-pick 保留作者署名):81d16bc34

验证:typecheck 通过;新增 palette-hotkey 6 条契约全绿;TUI 域 2213 测试 0 失败;与后续 slash 提示分层(#45)的组合也已联合验证(footer 引用 ctrl+p 一致)。

内容将随下次 sync 进入公开仓 main。Ctrl+Esc 三条送达路径的排查(Windows 宿主抢占 / 0x1B 同码 / kitty 27;5u 未映射)很到位。

@huiliyi37 huiliyi37 closed this Aug 16, 2026
huiliyi37 added a commit that referenced this pull request Aug 17, 2026
排队消息语义对齐 / 命令面板 Ctrl+P 换绑 / Ctrl+C 退出确认可取消 / 跨 run
陈旧 todo 清单不复活 / slash 提示核心层分层。均附根因分析与 RED→GREEN
测试基线,随 v3.4.0 发布。

Co-authored-by: yq04 <143403280+yq04@users.noreply.github.com>
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