tui(run): use keymap instead of raw key events (#30077)

Co-authored-by: Sebastian Herrlinger <hasta84@gmail.com>
This commit is contained in:
Simon Klee
2026-05-31 10:58:12 +02:00
committed by GitHub
parent a291967206
commit e8dd8f7fe0
19 changed files with 760 additions and 891 deletions

View File

@@ -7,32 +7,10 @@ import {
isNewCommand,
mentionTriggerIndex,
movePromptHistory,
printableBinding,
promptCycle,
promptHit,
promptInfo,
promptKeys,
pushPromptHistory,
} from "@/cli/cmd/run/prompt.shared"
import type { RunPrompt } from "@/cli/cmd/run/types"
function bindings(...keys: string[]) {
return keys.map((key) => ({ key }))
}
const keybinds = {
leader: "ctrl+x",
leaderTimeout: 2000,
commandList: bindings("ctrl+p"),
variantCycle: bindings("ctrl+t", "<leader>t"),
interrupt: bindings("escape"),
historyPrevious: bindings("up"),
historyNext: bindings("down"),
inputClear: bindings("ctrl+c"),
inputSubmit: bindings("return"),
inputNewline: bindings("shift+return,ctrl+return,alt+return,ctrl+j"),
}
function prompt(text: string, parts: RunPrompt["parts"] = []): RunPrompt {
return { text, parts }
}
@@ -141,39 +119,6 @@ describe("run prompt shared", () => {
expect(mentionTriggerIndex("中文 @src file")).toBeUndefined()
})
test("handles direct and leader-based variant cycling", () => {
const keys = promptKeys(keybinds)
expect(promptHit(keys.clear, promptInfo({ name: "c", ctrl: true }))).toBe(true)
expect(promptCycle(false, promptInfo({ name: "x", ctrl: true }), keys.leaders, keys.cycles)).toEqual({
arm: true,
clear: false,
cycle: false,
consume: true,
})
expect(promptCycle(true, promptInfo({ name: "t" }), keys.leaders, keys.cycles)).toEqual({
arm: false,
clear: true,
cycle: true,
consume: true,
})
expect(promptCycle(false, promptInfo({ name: "t", ctrl: true }), keys.leaders, keys.cycles)).toEqual({
arm: false,
clear: false,
cycle: true,
consume: true,
})
})
test("prints bindings with leader substitution and esc normalization", () => {
expect(printableBinding(keybinds.variantCycle.slice(1), "ctrl+x")).toBe("ctrl+x t")
expect(printableBinding(keybinds.interrupt, "ctrl+x")).toBe("esc")
expect(printableBinding([], "ctrl+x")).toBe("")
})
test("recognizes exit commands", () => {
expect(isExitCommand("/exit")).toBe(true)
expect(isExitCommand(" /Quit ")).toBe(true)