Fix legacy pgup/pgdown TUI keybind aliases (#28275)

This commit is contained in:
Sebastian
2026-05-19 13:52:00 +02:00
committed by GitHub
parent 9790a61f96
commit ee16f08ffa
2 changed files with 56 additions and 0 deletions

View File

@@ -29,6 +29,8 @@ export type OpenTuiKeymap = ReturnType<typeof useKeymap>
const KEY_ALIASES = {
enter: "return",
esc: "escape",
pgdown: "pagedown",
pgup: "pageup",
} as const
function expandKeyAliases(input: string) {

View File

@@ -0,0 +1,54 @@
/** @jsxImportSource @opentui/solid */
import { createDefaultOpenTuiKeymap } from "@opentui/keymap/opentui"
import { testRender, useRenderer } from "@opentui/solid"
import { expect, test } from "bun:test"
import { onCleanup } from "solid-js"
import { createTuiResolvedConfig } from "../../fixture/tui-runtime"
import { OpencodeKeymapProvider, registerOpencodeKeymap } from "@/cli/cmd/tui/keymap"
test("legacy page key aliases compile as page keys", async () => {
const sequences: Record<string, string[][]> = {}
function Harness() {
const renderer = useRenderer()
const keymap = createDefaultOpenTuiKeymap(renderer)
const config = createTuiResolvedConfig({
keybinds: {
messages_page_up: "pgup",
messages_page_down: "pgdown",
},
})
const offKeymap = registerOpencodeKeymap(keymap, renderer, config)
const offLayer = keymap.registerLayer({
bindings: config.keybinds.gather("session", ["session.page.up", "session.page.down"]),
})
const bindings = keymap.getCommandBindings({
visibility: "registered",
commands: ["session.page.up", "session.page.down"],
})
sequences.up =
bindings.get("session.page.up")?.map((binding) => binding.sequence.map((part) => part.stroke.name)) ?? []
sequences.down =
bindings.get("session.page.down")?.map((binding) => binding.sequence.map((part) => part.stroke.name)) ?? []
onCleanup(() => {
offLayer()
offKeymap()
})
return (
<OpencodeKeymapProvider keymap={keymap}>
<box />
</OpencodeKeymapProvider>
)
}
const app = await testRender(() => <Harness />)
try {
expect(sequences).toEqual({
up: [["pageup"]],
down: [["pagedown"]],
})
} finally {
app.renderer.destroy()
}
})