typescript 如何防止FoldingRangeProvider在我用vscode.TextEditorEdit修改编辑器中的一些文本后执行?

kupeojn6  于 2023-01-31  发布在  TypeScript
关注(0)|答案(1)|浏览(163)

在我正在编写的VS代码扩展中,我也希望在使用vscode.TextEditorEdit修改编辑器中的某些文本后阻止FoldingRangeProvider执行***。
我一直在寻找一个例子来说明这一点,但没有找到。

    • 我的自定义FoldingRangeProvider**声明如下:
class MyFoldingRangeProvider implements vscode.FoldingRangeProvider {
    provideFoldingRanges(pDocument: vscode.TextDocument, pContext: vscode.FoldingContext, pToken: vscode.CancellationToken): vscode.FoldingRange[] {
        return getFolds(pDocument);
    }
}
vscode.languages.registerFoldingRangeProvider({pattern:`**/*.*`}, new MyFoldingRangeProvider());
    • 我的函数getFolds()**返回一个vscode.FoldingRange []数组。

以及我的文本编辑器编辑

editor.edit(editBuilder => {
    let newRange = pDocument.lineAt(myLineNumber).range;
    editBuilder.replace(newRange, newTxt);
}, {undoStopAfter: false, undoStopBefore: false})
.then(pSuccess => {
});

对vscode.CancellationToken的说明为:
取消令牌传递给异步或长时间运行的操作以请求取消,例如,由于用户继续键入而取消对完成项的请求。,
所以这可能就是我要找的,但是我没有找到任何关于如何将它与FoldingRangeProvider一起使用的示例。
另外,vscode.CancellationToken真的适合我的情况吗?因为我不想取消任何FoldingRangeProvider的当前执行,但我想阻止任何FoldingRangeProvider的执行,这将由我使用TextEditorEdit修改编辑器内容触发。
谢谢。

vlju58qv

vlju58qv1#

您可以使用vscode.CancellationToken来阻止在您的情况下执行FoldingRangeProvider。
您可以存储全局CancellationTokenSource变量,并在每次运行TextEditorEdit操作之前更新其标记,如下所示:

let cts: vscode.CancellationTokenSource = new vscode.CancellationTokenSource();

class MyFoldingRangeProvider implements vscode.FoldingRangeProvider {
    provideFoldingRanges(pDocument: vscode.TextDocument, pContext: vscode.FoldingContext, pToken: vscode.CancellationToken): vscode.FoldingRange[] {
        if (pToken.isCancellationRequested) {
            return [];
        }
        return getFolds(pDocument);
    }
}

vscode.languages.registerFoldingRangeProvider({pattern:`**/*.*`}, new MyFoldingRangeProvider());

editor.edit(editBuilder => {
    cts.cancel();
    cts = new vscode.CancellationTokenSource();
    let newRange = pDocument.lineAt(myLineNumber).range;
    editBuilder.replace(newRange, newTxt);
}, {undoStopAfter: false, undoStopBefore: false, cancellationToken: cts.token})
.then(pSuccess => {
    cts.dispose();
});

在MyFoldingRangeProvider中,您可以在返回折叠范围之前检查pToken.isCancellationRequested,因此如果已经发出取消请求,它将返回一个空数组。
在TextEditorEdit操作中,您可以将cts.令牌作为cancellationToken选项传递,这样在您修改后将不会执行FoldingRangeProvider。

相关问题