2

让我们考虑这个例子。
我有一个包含内容的文件:

  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 行。

处理这种装饰变化的正确方法是什么?

这两个选项中的任何一个都会让我满意:

  1. 一种查询当前打开文件显示的所有当前装饰位置的方法
  2. 一种订阅decoration/range更改的方法,以便我可以手动处理这些。

也许我完全错了,应该以另一种方式完成。
请指教!

4

1 回答 1

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通过处理程序在每次文本更新时手动更新它

我们必须手动完成这些工作是可行的,但非常烦人。¯_(ツ)_/¯
也很容易出错)

于 2020-04-03T06:32:13.553 回答