Поделиться через


Основные понятия расширяемости редактора

В этой статье описывается объектная модель расширяемости, представляющая редактор Visual Studio и текстовый документ, открытый для редактирования. Общие сведения о работе с функциональностью расширения редактора см. в статье Использование расширения редактора Visual Studio.

Объектная модель расширяемости редактора Visual Studio состоит из нескольких целых частей. В этой статье рассматриваются ITextViewSnapshot, ITextDocumentSnapshotи другие абстрактные представления всего документа, а также Position и Span, которые представляют расположение и диапазоны текста соответственно.

ITextViewSnapshot

ITextViewSnapshot содержит URI и сведения о версии, необходимые для получения ITextDocumentSnapshot, а также некоторые свойства текстового представления, например выделения.

  • Этот объект неизменяем и никогда не изменится после его создания.
  • Вы можете использовать ITextViewSnapshot.GetTextDocumentAsync() для получения содержимого из документа. Вызов этого метода является дорогостоящим и должен выполняться только в том случае, если требуется содержимое документа.
  • ITextViewSnapshot нельзя изменять напрямую. Все изменения запрашиваются через мутацию. См. Измените текстовый документ с помощью расширения.

ITextDocumentSnapshot

ITextDocumentSnapshot содержит содержимое текстового документа в определённый момент времени или версию.

Если вы знакомы с устаревшими расширениями Visual Studio, ITextDocumentSnapshot почти совпадает с ITextSnapshot и поддерживает большинство методов доступа к тексту.

Рекомендации:

  • Позицию и диапазон можно использовать для представления подстроок в документе без использования ресурсов для копирования или выделения строк. Большинство API работают с точки зрения этих примитивов.
  • Синтаксис индексатора textDocument[0]можно использовать для чтения символов по символам в документе без копирования в строку.
  • Если необходимо создать строку, например для использования в качестве ключа словаря, используйте перегрузку, которая принимает Span, чтобы избежать создания большой строки броска из всей строки или документа.
  • Не предполагайте, что строки или документы будут короткими. Многие языки уменьшаются до огромных строк или используют очень большие файлы.
    • ITextDocumentSnapshot ссылается на большие структуры данных, которые могут использовать память, если хранится достаточно старая версия. Рекомендуется периодически обновлять сохраняемые вами позиции и диапазоны до последней версии документа с помощью метода TranslateTo(), чтобы старая версия ITextDocumentSnapshot могла быть удалена сборщиком мусора.

Позиция

Представляет позицию в текстовом документе. В отличие от int позиций, тип Position знает о ITextDocumentSnapshot он был получен и поддерживает GetChar(), чтобы напрямую получить символ в этом моменте.

Если вы знакомы с устаревшими расширениями Visual Studio, позиция почти совпадает с SnapshotPoint и поддерживает большинство методов.

Ладонь

Представляет непрерывную подстроку символов в ITextDocumentSnapshot. В отличие от строки, созданной с помощью string.Substring() или ITextDocumentSnapshot.CopyToString(), создание объекта Span не требует выделения или дополнительной памяти. Позже можно вызвать Span.GetText(), чтобы реализовать его в строке в отложенном режиме.

Если вы знакомы с устаревшими расширениями Visual Studio, Position почти так же, как SnapshotSpan и поддерживает большинство методов.

Просмотрите пример кода для простого расширения на основе редактора: