語言服務和編輯器擴充點
編輯器提供延伸點,您可以擴充為 Managed Extensibility Framework (MEF) 元件元件元件元件,包括大部分的語言服務功能。 以下是主要的擴充點類別:
內容類型
分類類型和分類格式
邊界和滾動條
標籤
裝飾品
滑鼠處理器
卸除處理程式
選項。
IntelliSense
擴充內容類型
內容類型是編輯器所處理之文字類型的定義,例如“text”、“code”或 “CSharp”。 您可以宣告 類型的 ContentTypeDefinition 變數,並賦予新內容類型唯一的名稱,以定義新的內容類型。 若要向編輯器註冊內容類型,請將它與下列屬性一起匯出:
NameAttribute 是內容類型的名稱。
BaseDefinitionAttribute 是衍生此內容類型之內容類型的名稱。 內容類型可能繼承自多個其他內容類型。
因為類別是密封的 ContentTypeDefinition ,所以您可以匯出不含類型參數的類別。
下列範例顯示內容類型定義的匯出屬性。
[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;
內容類型可以以零或多個預先存在的內容類型為基礎。 這些是內建類型:
任何:基本內容類型。 所有其他內容類型的父代。
文字:非投影內容的基本類型。 繼承自 「any」。。
純文字:適用於非程式代碼文字。 繼承自 「text」。。
程式代碼:適用於所有類型的程序代碼。 繼承自 「text」。。
Inert:從任何類型的處理中排除文字。 此內容類型的文字永遠不會套用任何延伸模組。
投影:用於投影緩衝區的內容。 繼承自 「any」。。
Intellisense:適用於 IntelliSense 的內容。 繼承自 「text」。。
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 管理擴展名與內容類型之間的關聯。
擴充分類類型和分類格式
您可以使用分類類型來定義您想要提供不同處理的文字類型(例如,將 “keyword” 文字標示為藍色和 “comment” 文字綠色)。 藉由宣告 類型的 ClassificationTypeDefinition 變數,併為其提供唯一的名稱,以定義新的分類類型。
若要向編輯器註冊分類類型,請將它與下列屬性一起匯出:
NameAttribute:分類類型的名稱。
BaseDefinitionAttribute:這個分類類型繼承的來源分類類型名稱。 所有分類類型都繼承自 「text」,而分類類型可能繼承自多個其他分類類型。
因為類別是密封的 ClassificationTypeDefinition ,所以您可以匯出不含類型參數的類別。
下列範例顯示分類類型定義的匯出屬性。
[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;
IStandardClassificationService提供標準分類的存取權。 內建分類類型包括下列專案:
"text"
“自然語言”(衍生自 “text”)
“正式語言”(衍生自 “text”)
“string” (衍生自 “literal”)
“character” (衍生自 “literal”)
“數值” (衍生自 “literal”)
一組不同的錯誤類型繼承自 ErrorTypeDefinition。 它們包含下列錯誤類型:
“語法錯誤”
“編譯程序錯誤”
「其他錯誤」
“warning”
若要探索可用的分類類型清單,請匯 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"
的水平邊界會顯示在內建邊界上方。 具有 order 屬性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 下列類型的標記是內建的:
ErrorTag:與錯誤類型相關聯。
TextMarkerTag:與裝飾相關聯。
注意
如需 的TextMarkerTag範例,請參閱逐步解說:醒目提示文字中的 HighlightWordTag 定義。
OutliningRegionTag:與可以在大綱中展開或折疊的區域相關聯。
SpaceNegotiatingAdornmentTag:定義裝飾在文字檢視中佔用的空間。 如需空間談判裝飾的詳細資訊,請參閱下一節。
IntraTextAdornmentTag:提供裝飾的自動間距和重設大小。
若要尋找及使用緩衝區和檢視的標籤,請匯 IViewTagAggregatorFactoryService 入 或 IBufferTagAggregatorFactoryService,以提供 ITagAggregator<T> 您要求的型別。 下列程式代碼會將此服務匯入為 屬性。
[Import]
internal IViewTagAggregatorFactoryService ViewTagAggregatorFactoryService { get; set; }
標記和 MarkerFormatDefinitions
您可以擴充 類別 MarkerFormatDefinition 來定義標記的外觀。 您必須使用下列屬性匯出類別 (as a EditorFormatDefinition):
NameAttribute:用來參考此格式的名稱
UserVisibleAttribute:這會導致格式出現在UI中
在建構函式中,您可以定義標記的顯示名稱和外觀。 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類別會定義四個預設圖層:Selection、Outlining、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;
若要具現化空間交涉裝飾,除了實作 的類別之外,您還必須建立實作 的類別ITaggerProviderIWpfTextViewCreationListener(如同其他類型的裝飾)。
若要註冊標記器提供者,您必須將它與下列屬性一起匯出:
ContentTypeAttribute:您的裝飾有效內容的種類(例如“text” 或 “code”。
TextViewRoleAttribute:這個標記或裝飾有效之文字檢視的類型。 PredefinedTextViewRoles類別具有一組預先定義的文字檢視角色。 例如, Document 主要用於檔案的文字檢視。 Interactive 用於使用者可以使用滑鼠和鍵盤編輯或巡覽的文字檢視。 檢視範例 Interactive 包括編輯器文本檢視和 [ 輸出 ] 視窗。
TagTypeAttribute:您已定義的標記或裝飾類型。 您必須為 SpaceNegotiatingAdornmentTag新增第二個 TagTypeAttribute 。
下列範例示範空格交涉裝飾標記的標記提供者上的導出屬性。
[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
地區設定
調色盤
PenData
可序列化
SymbolicLink
Xaml
XamlPackage
Tiff
點陣圖
Dib
MetafilePicture
CSV
System.String
HTML 格式
UnicodeText
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) 檢視選項。 您可以在、 DefaultTextViewOptions和 DefaultWpfViewOptions中找到DefaultOptions這些選項。
若要新增選項,請從下列其中一個選項定義類別衍生類別:
-
下列範例示範如何匯出具有布爾值的選項定義。
[Export(typeof(EditorOptionDefinition))]
internal sealed class TestOption : EditorOptionDefinition<bool>
擴充 IntelliSense
IntelliSense 是一組功能的一般詞彙,可提供結構化文字的相關信息,以及語句完成。 這些功能包括語句完成、簽章說明、快速諮詢和燈泡。 語句完成可協助使用者正確輸入語言關鍵詞或成員名稱。 簽章說明會顯示用戶剛剛輸入之方法的簽章或簽章。 當滑鼠停留在類型或成員名稱上時,[快速諮詢] 會顯示完整的簽章。 燈泡在特定內容中為特定標識碼提供其他動作,例如,在重新命名一次之後,重新命名變數的所有專案。
在所有情況下,IntelliSense 功能的設計大致相同:
IntelliSense 訊息代理程式 負責整體程式。
IntelliSense 會話 代表演示者觸發與選取項目認可或取消之間的事件序列。 會話通常是由某些用戶手勢觸發。
IntelliSense 控制器 負責決定會話何時應啟動和結束。 它也會決定何時應該認可資訊,以及何時應取消會話。
IntelliSense 來源 會提供內容,並決定最佳的相符專案。
IntelliSense 演示者 負責顯示內容。
在大部分情況下,我們建議您至少提供來源和控制器。 如果您想要自定義顯示器,您也可以提供演示者。
實作 IntelliSense 來源
若要自訂來源,您必須實作下列來源介面的一或多個 :
重要
ISmartTagSource 已取代為 贊成 ISuggestedActionsSource。
此外,您必須實作相同類型的提供者:
您必須將提供者與下列屬性一起匯出:
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 控制器的詳細資訊,請參閱下列逐步解說: