【发布时间】: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