Chr*_*tin 3 visual-studio-code vscode-extensions
当我开发这个VS代码扩展,我不得不把光标移动到一条线,我创建vscode.window.activeTextEditor.edit的方法,但后来我意识到,当我试图将光标移动行不存在,所以我不得不把一setTimeout对尝试移动光标:
let editor: TextEditor = vscode.window.activeTextEditor;
let selections: Selection[] = editor.selections;
let doc: TextDocument = editor.document;
editor.edit(function (edit: TextEditorEdit): void {
selections.forEach((selection: Selection, index: number) => {
for (let i = selection.start.line; i <= selection.end.line; i++) {
let selLine: TextLine = doc.lineAt(i);
let insertPos: Range = selLine.range;
let insertLineText: string = selLine.text;
// This is async :(
edit.replace(insertPos, insertSemicolon(insertLineText, newLine));
}
});
if (newLine) {
// Move cursor to the next line
setTimeout(() => {
vscode.commands.executeCommand("cursorMove", {
to: "down",
by: "wrappedLine",
select: false,
value: 1
}).then(() => {
vscode.commands.executeCommand("cursorMove", {
to: "wrappedLineEnd",
by: "wrappedLine",
select: false
})
});
}, 50);
}
});
Run Code Online (Sandbox Code Playgroud)
据我所知,这不是一个好的做法,因为我无法确定代码执行时该行是否存在,我试图找到一种方法,仅在编辑完成以替换所有内容时才执行此代码。
您需要将光标操作移到编辑块之外。回调TextEditor.edit建立了一组编辑,然后异步应用。edit返回 aThenable<boolean>以指示编辑是否成功完成。
尝试类似:
let editor: TextEditor = vscode.window.activeTextEditor;
let selections: Selection[] = editor.selections;
let doc: TextDocument = editor.document;
editor.edit(function (edit: TextEditorEdit): void {
selections.forEach((selection: Selection, index: number) => {
for (let i = selection.start.line; i <= selection.end.line; i++) {
let selLine: TextLine = doc.lineAt(i);
let insertPos: Range = selLine.range;
let insertLineText: string = selLine.text;
edit.replace(insertPos, insertSemicolon(insertLineText, newLine));
}
});
}).then(success => {
if (!success) {
return
}
if (newLine) {
// Move cursor to the next line
...
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
677 次 |
| 最近记录: |