From ee16f08ffa35d564cf9a7149a69c43e8a6817b3f Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 19 May 2026 13:52:00 +0200 Subject: [PATCH] Fix legacy pgup/pgdown TUI keybind aliases (#28275) --- packages/opencode/src/cli/cmd/tui/keymap.tsx | 2 + .../opencode/test/cli/tui/keymap.test.tsx | 54 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 packages/opencode/test/cli/tui/keymap.test.tsx diff --git a/packages/opencode/src/cli/cmd/tui/keymap.tsx b/packages/opencode/src/cli/cmd/tui/keymap.tsx index 289bb901d6..41a7b08612 100644 --- a/packages/opencode/src/cli/cmd/tui/keymap.tsx +++ b/packages/opencode/src/cli/cmd/tui/keymap.tsx @@ -29,6 +29,8 @@ export type OpenTuiKeymap = ReturnType const KEY_ALIASES = { enter: "return", esc: "escape", + pgdown: "pagedown", + pgup: "pageup", } as const function expandKeyAliases(input: string) { diff --git a/packages/opencode/test/cli/tui/keymap.test.tsx b/packages/opencode/test/cli/tui/keymap.test.tsx new file mode 100644 index 0000000000..82cd72d6c8 --- /dev/null +++ b/packages/opencode/test/cli/tui/keymap.test.tsx @@ -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 = {} + + 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 ( + + + + ) + } + + const app = await testRender(() => ) + try { + expect(sequences).toEqual({ + up: [["pageup"]], + down: [["pagedown"]], + }) + } finally { + app.renderer.destroy() + } +})