diff --git a/src/actions/actions.ts b/src/actions/actions.ts index 1e2310e8254..7fb509a2dbd 100644 --- a/src/actions/actions.ts +++ b/src/actions/actions.ts @@ -3258,8 +3258,8 @@ class MoveNonBlankLast extends BaseMovement { export class MoveWordBegin extends BaseMovement { keys = ["w"]; - public async execAction(position: Position, vimState: VimState): Promise { - if (vimState.recordedState.operator instanceof ChangeOperator) { + public async execAction(position: Position, vimState: VimState, isLastIteration: boolean = false): Promise { + if (isLastIteration && vimState.recordedState.operator instanceof ChangeOperator) { if (TextEditor.getLineAt(position).text.length < 1) { return position; } @@ -3286,7 +3286,7 @@ export class MoveWordBegin extends BaseMovement { } public async execActionForOperator(position: Position, vimState: VimState): Promise { - const result = await this.execAction(position, vimState); + const result = await this.execAction(position, vimState, true); /* From the Vim documentation: diff --git a/test/mode/modeNormal.test.ts b/test/mode/modeNormal.test.ts index b056c33e3bf..5c52cf9bb92 100644 --- a/test/mode/modeNormal.test.ts +++ b/test/mode/modeNormal.test.ts @@ -219,6 +219,22 @@ suite("Mode Normal", () => { endMode: ModeName.Insert }); + newTest({ + title: "Can handle 'cw' without deleting following white spaces", + start: ['|const a = 1;'], + keysPressed: 'cw', + end: ['| a = 1;'], + endMode: ModeName.Insert + }); + + newTest({ + title: "Can handle 'c2w'", + start: ['|const a = 1;'], + keysPressed: 'c2w', + end: ['| = 1;'], + endMode: ModeName.Insert + }); + newTest({ title: "Can handle 'cw' without removing EOL", start: ['|text;', 'text'],