如何在 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 扩展中获取当前装饰列表或处理装饰位置更改?的主要内容,如果未能解决你的问题,请参考以下文章

auth模块

在 vscode 中设置扩展的图标或徽标

Django之outh模块

如何调用系统关机函数

八个提高效率的VSCode必备扩展插件

八个提高效率的VSCode必备扩展插件