Skip to content

Commit 0a34183

Browse files
committed
fix: preserve uppercase in vim replace mode
1 parent 56bf3b8 commit 0a34183

2 files changed

Lines changed: 12 additions & 0 deletions

File tree

packages/opencode/src/cli/cmd/tui/component/vim/vim-handler.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ export function createVimHandler(input: {
120120

121121
function value(event: VimEvent) {
122122
if (event.name === "space") return " "
123+
if (event.shift && event.name?.length === 1 && /[a-z]/.test(event.name)) return event.name.toUpperCase()
123124
return event.name ?? ""
124125
}
125126

packages/opencode/test/cli/tui/vim-motions.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1611,6 +1611,17 @@ describe("vim motion handler", () => {
16111611
expect(ctx.state.mode()).toBe("replace")
16121612
})
16131613

1614+
test("replace mode preserves shifted uppercase letters", () => {
1615+
const ctx = createHandler("abcd", { mode: "replace" })
1616+
ctx.textarea.cursorOffset = 1
1617+
1618+
const key = createEvent("x", { shift: true })
1619+
expect(ctx.handler.handleKey(key.event)).toBe(true)
1620+
expect(key.prevented()).toBe(true)
1621+
expect(ctx.textarea.plainText).toBe("aXcd")
1622+
expect(ctx.textarea.cursorOffset).toBe(2)
1623+
})
1624+
16141625
test("replace mode overwrites with space key", () => {
16151626
const ctx = createHandler("abcd", { mode: "replace" })
16161627
ctx.textarea.cursorOffset = 1

0 commit comments

Comments
 (0)