Skip to content

Commit 5fbe66e

Browse files
author
SqlRush
committed
Accept backtab keybinding aliases
1 parent 664ba3a commit 5fbe66e

5 files changed

Lines changed: 13 additions & 3 deletions

File tree

docs/cc-100-roadmap.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ M7 补充:keybinding action parser 现在接受更多 editor/global-style acti
154154

155155
M7 补充:keybinding config 和脚本 named-key 输入现在接受短修饰符别名,包括 `c-`/`m-`/`a-`/`opt-`/`s-` 以及 compact/camel 形式,可覆盖 control、meta、alt、option 和 shift key names。
156156

157+
M7 补充:keybinding config 和脚本 named-key 输入现在接受 `backtab`/`back-tab`/`btab` 等 Shift-Tab terminfo/fixture 别名,并映射到既有 focus-previous key surface。
158+
157159
M7 补充:interaction script 的 `keys` 字段现在支持 printable text chunk 和空格分隔 named-key sequence,例如 `ctrl-x ctrl-k`,减少官方脚本把连续输入拆成数组的改写成本。
158160

159161
M7 补充:interaction script key input 现在接受 press-style aliases,包括 `press``keyPress``keypress``shortcutKey``presses``keyPresses``shortcuts`
@@ -478,6 +480,8 @@ M7 补充:prompt history `LogEntry` 读取现在接受 `sessionID`/`session`/`
478480

479481
本轮补充:keybinding config 和脚本 named-key 输入现在接受短修饰符别名,包括 `c-`/`m-`/`a-`/`opt-`/`s-` 以及 compact/camel 形式,可覆盖 control、meta、alt、option 和 shift key names。
480482

483+
本轮补充:keybinding config 和脚本 named-key 输入现在接受 `backtab`/`back-tab`/`btab` 等 Shift-Tab terminfo/fixture 别名,并映射到既有 focus-previous key surface。
484+
481485
本轮补充:interaction script 的 `keys` 字段现在支持 printable text chunk 和空格分隔 named-key sequence,例如 `ctrl-x ctrl-k`,减少官方脚本把连续输入拆成数组的改写成本。
482486

483487
本轮补充:interaction script key input 现在接受 press-style aliases,包括 `press``keyPress``keypress``shortcutKey``presses``keyPresses``shortcuts`

docs/claude-code-go-rewrite-plan.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ test/parity/ # golden tests against TS/official behavior
264264
- 本轮补充:keybinding config 和脚本 named-key 输入接受 DOM-style arrow key aliases,包括 `arrowLeft`/`arrowRight`/`arrowUp`/`arrowDown` 以及 ctrl/alt/meta/option arrow variants。
265265
- 本轮补充:keybinding action parser 接受更多 editor/global-style action aliases,包括 `cursorLeft`/`cursorRight``lineStart`/`lineEnd``deletePreviousChar`/`deleteNextChar``killLine``pasteKillRing`/`yankPrevious``clearScreen``openExternalEditor``toggleTasks``cancelAgents``focusPrev``acceptSelection``search`
266266
- 本轮补充:keybinding config 和脚本 named-key 输入接受短修饰符别名,包括 `c-`/`m-`/`a-`/`opt-`/`s-` 以及 compact/camel 形式,可覆盖 control、meta、alt、option 和 shift key names。
267+
- 本轮补充:keybinding config 和脚本 named-key 输入现在接受 `backtab`/`back-tab`/`btab` 等 Shift-Tab terminfo/fixture 别名,并映射到既有 focus-previous key surface。
267268
- 本轮补充:interaction script 的 `keys` 字段支持 printable text chunk 和空格分隔 named-key sequence,例如 `ctrl-x ctrl-k`,减少官方脚本把连续输入拆成数组的改写成本。
268269
- 本轮补充:interaction script key input 接受 press-style aliases,包括 `press``keyPress``keypress``shortcutKey``presses``keyPresses``shortcuts`
269270
- 本轮补充:terminal CSI-u/kitty keyboard parser 接受 `codepoint:alternate``modifier:event-type` 冒号字段,按主 codepoint/modifier 解析 ctrl/alt/shift/rune 键,覆盖 kitty progressive keyboard protocol 的常见变体。

docs/first-second-parity-audit.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ M7 progress now includes:
256256
- `internal/tui`: keybinding config and named-key script input now accept DOM-style arrow key aliases such as `arrowLeft`, `arrowRight`, `arrowUp`, `arrowDown`, and modifier-arrow variants.
257257
- `internal/tui`: keybinding action parsing now accepts broader editor/global-style aliases such as `cursorLeft`, `lineStart`, `deletePreviousChar`, `killLine`, `pasteKillRing`, `clearScreen`, `openExternalEditor`, `toggleTasks`, `cancelAgents`, `focusPrev`, `acceptSelection`, and `search`.
258258
- `internal/tui`: keybinding config and named-key script input now accept short modifier aliases such as `c-left`, `cA`, `m-b`, `a-right`, `optF`, `s-tab`, and `sEnter`.
259+
- `internal/tui`: keybinding config and named-key script input now accept Shift-Tab terminfo aliases such as `backtab`, `back-tab`, and `btab`, mapping them to the existing focus-previous key surface.
259260
- `internal/tui`: scripted interaction `keys` entries now accept printable text chunks and whitespace-separated named key sequences such as `ctrl-x ctrl-k`.
260261
- `internal/tui`: scripted interaction key input now accepts press-style aliases such as `press`, `keyPress`, `keypress`, `shortcutKey`, `presses`, `keyPresses`, and `shortcuts`.
261262
- `internal/tui`: terminal key parsing now accepts CSI-u/kitty keyboard protocol sequences for existing ctrl/alt editing keys, shift-enter, shift-tab, and printable shift-only runes.

internal/tui/keybinding_config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func ParseKeyName(raw string) (KeyType, error) {
120120
return KeyEnd, nil
121121
case "tab", "ctrl+i", "ctrl-i", "control+i", "control-i":
122122
return KeyTab, nil
123-
case "shift+tab", "shift-tab":
123+
case "shift+tab", "shift-tab", "backtab", "back-tab", "btab":
124124
return KeyShiftTab, nil
125125
case "ctrl+a", "ctrl-a", "control+a", "control-a":
126126
return KeyCtrlA, nil
@@ -178,7 +178,7 @@ func ParseKeyName(raw string) (KeyType, error) {
178178
return KeyEsc, nil
179179
case "shiftenter", "shiftreturn":
180180
return KeyShiftEnter, nil
181-
case "shifttab":
181+
case "shifttab", "backtab", "btab":
182182
return KeyShiftTab, nil
183183
case "altb", "metab", "optionb":
184184
return KeyAltB, nil

internal/tui/tui_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1358,6 +1358,7 @@ func TestKeymapFromSpecsOverridesAndRemovesBindings(t *testing.T) {
13581358
{Key: "ctrl-h", Action: ActionDeleteWordBack},
13591359
{Key: "ctrl-i", Action: ActionPageDown},
13601360
{Key: "ctrl-m", Action: ActionSubmitPrompt},
1361+
{Key: "btab", Action: ActionFocusPrevious},
13611362
})
13621363
if err != nil {
13631364
t.Fatal(err)
@@ -1389,6 +1390,9 @@ func TestKeymapFromSpecsOverridesAndRemovesBindings(t *testing.T) {
13891390
if action := keymap.Resolve(ParseKey("\n")); action != ActionSubmitPrompt {
13901391
t.Fatalf("ctrl-m terminal alias action = %q", action)
13911392
}
1393+
if action := keymap.Resolve(ParseKey("\x1b[Z")); action != ActionFocusPrevious {
1394+
t.Fatalf("btab alias action = %q", action)
1395+
}
13921396
for _, tc := range []struct {
13931397
name string
13941398
want Action
@@ -1443,7 +1447,7 @@ func TestKeymapFromSpecsOverridesAndRemovesBindings(t *testing.T) {
14431447
t.Fatalf("ParseActionName(%q) = %q, %v", tc.name, action, err)
14441448
}
14451449
}
1446-
for _, name := range []string{"paste", "image-hint", "mouse", "focus-out", "shift-enter", "shift+return", "shiftEnter", "shiftReturn", "shiftTab", "s-tab", "sTab", "s-enter", "sReturn", "page-up", "pgup", "pg-up", "prior", "page-down", "pgdn", "pg-dn", "pgdown", "pg-down", "next", "arrowLeft", "arrowRight", "arrowUp", "arrowDown", "alt-b", "alt-d", "alt-f", "alt-y", "alt-backspace", "alt-left", "alt-right", "alt-arrow-left", "alt-arrow-right", "altB", "metaD", "optionF", "altY", "altBackspace", "altLeft", "optionRight", "altArrowLeft", "metaArrowRight", "optionArrowLeft", "m-b", "mB", "a-d", "aD", "opt-f", "optF", "m-left", "m-arrow-left", "mArrowLeft", "a-right", "aArrowRight", "optRight", "optArrowRight", "meta-b", "meta-d", "meta-f", "meta-y", "meta-backspace", "meta-left", "meta-right", "option-arrow-left", "option-arrow-right", "ctrl-b", "ctrl-d", "ctrl-f", "ctrl-g", "ctrl-u", "ctrl-k", "ctrl-l", "ctrl-n", "ctrl-o", "ctrl-p", "ctrl-s", "ctrl-t", "ctrl-w", "ctrl-x", "ctrl-y", "ctrl-h", "ctrl-i", "ctrl-m", "control-h", "control-i", "control-m", "c-h", "c-i", "c-m", "c-[", "c-?", "ctrlH", "controlI", "ctrlM", "cH", "cI", "cM", "ctrl-left", "ctrl-right", "ctrl-arrow-left", "ctrl-arrow-right", "ctrlArrowLeft", "controlArrowRight", "c-left", "c-arrow-left", "c-right", "c-arrow-right", "ctrlA", "controlX", "ctrlLeft", "controlRight", "cA", "cLeft", "cArrowRight", "control-left", "control-right", "control-arrow-left", "control-arrow-right"} {
1450+
for _, name := range []string{"paste", "image-hint", "mouse", "focus-out", "shift-enter", "shift+return", "shiftEnter", "shiftReturn", "shiftTab", "backtab", "back-tab", "backTab", "btab", "s-tab", "sTab", "s-enter", "sReturn", "page-up", "pgup", "pg-up", "prior", "page-down", "pgdn", "pg-dn", "pgdown", "pg-down", "next", "arrowLeft", "arrowRight", "arrowUp", "arrowDown", "alt-b", "alt-d", "alt-f", "alt-y", "alt-backspace", "alt-left", "alt-right", "alt-arrow-left", "alt-arrow-right", "altB", "metaD", "optionF", "altY", "altBackspace", "altLeft", "optionRight", "altArrowLeft", "metaArrowRight", "optionArrowLeft", "m-b", "mB", "a-d", "aD", "opt-f", "optF", "m-left", "m-arrow-left", "mArrowLeft", "a-right", "aArrowRight", "optRight", "optArrowRight", "meta-b", "meta-d", "meta-f", "meta-y", "meta-backspace", "meta-left", "meta-right", "option-arrow-left", "option-arrow-right", "ctrl-b", "ctrl-d", "ctrl-f", "ctrl-g", "ctrl-u", "ctrl-k", "ctrl-l", "ctrl-n", "ctrl-o", "ctrl-p", "ctrl-s", "ctrl-t", "ctrl-w", "ctrl-x", "ctrl-y", "ctrl-h", "ctrl-i", "ctrl-m", "control-h", "control-i", "control-m", "c-h", "c-i", "c-m", "c-[", "c-?", "ctrlH", "controlI", "ctrlM", "cH", "cI", "cM", "ctrl-left", "ctrl-right", "ctrl-arrow-left", "ctrl-arrow-right", "ctrlArrowLeft", "controlArrowRight", "c-left", "c-arrow-left", "c-right", "c-arrow-right", "ctrlA", "controlX", "ctrlLeft", "controlRight", "cA", "cLeft", "cArrowRight", "control-left", "control-right", "control-arrow-left", "control-arrow-right"} {
14471451
if key, err := ParseKeyName(name); err != nil || key == KeyUnknown {
14481452
t.Fatalf("ParseKeyName(%q) = %q, %v", name, key, err)
14491453
}

0 commit comments

Comments
 (0)