提交 46c86891 编写于 作者: J Johannes Rieken

fix behaviour with multiline vs singleline snippets and their final cursor position, #11742

上级 e1b6d7de
......@@ -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);
});
};
......
......@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册