diff --git a/src/mode/modeHandler.ts b/src/mode/modeHandler.ts index 65cda981674..b6d37257c60 100644 --- a/src/mode/modeHandler.ts +++ b/src/mode/modeHandler.ts @@ -1362,13 +1362,19 @@ export class ModeHandler implements vscode.Disposable { selections = [ new vscode.Selection(start, stop) ]; } else if (vimState.currentMode === ModeName.VisualLine) { - selections = [ new vscode.Selection( + selections = [new vscode.Selection( Position.EarlierOf(start, stop).getLineBegin(), Position.LaterOf(start, stop).getLineEnd() - ) ]; - vimState.cursorStartPosition = selections[0].start as Position; - vimState.cursorPosition = selections[0].end as Position; + )]; + // Maintain cursor position based on which direction the selection is going + if (start.line <= stop.line) { + vimState.cursorStartPosition = selections[0].start as Position; + vimState.cursorPosition = selections[0].end as Position; + } else { + vimState.cursorStartPosition = selections[0].end as Position; + vimState.cursorPosition = selections[0].start as Position; + } } else if (vimState.currentMode === ModeName.VisualBlock) { selections = []; diff --git a/test/mode/modeVisualLine.test.ts b/test/mode/modeVisualLine.test.ts index f6ce347abb3..453cc361aa1 100644 --- a/test/mode/modeVisualLine.test.ts +++ b/test/mode/modeVisualLine.test.ts @@ -308,6 +308,14 @@ suite("Mode Visual", () => { end: ["|11111111111111111111111", "11111111111111111111111"], endMode: ModeName.Normal }); + + newTestOnly({ + title: "Can do a multi visual line replace from the bottom up", + start: ["test", "test", "test", "|test", "test"], + keysPressed: "Vkkr1", + end: ["test", "|1111", "1111", "1111", "test"], + endMode: ModeName.Normal + }); }); });