Основные понятия расширяемости редактора
В этой статье описывается объектная модель расширяемости, представляющая редактор Visual Studio и текстовый документ, открытый для редактирования. Общие сведения о работе с функциональностью расширения редактора см. в статье Использование расширения редактора Visual Studio.
Объектная модель расширяемости редактора Visual Studio состоит из нескольких целых частей. В этой статье рассматриваются ITextViewSnapshot, ITextDocumentSnapshotи другие абстрактные представления всего документа, а также Position
и Span
, которые представляют расположение и диапазоны текста соответственно.
ITextViewSnapshot
ITextViewSnapshot содержит URI и сведения о версии, необходимые для получения ITextDocumentSnapshot, а также некоторые свойства текстового представления, например выделения.
- Этот объект неизменяем и никогда не изменится после его создания.
- Вы можете использовать
ITextViewSnapshot.GetTextDocumentAsync()
для получения содержимого из документа. Вызов этого метода является дорогостоящим и должен выполняться только в том случае, если требуется содержимое документа. -
ITextViewSnapshot
нельзя изменять напрямую. Все изменения запрашиваются через мутацию. См. Измените текстовый документ с помощью расширения.
ITextDocumentSnapshot
ITextDocumentSnapshot содержит содержимое текстового документа в определённый момент времени или версию.
- Этот объект неизменяем и никогда не изменится после его создания.
-
ITextDocumentSnapshot
нельзя изменять напрямую. Все изменения запрашиваются через мутацию. См. Внесение изменений в текстовый документ из расширения.
Если вы знакомы с устаревшими расширениями Visual Studio, ITextDocumentSnapshot почти совпадает с ITextSnapshot и поддерживает большинство методов доступа к тексту.
Рекомендации:
- Позицию и диапазон можно использовать для представления подстроок в документе без использования ресурсов для копирования или выделения строк. Большинство API работают с точки зрения этих примитивов.
- Синтаксис индексатора
textDocument[0]
можно использовать для чтения символов по символам в документе без копирования в строку. - Если необходимо создать строку, например для использования в качестве ключа словаря, используйте перегрузку, которая принимает
Span
, чтобы избежать создания большой строки броска из всей строки или документа. - Не предполагайте, что строки или документы будут короткими. Многие языки уменьшаются до огромных строк или используют очень большие файлы.
-
-
ITextDocumentSnapshot ссылается на большие структуры данных, которые могут использовать память, если хранится достаточно старая версия. Рекомендуется периодически обновлять сохраняемые вами позиции и диапазоны до последней версии документа с помощью метода
TranslateTo()
, чтобы старая версияITextDocumentSnapshot
могла быть удалена сборщиком мусора.
-
ITextDocumentSnapshot ссылается на большие структуры данных, которые могут использовать память, если хранится достаточно старая версия. Рекомендуется периодически обновлять сохраняемые вами позиции и диапазоны до последней версии документа с помощью метода
Позиция
Представляет позицию в текстовом документе. В отличие от int
позиций, тип Position знает о ITextDocumentSnapshot он был получен и поддерживает GetChar()
, чтобы напрямую получить символ в этом моменте.
Если вы знакомы с устаревшими расширениями Visual Studio, позиция почти совпадает с SnapshotPoint и поддерживает большинство методов.
Ладонь
Представляет непрерывную подстроку символов в ITextDocumentSnapshot. В отличие от строки, созданной с помощью string.Substring()
или ITextDocumentSnapshot.CopyToString()
, создание объекта Span не требует выделения или дополнительной памяти. Позже можно вызвать Span.GetText()
, чтобы реализовать его в строке в отложенном режиме.
Если вы знакомы с устаревшими расширениями Visual Studio, Position
почти так же, как SnapshotSpan и поддерживает большинство методов.
Связанное содержимое
Просмотрите пример кода для простого расширения на основе редактора: