diff --git a/src/vs/editor/contrib/snippet/common/snippetController.ts b/src/vs/editor/contrib/snippet/common/snippetController.ts index d03ae43a2622cec6b98ce4b049d25a49372148f4..07ed17a875156e8a798830af5032f899ae5cc669 100644 --- a/src/vs/editor/contrib/snippet/common/snippetController.ts +++ b/src/vs/editor/contrib/snippet/common/snippetController.ts @@ -484,7 +484,7 @@ export class SnippetController { const edits: editorCommon.IIdentifiedSingleEditOperation[] = []; const selections = this._editor.getSelections(); let lineDelta = 0; - let columnDelta = 0; + let columnDeltaOrValue = 0; for (let i = 0; i < selections.length; i++) { let {adaptedSnippet, typeRange} = SnippetController._prepareSnippet(this._editor, selections[i], snippet, overwriteBefore, overwriteAfter, stripPrefix); @@ -492,12 +492,13 @@ export class SnippetController { if (i === 0 && snippet.isSingleTabstopOnly) { const finalCursorPos = SnippetController._getSnippetCursorOnly(adaptedSnippet); - const editEnd = typeRange.getEndPosition(); - editEnd.lineNumber += adaptedSnippet.lines.length - 1; - editEnd.column = adaptedSnippet.lines[adaptedSnippet.lines.length - 1].length + 1; - lineDelta = finalCursorPos.lineNumber - editEnd.lineNumber; - columnDelta = finalCursorPos.column - editEnd.column; + lineDelta = finalCursorPos.lineNumber - typeRange.startLineNumber; + if (lineDelta === 0) { + columnDeltaOrValue = finalCursorPos.column - typeRange.startColumn; + } else { + columnDeltaOrValue = finalCursorPos.column; + } } } @@ -509,11 +510,15 @@ export class SnippetController { return inverseEdits.map((edit, i) => { - let {endLineNumber, endColumn} = edit.range; - endLineNumber += lineDelta; - endColumn += columnDelta; + let {startLineNumber, startColumn} = edit.range; + if (lineDelta === 0) { + startColumn += columnDeltaOrValue; + } else { + startLineNumber += lineDelta; + startColumn += columnDeltaOrValue; + } - return new Selection(endLineNumber, endColumn, endLineNumber, endColumn); + return new Selection(startLineNumber, startColumn, startLineNumber, startColumn); }); }; diff --git a/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts index d081aff108a2c5231970bf57f5d2fa90df120041..777970c8c3c98a5de2880c3ce5fa63a745dc6fd2 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts @@ -281,5 +281,18 @@ suite('SnippetController', () => { assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), first.toString()); assert.ok(second.equalsRange({ startLineNumber: 4, startColumn: 1, endLineNumber: 4, endColumn: 1 }), second.toString()); }); + + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setSelections([ + new Selection(2, 7, 2, 7) + ]); + + codeSnippet = CodeSnippet.fromInternal('xx{{}}yy'); + snippetController.run(codeSnippet, 1, 0, false); + + assert.equal(editor.getSelections().length, 1); + const [first] = editor.getSelections(); + assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 8, endLineNumber: 2, endColumn: 8 }), first.toString()); + }); }); }); \ No newline at end of file