如何在 VSCode 扩展中获取当前装饰列表或处理装饰位置更改?
Posted
技术标签:
【中文标题】如何在 VSCode 扩展中获取当前装饰列表或处理装饰位置更改?【英文标题】:How to get current list of decorations OR handle decoration position change in VSCode Extension? 【发布时间】:2020-07-14 07:48:38 【问题描述】:让我们考虑这个例子。 我有一个包含内容的文件:
1: one
2: two
3: three
我为“第二”行创建了一个线条装饰:
const position = new vscode.Position(1, 0);
const range = new vscode.Range(position, position);
const decoration = vscode.window.createTextEditorDecorationType(
gutterIconPath: context.asAbsolutePath('images/icon.svg')
);
vscode.window.activeTextEditor?.setDecorations(decoration, [range]);
这给了我
1: one
* 2: two
3: three
下一步: 我通过在“第二”行之前添加新行来更改文件内容。 之后该文件如下所示:
1: one
2:
* 3: two
4: three
如您所见,VSCode 更新了我的线条装饰,现在它位于第 3 行(而不是第 2 行),这是完全正确的,我已经预料到了。
现在是问题:
如何获得我的线条装饰的当前更新位置?
如果我持有 range
引用 - 它仍然指向第 2 行。
处理这种装饰变化的正确方法是什么?
这两个选项中的任何一个都会让我满意:
-
一种查询当前打开文件显示的所有当前装饰位置的方法
一种订阅
decoration
/ range
的方式更改,以便我可以手动处理这些更改。
也许我完全错了,应该换一种方式。 请指教!
【问题讨论】:
【参考方案1】:所以显然没有办法在 VSCode 中获取打开文件的所有当前装饰。这是一个老问题,没有明确的解决计划https://github.com/microsoft/vscode/issues/54147。
我找到了一个内部方法 getLineDecorations
- https://github.com/microsoft/vscode/blob/master/src/vs/editor/browser/widget/codeEditorWidget.ts#L1118 - 我试图通过
vscode.window.activeTextEditor?._proxy
vscode.window.activeTextEditor?._runOnProxy
但我没有成功。
所以目前我们在这里提到的https://github.com/microsoft/vscode/issues/54147#issuecomment-439177546 的唯一选择可能是:
存储所有装饰位置的副本 通过vscode.workspace.onDidChangeTextDocument
处理程序在每次文本更新时手动更新它
我们必须手动执行这些操作是可行的,但非常烦人。 ¯_(ツ)_/¯ 也很容易出错)
【讨论】:
以上是关于如何在 VSCode 扩展中获取当前装饰列表或处理装饰位置更改?的主要内容,如果未能解决你的问题,请参考以下文章