共用方式為


語言服務和編輯器擴充點

編輯器提供延伸點,您可以擴充為 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內容類型與以這種方式註冊的擴展名產生關聯。

若要將擴展名匯出至內容類型定義,您必須包含下列屬性:

[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別匯出類別,以及下列屬性:

[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 下列類型的標記是內建的:

[Import]
internal IViewTagAggregatorFactoryService ViewTagAggregatorFactoryService { get; set; }

標記和 MarkerFormatDefinitions

您可以擴充 類別 MarkerFormatDefinition 來定義標記的外觀。 您必須使用下列屬性匯出類別 (as a EditorFormatDefinition):

[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。 若要註冊裝飾層,請將它與下列屬性一起匯出:

[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(如同其他類型的裝飾)。

若要註冊標記器提供者,您必須將它與下列屬性一起匯出:

[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:這個置放處理程式有效的文字格式。 下列格式會依優先順序從最高到最低處理:

    1. 任何自定義格式

    2. FileDrop

    3. EnhancedMetafile

    4. WaveAudio

    5. Riff

    6. Dif

    7. 地區設定

    8. 調色盤

    9. PenData

    10. 可序列化

    11. SymbolicLink

    12. Xaml

    13. XamlPackage

    14. Tiff

    15. 點陣圖

    16. Dib

    17. MetafilePicture

    18. CSV

    19. System.String

    20. HTML 格式

    21. UnicodeText

    22. OEMText

    23. Text

  • NameAttribute:卸除處理程序的名稱。

  • OrderAttribute:在預設置放處理程式之前或之後卸除處理程序的順序。 Visual Studio 的預設卸除處理程式名為 “DefaultFileDropHandler”。

    下列範例顯示卸除處理程式提供者上的導出屬性。

[Export(typeof(IDropHandlerProvider))]
[DropFormat("Text")]
[Name("TestDropHandler")]
[Order(Before="DefaultFileDropHandler")]
internal class TestDropHandlerProvider : IDropHandlerProvider

擴充編輯器選項

您可以定義只能在特定範圍中有效的選項,例如,在文字檢視中。 編輯器提供這組預先定義的選項:編輯器選項、檢視選項,以及 Windows Presentation Foundation (WPF) 檢視選項。 您可以在、 DefaultTextViewOptionsDefaultWpfViewOptions中找到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 控制器的詳細資訊,請參閱下列逐步解說: