visual-studio-code - TextEditorEdit.replace 是异步的,完成后如何执行代码?

标签 visual-studio-code vscode-extensions

我在开发 this VS Code extension ,我不得不将光标移动到我用 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);
    }
});

据我所知,这不是一个好的做法,因为我不能确定代码执行时该行是否存在,我试图找到一种方法来仅在编辑完成时执行此代码替换一切。

最佳答案

您需要将光标操作移到编辑 block 之外。 TextEditor.edit中的回调建立一组编辑,然后异步应用。 edit返回 Thenable<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
        ...
    }
})

关于visual-studio-code - TextEditorEdit.replace 是异步的,完成后如何执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45046552/

相关文章:

visual-studio-code - Visual Studio Code 状态栏颜色

c++ - 在 VSCode 中包含 SFML 库 "SFML/Graphics.hpp no such file or directory"gcc

visual-studio-code - 无法在 VS Code 中启动客户端 Clang 语言服务器

vscode 中的 JavaScript 和 typescript 共享代码片段

visual-studio-code - 如何在 Visual Studio Code 上自定义文件右键单击操作?

visual-studio-code - 定义 "always wins"的 VSCode Scheme Syntax 规则

python - vscode Python 交互中的交互模式

css - 停止在 CSS 中对逗号分隔的选择器强制换行,并将大括号放在新行上

visual-studio-code - 通过 Azure DevOps 发布 VS Code 扩展

visual-studio-code - 在 vscode 的 gutter 中添加右键菜单项