Skip to content

Commit f8e838f

Browse files
committed
Try alternative normalizeKey
1 parent c093cc1 commit f8e838f

File tree

3 files changed

+27
-29
lines changed

3 files changed

+27
-29
lines changed

packages/opencode/src/cli/cmd/tui/context/keybind.tsx

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,6 @@ export const { use: useKeybind, provider: KeybindProvider } = createSimpleContex
7474
return store.leader
7575
},
7676
parse(evt: ParsedKey): Keybind.Info {
77-
if (evt.name === "\x00") {
78-
return Keybind.fromParsedKey({ ...evt, name: "space", ctrl: true }, store.leader)
79-
}
80-
// Handle special case for Ctrl+Underscore (represented as \x1F)
81-
if (evt.name === "\x1F") {
82-
return Keybind.fromParsedKey({ ...evt, name: "_", ctrl: true }, store.leader)
83-
}
8477
return Keybind.fromParsedKey(evt, store.leader)
8578
},
8679
match(key: keyof KeybindsConfig, evt: ParsedKey) {

packages/opencode/src/util/keybind.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ export namespace Keybind {
1010
leader: boolean // our custom field
1111
}
1212

13-
const normalizeName = (name: string | undefined) => {
14-
if (name === "\x00") return "space"
15-
if (name === " ") return "space"
16-
return name ?? ""
13+
const normalizeKey = (key: ParsedKey): ParsedKey => {
14+
if (key.name === "\x00") return { ...key, name: "space", ctrl: true }
15+
if (key.name === "\x1F") return { ...key, name: "_", ctrl: true }
16+
if (key.name === " ") return { ...key, name: "space" }
17+
return key
1718
}
1819

1920
export function match(a: Info, b: Info): boolean {
@@ -28,12 +29,13 @@ export namespace Keybind {
2829
* This helper ensures all required fields are present and avoids manual object creation.
2930
*/
3031
export function fromParsedKey(key: ParsedKey, leader = false): Info {
32+
const normalized = normalizeKey(key)
3133
return {
32-
name: normalizeName(key.name),
33-
ctrl: key.ctrl,
34-
meta: key.meta,
35-
shift: key.shift,
36-
super: key.super ?? false,
34+
name: normalized.name ?? "",
35+
ctrl: normalized.ctrl,
36+
meta: normalized.meta,
37+
shift: normalized.shift,
38+
super: normalized.super ?? false,
3739
leader,
3840
}
3941
}

packages/opencode/test/keybind.test.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { describe, test, expect } from "bun:test"
2+
import type { ParsedKey } from "@opentui/core"
23
import { Keybind } from "../src/util/keybind"
34

45
describe("Keybind.toString", () => {
@@ -186,6 +187,21 @@ describe("Keybind.match", () => {
186187
})
187188
})
188189

190+
describe("Keybind.fromParsedKey", () => {
191+
test("should normalize ctrl+space NUL", () => {
192+
const key = { name: "\x00", ctrl: false, meta: false, shift: false, super: false } as ParsedKey
193+
const result = Keybind.fromParsedKey(key)
194+
expect(result).toEqual({
195+
ctrl: true,
196+
meta: false,
197+
shift: false,
198+
super: false,
199+
leader: false,
200+
name: "space",
201+
})
202+
})
203+
})
204+
189205
describe("Keybind.parse", () => {
190206
test("should parse simple key", () => {
191207
const result = Keybind.parse("f")
@@ -226,19 +242,6 @@ describe("Keybind.parse", () => {
226242
])
227243
})
228244

229-
test("should parse ctrl+space", () => {
230-
const result = Keybind.parse("ctrl+space")
231-
expect(result).toEqual([
232-
{
233-
ctrl: true,
234-
meta: false,
235-
shift: false,
236-
leader: false,
237-
name: "space",
238-
},
239-
])
240-
})
241-
242245
test("should parse multiple modifiers", () => {
243246
const result = Keybind.parse("ctrl+alt+u")
244247
expect(result).toEqual([

0 commit comments

Comments
 (0)