Как получить текущий список украшений ИЛИ обрабатывать изменение положения украшений в VSCode Extension? - PullRequest
0 голосов
/ 02 апреля 2020

Давайте возьмем этот пример во внимание.
У меня есть файл с содержимым:

  1: one
  2: two
  3: three

, и я создаю оформление линии для строки "two":

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 изменений, чтобы я мог обрабатывать их вручную.

Может быть, я совершенно не прав, и это нужно сделать по-другому.
Пожалуйста, сообщите!

1 Ответ

0 голосов
/ 03 апреля 2020

Так что, по-видимому, нет способа получить все текущие украшения для открытого файла в 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 is:

  • для сохранения копии всех позиций оформления
  • для обновления вручную при каждом обновлении текста с помощью vscode.workspace.onDidChangeTextDocument обработчика

Это выполнимо, но очень раздражает, что мы должны делать это вручную. ¯_ (ツ) _ / ¯
Также очень подвержен ошибкам) ​​

...