【问题标题】:How to update semantic tokens as the visible range of the editor changes? (VS Code Extension)如何随着编辑器可见范围的变化更新语义标记? (VS 代码扩展)
【发布时间】:2022-01-04 22:16:39
【问题描述】:

我为我的 VS 代码扩展编写了一个语义令牌提供程序,当打开大文件时它会导致问题(例如,一百万行的文件会使扩展主机崩溃)。

发生这种情况是因为,为了将活动编辑器的文本解析为标记,每次文本发生变化时,提供程序都会逐行遍历每一行。这意味着文本行数越少,扩展提供语义突出显示的速度就越快。因此,一百万行对于扩展来说太多了,因此扩展主机被终止:

为了解决这个问题,我的想法是在用户上下滚动时检查编辑器的可见范围,并更新文档语义标记。这样,在每次可见范围变化时,都会解析出不同范围的行,从而提供不同的标记,以提高此操作的效率。

所以,我知道我可以做这样的事情来获取活动编辑器中可见范围的顶线和底线:

const window = vscode.window
const textEditor = window.activeTextEditor;

if(textEditor) {
    window.onDidChangeTextEditorVisibleRanges(() => {
        const visibleRange = textEditor.visibleRanges[0];
        const topLineIndex = visibleRange.start.line;
        const bottomLineIndex = visibleRange.end.line;
        console.log(topLineIndex, bottomLineIndex);
    });
}

但是,我不知道如何随着可见范围的变化动态更新令牌,因为我无法在事件中返回 SemanticTokens 实例。

有没有办法更新事件的语义标记?如果没有,是否存在比仅循环遍历每一行以将文本解析为标记的更好和更有效的解决方案?

【问题讨论】:

    标签: typescript visual-studio-code vscode-extensions


    【解决方案1】:

    您可以查看VSCode's built-in commands 并具体查看"vscode.provideDocumentSemanticTokens",它看起来像您要查找的内容。

    现在,问题是您的解析器还是令牌提供者?您可以做的优化事情是每次用户更改文件时只解析已编辑的行而不是整个文件。

    如果我没记错的话,语义标记只会在必要时更新,即当标记范围内的部分文本发生变化时,因此您的解析器可能要为崩溃负责。

    【讨论】:

    • 感谢您的意见@Charles。据我了解,注册语义令牌提供程序后,每次文本发生更改时,它将运行provideDocumentSemanticTokens 方法,该方法返回一个SemanticTokens 实例。我已经将此方法包含在用于实例化提供程序对象的类中。现在,我知道还有一个DocumentRangeSemanticTokensProvider,它为文档范围注册了一个提供程序,但我只是不知道如何使用它(至少与普通语义令牌提供程序不同)。
    猜你喜欢
    • 2018-06-03
    • 1970-01-01
    • 2021-12-19
    • 2016-12-26
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多