diff --git a/src/actions/actions.ts b/src/actions/actions.ts index b3ede3d58a7..cbe80b5a1eb 100644 --- a/src/actions/actions.ts +++ b/src/actions/actions.ts @@ -4724,6 +4724,17 @@ abstract class MoveInsideCharacter extends BaseMovement { diff : new PositionDiff(0, startPos === position ? 1 : 0) }; } + + public async execActionForOperator(position: Position, vimState: VimState): Promise { + const result = await this.execAction(position, vimState); + if (isIMovement(result)) { + if (result.failed) { + vimState.recordedState.hasRunOperator = false; + vimState.recordedState.actionsRun = []; + } + } + return result; + } } @RegisterAction @@ -4893,12 +4904,17 @@ abstract class MoveQuoteMatch extends BaseMovement { }; } - public async execActionForOperator(position: Position, vimState: VimState): Promise { - const res = await this.execAction(position, vimState); - - res.stop = res.stop.getRight(); - - return res; + public async execActionForOperator(position: Position, vimState: VimState): Promise { + const result = await this.execAction(position, vimState); + if (isIMovement(result)) { + if (result.failed) { + vimState.recordedState.hasRunOperator = false; + vimState.recordedState.actionsRun = []; + } else { + result.stop = result.stop.getRight(); + } + } + return result; } } @@ -5168,12 +5184,17 @@ abstract class MoveTagMatch extends BaseMovement { }; } - public async execActionForOperator(position: Position, vimState: VimState): Promise { - const res = await this.execAction(position, vimState); - - res.stop = res.stop.getRight(); - - return res; + public async execActionForOperator(position: Position, vimState: VimState): Promise { + const result = await this.execAction(position, vimState); + if (isIMovement(result)) { + if (result.failed) { + vimState.recordedState.hasRunOperator = false; + vimState.recordedState.actionsRun = []; + } else { + result.stop = result.stop.getRight(); + } + } + return result; } } diff --git a/test/mode/modeInsert.test.ts b/test/mode/modeInsert.test.ts index 79361a95130..de35f5a8094 100644 --- a/test/mode/modeInsert.test.ts +++ b/test/mode/modeInsert.test.ts @@ -43,7 +43,18 @@ suite("Mode Insert", () => { assertEqual(TextEditor.getSelection().start.character, 4, " moved cursor position."); }); - test("", async () => { + test(" can exit insert", async () => { + await modeHandler.handleMultipleKeyEvents([ + 'i', + 't', 'e', 'x', 't', + '', + 'o' + ]); + + return assertEqualLines(["text", ""]); + }); + + test(" can exit insert", async () => { await modeHandler.handleMultipleKeyEvents([ 'i', 't', 'e', 'x', 't', @@ -54,6 +65,14 @@ suite("Mode Insert", () => { return assertEqualLines(["text", ""]); }); + test("Stay in insert when entering characters", async () => { + await modeHandler.handleKeyEvent('i'); + for (var i = 0; i < 10; i++) { + await modeHandler.handleKeyEvent('1'); + assertEqual(modeHandler.currentMode.name === ModeName.Insert, true); + } + }); + test("Can handle 'O'", async () => { await modeHandler.handleMultipleKeyEvents([ 'i', diff --git a/test/mode/modeNormal.test.ts b/test/mode/modeNormal.test.ts index 5c1c04ad8aa..62efa8ee0f7 100644 --- a/test/mode/modeNormal.test.ts +++ b/test/mode/modeNormal.test.ts @@ -1321,4 +1321,11 @@ suite("Mode Normal", () => { end: ["\t|one", "two"], endMode: ModeName.Normal }); + + newTest({ + title: "Can handle and do nothing", + start: ['te|st'], + keysPressed: '', + end: ['te|st'], + }); }); \ No newline at end of file