Skip to content

Commit cf313cd

Browse files
committed
fix: overwrite character under cursor with space in replace mode
1 parent d24bd11 commit cf313cd

2 files changed

Lines changed: 18 additions & 2 deletions

File tree

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,12 @@ export function createVimHandler(input: {
6565
}
6666

6767
function isPrintable(event: VimEvent) {
68-
return !!event.name && event.name.length === 1
68+
return !!event.name && (event.name.length === 1 || event.name === "space")
69+
}
70+
71+
function value(event: VimEvent) {
72+
if (event.name === "space") return " "
73+
return event.name ?? ""
6974
}
7075

7176
function isShifted(event: VimEvent, key: string) {
@@ -560,7 +565,7 @@ export function createVimHandler(input: {
560565
}
561566

562567
if (isPrintable(event) && !hasModifier(event)) {
563-
replaceUnderCursor(input.textarea(), event.name)
568+
replaceUnderCursor(input.textarea(), value(event))
564569
input.state.setTyped(true)
565570
event.preventDefault()
566571
return true

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

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

724+
test("replace mode overwrites with space key", () => {
725+
const ctx = createHandler("abcd", { mode: "replace" })
726+
ctx.textarea.cursorOffset = 1
727+
728+
const key = createEvent("space")
729+
expect(ctx.handler.handleKey(key.event)).toBe(true)
730+
expect(key.prevented()).toBe(true)
731+
expect(ctx.textarea.plainText).toBe("a cd")
732+
expect(ctx.textarea.cursorOffset).toBe(2)
733+
})
734+
724735
test("replace mode inserts at line end without removing newline", () => {
725736
const ctx = createHandler("ab\ncd", { mode: "replace" })
726737
ctx.textarea.cursorOffset = 2

0 commit comments

Comments
 (0)