Языковая служба и точки расширения редактора
Редактор предоставляет точки расширения, которые можно расширить как части компонентов Managed Extensibility Framework (MEF), включая большинство функций языковой службы. Это основные категории точек расширения:
Типы содержимого
Типы классификации и форматы классификации
Поля и полосы прокрутки
Теги
Украшения
Процессоры мыши
Обработчики удаления
Параметры
IntelliSense
Расширение типов контента
Типы контента — это определения типов текста, обрабатываемого редактором, например "text", "code" или "CSharp". Вы определяете новый тип контента, объявляя переменную типа ContentTypeDefinition и давая новому типу контента уникальное имя. Чтобы зарегистрировать тип контента в редакторе, экспортируйте его вместе со следующими атрибутами:
NameAttribute — имя типа контента.
BaseDefinitionAttribute — это имя типа контента, из которого является производным этот тип контента. Тип контента может наследоваться от нескольких других типов контента.
ContentTypeDefinition Так как класс запечатан, его можно экспортировать без параметра типа.
В следующем примере показаны атрибуты экспорта в определении типа контента.
[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;
Типы контента могут быть основаны на нулях или более существующих типах контента. Это встроенные типы:
Любой: базовый тип контента. Родительский элемент всех других типов контента.
Текст: базовый тип для содержимого, отличного от проекции. Наследуется от "любого".
Обычный текст: для текста, отличного от кода. Наследует от текста.
Код: для кода всех видов. Наследует от текста.
Inert: исключает текст из любой обработки. Текст этого типа контента никогда не будет применять к нему какое-либо расширение.
Проекция: для содержимого буферов проекции. Наследуется от "любого".
Intellisense: для содержимого IntelliSense. Наследует от текста.
Sighelp: справка по подписи. Наследует от intellisense.
Sighelp-doc: справочная документация по подписям. Наследует от intellisense.
Это некоторые типы контента, определенные Visual Studio, и некоторые языки, размещенные в Visual Studio:
Базовая
C/C++
ConsoleOutput
CSharp
CSS
ENC
FindResults
F#
HTML
Язык JScript
XAML
XML
Чтобы узнать список доступных типов контента, импортируйте IContentTypeRegistryServiceфайл, который поддерживает коллекцию типов контента для редактора. Следующий код импортирует эту службу в качестве свойства.
[Import]
internal IContentTypeRegistryService ContentTypeRegistryService { get; set; }
Чтобы связать тип контента с расширением имени файла, используйте FileExtensionToContentTypeDefinition.
Примечание.
В Visual Studio расширения имен файлов регистрируются с помощью ProvideLanguageExtensionAttribute пакета языковой службы. Он FileExtensionToContentTypeDefinition связывает тип контента MEF с расширением имени файла, зарегистрированным таким образом.
Чтобы экспортировать расширение имени файла в определение типа контента, необходимо включить следующие атрибуты:
FileExtensionAttribute: указывает расширение имени файла.
ContentTypeAttribute: указывает тип контента.
FileExtensionToContentTypeDefinition Так как класс запечатан, его можно экспортировать без параметра типа.
В следующем примере показаны атрибуты экспорта расширения имени файла в определение типа контента.
[Export]
[FileExtension(".test")]
[ContentType("test")]
internal static FileExtensionToContentTypeDefinition TestFileExtensionDefinition;
Управление IFileExtensionRegistryService связями между расширениями имен файлов и типами контента.
Расширение типов классификации и форматов классификации
Типы классификаций можно использовать для определения типов текста, для которого требуется предоставить другую обработку (например, цвет текста "ключевое слово" и "комментарий" зеленый). Определите новый тип классификации, объявив переменную типа ClassificationTypeDefinition и предоставив ей уникальное имя.
Чтобы зарегистрировать тип классификации в редакторе, экспортируйте его вместе со следующими атрибутами:
NameAttribute: имя типа классификации.
BaseDefinitionAttribute: имя типа классификации, от которого наследует этот тип классификации. Все типы классификации наследуются от "text", а тип классификации может наследоваться от нескольких других типов классификации.
ClassificationTypeDefinition Так как класс запечатан, его можно экспортировать без параметра типа.
В следующем примере показаны атрибуты экспорта для определения типа классификации.
[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;
Предоставляет IStandardClassificationService доступ к стандартным классификациям. Встроенные типы классификации включают следующие:
"text"
"естественный язык" (производный от текста)
"формальный язык" (производный от текста)
"string" (производный от "литерала")
"символ" (производный от "литерала")
"числовой" (производный от "литерала")
Набор различных типов ошибок наследуется от ErrorTypeDefinition. Они включают следующие типы ошибок:
"синтаксическая ошибка"
Ошибка компилятора
"Другая ошибка"
Предупреждение
Чтобы узнать список доступных типов классификации, импортируйте IClassificationTypeRegistryServiceколлекцию типов классификации для редактора. Следующий код импортирует эту службу в качестве свойства.
[Import]
internal IClassificationTypeRegistryService ClassificationTypeRegistryService { get; set; }
Вы можете определить определение формата классификации для нового типа классификации. Наследуйте класс и экспортируйте его с ClassificationFormatDefinition типом EditorFormatDefinitionвместе со следующими атрибутами:
NameAttribute: имя формата.
DisplayNameAttribute: отображаемое имя формата.
UserVisibleAttribute: указывает, отображается ли формат на странице "Шрифты и цвета " диалогового окна "Параметры ".
OrderAttribute: приоритет формата. Допустимые значения из Priority.
ClassificationTypeAttribute: имя типа классификации, с которым сопоставляется этот формат.
В следующем примере показаны атрибуты экспорта в определении формата классификации.
[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = "test")]
[Name("test")]
[DisplayName("Test")]
[UserVisible(true)]
[Order(After = Priority.Default, Before = Priority.High)]
internal sealed class TestFormat : ClassificationFormatDefinition
Чтобы узнать список доступных форматов, импортируйте IEditorFormatMapServiceфайл, который поддерживает коллекцию форматов для редактора. Следующий код импортирует эту службу в качестве свойства.
[Import]
internal IEditorFormatMapService FormatMapService { get; set; }
Расширение полей и полос прокрутки
Поля и полосы прокрутки являются основными элементами представления редактора в дополнение к самому текстовому представлению. Вы можете указать любое количество полей в дополнение к стандартным полям, которые отображаются вокруг текстового представления.
IWpfTextViewMargin Реализуйте интерфейс для определения поля. Для создания поля необходимо также реализовать IWpfTextViewMarginProvider интерфейс.
Чтобы зарегистрировать поставщика полей в редакторе, необходимо экспортировать поставщика вместе со следующими атрибутами:
NameAttribute: имя поля.
OrderAttribute: порядок отображения поля относительно других полей.
Это встроенные поля:
"Горизонтальная полоса прокрутки Wpf"
"Вертикальная полоса прокрутки Wpf"
Поле "Номер строки Wpf"
Горизонтальные поля с атрибутом
After="Wpf Horizontal Scrollbar"
заказа отображаются под встроенным полем, а горизонтальные поля с атрибутомBefore ="Wpf Horizontal Scrollbar"
заказа отображаются над встроенным полем. Правые вертикальные поля с атрибутомAfter="Wpf Vertical Scrollbar"
порядка отображаются справа от полосы прокрутки. Левые вертикальные поля, имеющие атрибутAfter="Wpf Line Number Margin"
заказа, отображаются слева от поля номера строки (если он виден).
MarginContainerAttribute: тип поля (слева, справа, сверху или внизу).
ContentTypeAttribute: тип содержимого (например, "text" или "code"), для которого допустимо поле.
В следующем примере показаны атрибуты экспорта в поставщике полей для поля, которое отображается справа от поля номера строки.
[Export(typeof(IWpfTextViewMarginProvider))]
[Name("TestMargin")]
[Order(Before = "Wpf Line Number Margin")]
[MarginContainer(PredefinedMarginNames.Left)]
[ContentType("text")]
Расширение тегов
Теги — это способ связывания данных с различными типами текста. Во многих случаях связанные данные отображаются как визуальный эффект, но не все теги имеют визуальную презентацию. Вы можете определить собственный тип тега, реализуя ITag. Кроме того, необходимо реализовать для ITagger<T> предоставления тегов для заданного набора диапазонов текста, а ITaggerProvider также для предоставления тегов. Необходимо экспортировать поставщик тегов вместе со следующими атрибутами:
ContentTypeAttribute: тип содержимого (например, "text" или "code"), для которого является допустимым тег.
TagTypeAttribute: тип тега.
В следующем примере показаны атрибуты экспорта в поставщике тегов.
<CodeContentPlaceHolder>8 Встроенные типы тегов:
ClassificationTag: связан с IClassificationType.
ErrorTag: связан с типами ошибок.
TextMarkerTag: связан с украшением.
Примечание.
Пример TextMarkerTagопределения HighlightWordTag см. в пошаговом руководстве по выделению текста.
OutliningRegionTag: связан с регионами, которые могут быть развернуты или свернуты в структуре.
SpaceNegotiatingAdornmentTag: определяет пространство, которое занимает украшение в текстовом представлении. Дополнительные сведения о украшении пробелов см. в следующем разделе.
IntraTextAdornmentTag: предоставляет автоматический интервал и размер для украшения.
Чтобы найти и использовать теги для буферов и представлений, импортируйте IViewTagAggregatorFactoryService или IBufferTagAggregatorFactoryServiceприсвойте вам ITagAggregator<T> запрошенный тип. Следующий код импортирует эту службу в качестве свойства.
[Import]
internal IViewTagAggregatorFactoryService ViewTagAggregatorFactoryService { get; set; }
Теги и МаркерFormatDefinitions
Класс можно расширить MarkerFormatDefinition , чтобы определить внешний вид тега. Необходимо экспортировать класс (в виде EditorFormatDefinition)со следующими атрибутами:
NameAttribute: имя, используемое для ссылки на этот формат
UserVisibleAttribute: это приводит к отображению формата в пользовательском интерфейсе
В конструкторе вы определяете отображаемое имя и внешний вид тега. BackgroundColor определяет цвет заливки и ForegroundColor определяет цвет границы. Это DisplayName локализуемое имя определения формата.
Ниже приведен пример определения формата:
[Export(typeof(EditorFormatDefinition))]
[Name("MarkerFormatDefinition/HighlightWordFormatDefinition")]
[UserVisible(true)]
internal class HighlightWordFormatDefinition : MarkerFormatDefinition
{
public HighlightWordFormatDefinition()
{
this.BackgroundColor = Colors.LightBlue;
this.ForegroundColor = Colors.DarkBlue;
this.DisplayName = "Highlight Word";
this.ZOrder = 5;
}
}
Чтобы применить это определение формата к тегу, укажите имя, заданное в атрибуте имени класса (а не отображаемое имя).
Примечание.
Пример см MarkerFormatDefinition. в классе HighlightWordFormatDefinition в пошаговом руководстве. Выделение текста.
Расширение украшений
Украшения определяют визуальные эффекты, которые можно добавить в текст, отображаемый в текстовом представлении или самом представлении текста. Вы можете определить собственное украшение как любой UIElementтип.
В классе украшений необходимо объявить AdornmentLayerDefinition. Чтобы зарегистрировать слой украшений, экспортируйте его вместе со следующими атрибутами:
NameAttribute: имя украшения.
OrderAttribute: упорядочение украшения относительно других слоев украшения. Класс PredefinedAdornmentLayers определяет четыре уровня по умолчанию: выделение, выстраивание, caret и text.
В следующем примере показаны атрибуты экспорта в определении слоя украшений.
[Export]
[Name("TestEmbeddedAdornment")]
[Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)]
internal AdornmentLayerDefinition testLayerDefinition;
Необходимо создать второй класс, реализующий IWpfTextViewCreationListener и обрабатывающий его TextViewCreated событие, путем создания экземпляра украшения. Этот класс необходимо экспортировать вместе со следующими атрибутами:
ContentTypeAttribute: тип содержимого (например, "text" или "code"), для которого является допустимое украшение.
TextViewRoleAttribute: тип текстового представления, для которого это украшение является допустимым. PredefinedTextViewRoles Класс имеет набор предопределенных ролей представления текста. Например, Document в основном используется для текстовых представлений файлов. Interactive используется для текстовых представлений, которые пользователь может изменять или перемещать с помощью мыши и клавиатуры. Примерами представлений Interactive являются текстовое представление редактора и окно вывода .
В следующем примере показаны атрибуты экспорта для поставщика украшений.
[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("csharp")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class TestAdornmentProvider : IWpfTextViewCreationListener
Украшение пространства — это то, что занимает пространство на том же уровне, что и текст. Чтобы создать этот вид украшения, необходимо определить класс тегов, наследующий от SpaceNegotiatingAdornmentTag, который определяет объем пространства, занимаемого украшением.
Как и во всех украшениях, необходимо экспортировать определение слоя украшений.
[Export]
[Name("TestAdornment")]
[Order(After = DefaultAdornmentLayers.Text)]
internal AdornmentLayerDefinition testAdornmentLayer;
Чтобы создать экземпляр декора пробелов, необходимо создать класс, реализующий ITaggerProvider, помимо класса, реализующего IWpfTextViewCreationListener (как и другие виды украшений).
Чтобы зарегистрировать поставщика тегов, необходимо экспортировать его вместе со следующими атрибутами:
ContentTypeAttribute: тип содержимого (например, "text" или "code"), для которого является допустимое украшение.
TextViewRoleAttribute: тип текстового представления, для которого допустимы этот тег или украшение. PredefinedTextViewRoles Класс имеет набор предопределенных ролей представления текста. Например, Document в основном используется для текстовых представлений файлов. Interactive используется для текстовых представлений, которые пользователь может изменять или перемещать с помощью мыши и клавиатуры. Примерами представлений Interactive являются текстовое представление редактора и окно вывода .
TagTypeAttribute: тип тега или украшения, определенного вами. Необходимо добавить секунду TagTypeAttribute для SpaceNegotiatingAdornmentTag.
В следующем примере показаны атрибуты экспорта в поставщике тегов для тега оформления пробелов.
[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(SpaceNegotiatingAdornmentTag))]
[TagType(typeof(TestSpaceNegotiatingTag))]
internal sealed class TestTaggerProvider : ITaggerProvider
Расширение процессоров мыши
Вы можете добавить специальную обработку для ввода мыши. Создайте класс, наследующий от MouseProcessorBase и переопределяющий события мыши для обрабатываемых входных данных. Кроме того, необходимо реализовать IMouseProcessorProvider в втором классе и экспортировать его вместе с ContentTypeAttribute типом содержимого (например, "text" или "code"), для которого является допустимый обработчик мыши.
В следующем примере показаны атрибуты экспорта в поставщике обработчика мыши.
[Export(typeof(IMouseProcessorProvider))]
[Name("test mouse processor")]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
internal sealed class TestMouseProcessorProvider : IMouseProcessorProvider
Расширение обработчиков удаления
Вы можете настроить поведение обработчиков удаления для определенных типов текста, создав класс, IDropHandler реализующий и второй класс, реализующий IDropHandlerProvider для создания обработчика удаления. Необходимо экспортировать обработчик раскрывающегося списка вместе со следующими атрибутами:
DropFormatAttribute: текстовый формат, для которого допустимы этот обработчик удаления. Следующие форматы обрабатываются в порядке приоритета от самого высокого до самого низкого:
Любой настраиваемый формат
FileDrop
EnhancedMetafile
WaveAudio
Riff
Dif
Локаль
Palette
PenData
Упорядочиваемый уровень изоляции
Символьная связь
Xaml
XamlPackage
Tiff
Bitmap
Dib
MetafilePicture
CSV
System.String
Формат HTML
ЮникодТекст
OEMText
Text
NameAttribute: имя обработчика удаления.
OrderAttribute: порядок обработчика удаления до или после обработчика удаления по умолчанию. Обработчик удаления по умолчанию для Visual Studio называется DefaultFileDropHandler.
В следующем примере показаны атрибуты экспорта в поставщике обработчика удаления.
[Export(typeof(IDropHandlerProvider))]
[DropFormat("Text")]
[Name("TestDropHandler")]
[Order(Before="DefaultFileDropHandler")]
internal class TestDropHandlerProvider : IDropHandlerProvider
Расширение параметров редактора
Параметры можно определить только в определенном область, например в текстовом представлении. Редактор предоставляет этот набор предопределенных параметров: параметры редактора, параметры просмотра и параметры представления Windows Presentation Foundation (WPF). Эти параметры можно найти в DefaultOptions, DefaultTextViewOptionsи DefaultWpfViewOptions.
Чтобы добавить новый параметр, наследуйте класс из одного из следующих классов определения параметров:
-
В следующем примере показано, как экспортировать определение параметра с логическим значением.
[Export(typeof(EditorOptionDefinition))]
internal sealed class TestOption : EditorOptionDefinition<bool>
Расширение IntelliSense
IntelliSense — это общий термин для группы функций, предоставляющих сведения о структурированном тексте и завершении инструкции. К этим функциям относятся завершение инструкций, справка по подписи, быстрая информация и лампочки. Завершение инструкций помогает пользователям правильно вводить язык ключевое слово или имя члена. Справка по сигнатуре отображает подпись или подписи для метода, который только что ввел пользователь. Краткие сведения отображают полную подпись для типа или имени члена, когда мышь на ней накоится. Лампочка предоставляет дополнительные действия для определенных идентификаторов в определенных контекстах, например переименование всех вхождения переменной после переименования одного вхождения.
Дизайн функции IntelliSense очень одинаков во всех случаях:
Брокер IntelliSense отвечает за общий процесс.
Сеанс IntelliSense представляет последовательность событий между триггером докладчика и фиксацией или отменой выделения. Сеанс обычно активируется некоторыми жестами пользователя.
Контроллер IntelliSense отвечает за решение о том, когда сеанс должен начинаться и заканчиваться. Он также определяет, следует ли зафиксировать информацию и когда сеанс должен быть отменен.
Источник IntelliSense предоставляет содержимое и решает лучшее соответствие.
Выступающий IntelliSense отвечает за отображение содержимого.
В большинстве случаев рекомендуется предоставить по крайней мере источник и контроллер. Вы также можете предоставить докладчика, если вы хотите настроить дисплей.
Реализация источника IntelliSense
Чтобы настроить источник, необходимо реализовать один (или несколько) следующих исходных интерфейсов:
Важно!
ISmartTagSource не рекомендуется использовать в пользу ISuggestedActionsSource.
Кроме того, необходимо реализовать поставщика такого же вида:
Важно!
ISmartTagSourceProvider не рекомендуется использовать в пользу ISuggestedActionsSourceProvider.
Необходимо экспортировать поставщик вместе со следующими атрибутами:
NameAttribute: имя источника.
ContentTypeAttribute: тип содержимого (например, "text" или "code"), к которому применяется источник.
OrderAttribute: порядок отображения источника (в отношении других источников).
В следующем примере показаны атрибуты экспорта для поставщика источника завершения.
Export(typeof(ICompletionSourceProvider))]
[Name(" Test Statement Completion Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestCompletionSourceProvider : ICompletionSourceProvider
Дополнительные сведения о реализации источников IntelliSense см. в следующих пошаговом руководстве.
Реализация контроллера IntelliSense
Чтобы настроить контроллер, необходимо реализовать IIntellisenseController интерфейс. Кроме того, необходимо реализовать поставщик контроллера вместе со следующими атрибутами:
NameAttribute: имя контроллера.
ContentTypeAttribute: тип содержимого (например, "text" или "code"), к которому применяется контроллер.
OrderAttribute: порядок отображения контроллера (относительно других контроллеров).
В следующем примере показаны атрибуты экспорта для поставщика контроллера завершения.
Export(typeof(IIntellisenseControllerProvider))]
[Name(" Test Controller Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestIntellisenseControllerProvider : IIntellisenseControllerProvider
Дополнительные сведения об использовании контроллеров IntelliSense см. в следующих пошаговом руководстве.