Body rozšíření služby jazyka a editoru

Editor poskytuje rozšiřující body, které můžete rozšířit jako součásti meF (Managed Extensibility Framework), včetně většiny funkcí jazykové služby. Toto jsou hlavní kategorie bodů rozšíření:

  • Typy obsahu

  • Typy klasifikace a formáty klasifikace

  • Okraje a posuvníky

  • Značky

  • Ozdoby

  • Procesory myši

  • Obslužné rutiny přetažení

  • Možnosti

  • IntelliSense

Rozšíření typů obsahu

Typy obsahu jsou definice typů textu zpracovávaných editorem, například "text", "code" nebo "CSharp". Nový typ obsahu definujete deklarací proměnné typu ContentTypeDefinition a zadáním nového typu obsahu jedinečný název. Pokud chcete typ obsahu zaregistrovat v editoru, exportujte ho společně s následujícími atributy:

  • NameAttribute je název typu obsahu.

  • BaseDefinitionAttribute je název typu obsahu, ze kterého je tento typ obsahu odvozen. Typ obsahu může dědit z více dalších typů obsahu.

    ContentTypeDefinition Protože je třída zapečetěná, můžete ji exportovat bez parametru typu.

    Následující příklad ukazuje atributy exportu v definici typu obsahu.

[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;

Typy obsahu můžou být založené na nule nebo více existujících typech obsahu. Toto jsou předdefinované typy:

  • Libovolná: základní typ obsahu. Nadřazený prvek všech ostatních typů obsahu

  • Text: základní typ pro neprojekční obsah. Dědí z "any".

  • Prostý text: pro nekódovaný text. Dědí z textu.

  • Kód: pro kód všech druhů. Dědí z textu.

  • Inert: vyloučí text z jakéhokoli druhu zpracování. Text tohoto typu obsahu nikdy nebude mít žádné rozšíření použité.

  • Projekce: pro obsah vyrovnávací paměti projekce. Dědí z "any".

  • IntelliSense: pro obsah technologie IntelliSense. Dědí z textu.

  • Sighelp: nápověda k podpisu. Dědí z intellisense.

  • Sighelp-doc: Dokumentace nápovědy k podpisu Dědí z intellisense.

    Toto jsou některé typy obsahu definované sadou Visual Studio a některé jazyky hostované v sadě Visual Studio:

  • Basic

  • C/C++

  • ConsoleOutput

  • CSharp

  • CSS

  • ENC

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

    Pokud chcete zjistit seznam dostupných typů obsahu, naimportujte IContentTypeRegistryServicesoubor , který udržuje kolekci typů obsahu pro editor. Následující kód naimportuje tuto službu jako vlastnost.

[Import]
internal IContentTypeRegistryService ContentTypeRegistryService { get; set; }

Chcete-li přidružit typ obsahu k příponě názvu souboru, použijte FileExtensionToContentTypeDefinition.

Poznámka:

V sadě Visual Studio se přípony názvů souborů registrují pomocí ProvideLanguageExtensionAttribute balíčku jazykové služby. Přidruží FileExtensionToContentTypeDefinition typ obsahu MEF k příponě názvu souboru, která byla tímto způsobem zaregistrována.

Chcete-li exportovat příponu názvu souboru do definice typu obsahu, musíte zahrnout následující atributy:

[Export]
[FileExtension(".test")]
[ContentType("test")]
internal static FileExtensionToContentTypeDefinition TestFileExtensionDefinition;

Spravuje IFileExtensionRegistryService přidružení mezi příponami názvů souborů a typy obsahu.

Rozšíření typů klasifikace a formátů klasifikace

Typy klasifikace můžete použít k definování typů textu, pro které chcete poskytnout jiné zpracování (například barevné obarvení textu "klíčové slovo" modrým a zeleným textem "komentář"). Definujte nový typ klasifikace deklarací proměnné typu ClassificationTypeDefinition a zadáním jedinečného názvu.

Pokud chcete typ klasifikace zaregistrovat v editoru, exportujte ho společně s následujícími atributy:

  • NameAttribute: název typu klasifikace.

  • BaseDefinitionAttribute: název typu klasifikace, ze kterého tento typ klasifikace dědí. Všechny typy klasifikace dědí z textu a typ klasifikace může dědit z více dalších typů klasifikace.

    ClassificationTypeDefinition Protože je třída zapečetěná, můžete ji exportovat bez parametru typu.

    Následující příklad ukazuje export atributů v definici typu klasifikace.

[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;

Poskytuje IStandardClassificationService přístup ke standardním klasifikacm. Mezi předdefinované typy klasifikace patří:

  • "text"

  • "přirozený jazyk" (odvozuje se z textu)

  • "formální jazyk" (odvozuje se z textu)

  • "string" (odvozuje se z literálu)

  • "character" (odvozuje se z literálu)

  • "numeric" (odvozuje se z literálu)

    Sada různých typů chyb dědí z ErrorTypeDefinition. Zahrnují následující typy chyb:

  • Chyba syntaxe

  • Chyba kompilátoru

  • "Jiná chyba"

  • "upozornění"

    Pokud chcete zjistit seznam dostupných typů klasifikace, importujte IClassificationTypeRegistryServicesoubor , který udržuje kolekci typů klasifikace pro editor. Následující kód naimportuje tuto službu jako vlastnost.

[Import]
internal IClassificationTypeRegistryService ClassificationTypeRegistryService { get; set; }

Pro nový typ klasifikace můžete definovat definici formátu klasifikace. Odvození třídy z ClassificationFormatDefinition a jeho export s typem EditorFormatDefinitionspolu s následujícími atributy:

[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = "test")]
[Name("test")]
[DisplayName("Test")]
[UserVisible(true)]
[Order(After = Priority.Default, Before = Priority.High)]
internal sealed class TestFormat : ClassificationFormatDefinition

Pokud chcete zjistit seznam dostupných formátů, importujte IEditorFormatMapServicesoubor , který udržuje kolekci formátů editoru. Následující kód naimportuje tuto službu jako vlastnost.

[Import]
internal IEditorFormatMapService FormatMapService { get; set; }

Rozšíření okrajů a posuvníků

Okraje a posuvníky jsou hlavními prvky zobrazení editoru kromě samotného textového zobrazení. Kromě standardních okrajů, které se zobrazí kolem textového zobrazení, můžete zadat libovolný počet okrajů.

IWpfTextViewMargin Implementujte rozhraní pro definování okraje. K vytvoření okraje musíte také implementovat IWpfTextViewMarginProvider rozhraní.

Pokud chcete zaregistrovat poskytovatele okrajů v editoru, musíte poskytovatele exportovat společně s následujícími atributy:

  • NameAttribute: název okraje.

  • OrderAttribute: pořadí, ve kterém se okraj zobrazuje vzhledem k ostatním okrajům.

    Toto jsou předdefinované okraje:

    • "Wpf Horizontal Scrollbar"

    • "Wpf Vertical Scrollbar"

    • "Wpf Line Number Margin"

      Vodorovné okraje s atributem After="Wpf Horizontal Scrollbar" pořadí jsou zobrazeny pod předdefinovaným okrajem a vodorovné okraje s atributem Before ="Wpf Horizontal Scrollbar" pořadí jsou zobrazeny nad předdefinovaným okrajem. Pravé svislé okraje, které mají atribut After="Wpf Vertical Scrollbar" pořadí, jsou zobrazeny vpravo od posuvníku. Levé svislé okraje, které mají atribut After="Wpf Line Number Margin" pořadí, se zobrazí vlevo od okraje čísla řádku (pokud je viditelný).

  • MarginContainerAttribute: druh okraje (levý, pravý, horní nebo dolní).

  • ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), pro který je okraj platný.

    Následující příklad ukazuje atributy exportu na zprostředkovateli okrajů pro okraj, který se zobrazí vpravo od čáry číslování okrajů.

[Export(typeof(IWpfTextViewMarginProvider))]
[Name("TestMargin")]
[Order(Before = "Wpf Line Number Margin")]
[MarginContainer(PredefinedMarginNames.Left)]
[ContentType("text")]

Rozšíření značek

Značky představují způsob přidružení dat k různým druhům textu. V mnoha případech se přidružená data zobrazují jako vizuální efekt, ale ne všechny značky mají vizuální prezentaci. Vlastní druh značky můžete definovat implementací ITag. Musíte také implementovat ITagger<T> , abyste zadali značky pro danou sadu rozsahů textu a ITaggerProvider poskytli tagger. Zprostředkovatele taggeru musíte exportovat společně s následujícími atributy:

  • ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), pro který je značka platná.

  • TagTypeAttribute: druh značky.

    Následující příklad ukazuje atributy exportu u poskytovatele taggeru.

<CodeContentPlaceHolder>8 Následující druhy značek jsou integrované:

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

Značky a MarkerFormatDefinitions

Třídu můžete rozšířit MarkerFormatDefinition tak, aby definovala vzhled značky. Třídu (jako EditorFormatDefinition)musíte exportovat s následujícími atributy:

  • NameAttribute: název použitý pro odkaz na tento formát

  • UserVisibleAttribute: To způsobí, že se formát zobrazí v uživatelském rozhraní.

    V konstruktoru definujete zobrazovaný název a vzhled značky. BackgroundColor definuje barvu výplně a ForegroundColor definuje barvu ohraničení. Jedná se DisplayName o lokalizovatelný název definice formátu.

    Následuje příklad definice formátu:

[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;
    }
}

Chcete-li použít tuto definici formátu na značku, odkazujte na název, který jste nastavili v atributu name třídy (nikoli zobrazovaný název).

Poznámka:

MarkerFormatDefinitionPříklad , viz HighlightWordFormatDefinition třída Návod: Zvýraznění textu.

Rozšíření doplňků

Doplňky definují vizuální efekty, které lze přidat buď do textu zobrazeného v textovém zobrazení, nebo do samotného textového zobrazení. Můžete definovat vlastní doplňková doplňková zařízení jako jakýkoli typ UIElement.

Ve třídě doplňku musíte deklarovat .AdornmentLayerDefinition Pokud chcete zaregistrovat vrstvu doplňku, exportujte ji společně s následujícími atributy:

  • NameAttribute: název doplňku.

  • OrderAttribute: řazení ozdobného doplňku s ohledem na jiné vrstvy doplňku. Třída PredefinedAdornmentLayers definuje čtyři výchozí vrstvy: Výběr, Osnova, Stříška a Text.

    Následující příklad ukazuje export atributů v definici vrstvy adornment.

[Export]
[Name("TestEmbeddedAdornment")]
[Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)]
internal AdornmentLayerDefinition testLayerDefinition;

Je nutné vytvořit druhou třídu, která implementuje IWpfTextViewCreationListener a zpracovává její TextViewCreated událost vytvořením instance doplňku. Tuto třídu musíte exportovat společně s následujícími atributy:

  • ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), pro který je doplněk platný.

  • TextViewRoleAttribute: druh textového zobrazení, pro které je toto doplňování platné. Třída PredefinedTextViewRoles má sadu předdefinovaných rolí zobrazení textu. Například Document se primárně používá pro textová zobrazení souborů. Interactive se používá pro textová zobrazení, která uživatel může upravovat nebo procházet pomocí myši a klávesnice. Interactive Příklady zobrazení jsou textové zobrazení editoru a okno Výstup.

    Následující příklad ukazuje atributy exportu u zprostředkovatele doplňku.

[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("csharp")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class TestAdornmentProvider : IWpfTextViewCreationListener

Doplňková ozdoba pro vyjednávání prostoru je ta, která zabírá prostor na stejné úrovni jako text. Chcete-li vytvořit tento druh doplňku, je nutné definovat třídu značky, která dědí z SpaceNegotiatingAdornmentTag, která definuje množství místa, které doplňková ozdoba zabírá.

Stejně jako u všech doplňků musíte exportovat definici vrstvy doplňku.

[Export]
[Name("TestAdornment")]
[Order(After = DefaultAdornmentLayers.Text)]
internal AdornmentLayerDefinition testAdornmentLayer;

Chcete-li vytvořit instanci doplňku prostor-vyjednávání, musíte vytvořit třídu, která implementuje ITaggerProvider, kromě třídy, která implementuje IWpfTextViewCreationListener (stejně jako u jiných druhů doplňků).

Pokud chcete zaregistrovat poskytovatele taggeru, musíte ho exportovat společně s následujícími atributy:

  • ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), pro který je vaše doplňková položka platná.

  • TextViewRoleAttribute: druh textového zobrazení, pro které je tato značka nebo doplňková položka platná. Třída PredefinedTextViewRoles má sadu předdefinovaných rolí zobrazení textu. Například Document se primárně používá pro textová zobrazení souborů. Interactive se používá pro textová zobrazení, která uživatel může upravovat nebo procházet pomocí myši a klávesnice. Interactive Příklady zobrazení jsou textové zobrazení editoru a okno Výstup.

  • TagTypeAttribute: druh značky nebo doplňku, který jste definovali. Je nutné přidat sekundu TagTypeAttribute pro SpaceNegotiatingAdornmentTag.

    Následující příklad ukazuje atributy exportu na zprostředkovateli taggeru pro značku doplňku pro vyjednávání prostoru.

[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(SpaceNegotiatingAdornmentTag))]
[TagType(typeof(TestSpaceNegotiatingTag))]
internal sealed class TestTaggerProvider : ITaggerProvider

Rozšíření procesorů myši

Můžete přidat speciální zpracování pro vstup myši. Vytvořte třídu, která dědí události MouseProcessorBase myši a přepíše události myši pro vstup, který chcete zpracovat. Musíte také implementovat IMouseProcessorProvider druhou třídu a exportovat ji společně s ContentTypeAttribute tím, který určuje druh obsahu (například "text" nebo "kód"), pro který je obslužná rutina myši platná.

Následující příklad ukazuje atributy exportu na zprostředkovateli procesoru myši.

[Export(typeof(IMouseProcessorProvider))]
[Name("test mouse processor")]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
internal sealed class TestMouseProcessorProvider : IMouseProcessorProvider

Rozšíření obslužných rutin pro vkládání

Chování obslužných rutin přetažení pro konkrétní druhy textu můžete přizpůsobit vytvořením třídy, která implementuje IDropHandler a druhou třídu, která implementuje vytvoření obslužné rutiny IDropHandlerProvider přetažení. Obslužnou rutinu drop musíte exportovat společně s následujícími atributy:

  • DropFormatAttribute: Textový formát, pro který je tato obslužná rutina přetažení platná. Následující formáty se zpracovávají v pořadí priority od nejvyššího po nejnižší:

    1. Libovolný vlastní formát

    2. Filedrop

    3. EnhancedMetafile

    4. Waveaudio

    5. Riff

    6. Dif

    7. Národní prostředí

    8. Palety

    9. PenData

    10. Serializovatelný

    11. Symbolický odkaz

    12. Xaml

    13. XamlPackage

    14. Tiff

    15. Bitmapové

    16. Dib

    17. MetafilePicture

    18. CSV

    19. System.string

    20. Formát HTML

    21. Unicodetext

    22. OEMText

    23. Text

  • NameAttribute: název obslužné rutiny přetažení.

  • OrderAttribute: řazení obslužné rutiny přetažení před nebo za výchozí obslužnou rutinou přetažení. Výchozí obslužná rutina přetažení pro Visual Studio má název DefaultFileDropHandler.

    Následující příklad ukazuje atributy exportu u zprostředkovatele obslužné rutiny přetažení.

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

Rozšíření možností editoru

Můžete definovat možnosti, které mají být platné jenom v určitém oboru, například v textovém zobrazení. Editor poskytuje tuto sadu předdefinovaných možností: možnosti editoru, možnosti zobrazení a možnosti zobrazení WPF (Windows Presentation Foundation). Tyto možnosti lze nalézt v DefaultOptions, DefaultTextViewOptionsa DefaultWpfViewOptions.

Pokud chcete přidat novou možnost, odvozte třídu z jedné z těchto tříd definic možností:

[Export(typeof(EditorOptionDefinition))]
internal sealed class TestOption : EditorOptionDefinition<bool>

Rozšíření Technologie IntelliSense

IntelliSense je obecný termín pro skupinu funkcí, které poskytují informace o strukturovaném textu a doplňování příkazů. Mezi tyto funkce patří dokončování příkazů, nápověda k podpisu, rychlé informace a žárovky. Dokončování příkazů pomáhá uživatelům správně zadat klíčové slovo jazyka nebo název člena. V nápovědě k podpisu se zobrazí podpis nebo podpisy pro metodu, kterou uživatel právě zadal. Rychlé informace zobrazí úplný podpis pro název typu nebo člena, když na něm myš leží. Žárovka poskytuje další akce pro určité identifikátory v určitých kontextech, například přejmenování všech výskytů proměnné po přejmenování jednoho výskytu.

Návrh funkce IntelliSense je ve všech případech velmi stejný:

  • Za celkový proces zodpovídá zprostředkovatel IntelliSense.

  • Relace IntelliSense představuje posloupnost událostí mezi aktivací prezentujícího a potvrzením nebo zrušením výběru. Relace se obvykle aktivuje určitým gestem uživatele.

  • Kontroler IntelliSense zodpovídá za rozhodnutí, kdy se má relace spustit a ukončit. Také se rozhodne, kdy se mají informace potvrdit a kdy se má relace zrušit.

  • Zdroj IntelliSense poskytuje obsah a rozhoduje o nejlepší shodě.

  • Prezentující IntelliSense zodpovídá za zobrazení obsahu.

    Ve většině případů doporučujeme zadat alespoň zdroj a kontroler. Pokud chcete přizpůsobit zobrazení, můžete také poskytnout prezentujícího.

Implementace zdroje IntelliSense

Pokud chcete zdroj přizpůsobit, musíte implementovat jedno (nebo více) následujících zdrojových rozhraní:

Důležité

ISmartTagSource byl zastaral ve prospěch ISuggestedActionsSource.

Kromě toho musíte implementovat poskytovatele stejného typu:

Důležité

ISmartTagSourceProvider byl zastaral ve prospěch ISuggestedActionsSourceProvider.

Zprostředkovatele musíte exportovat společně s následujícími atributy:

  • NameAttribute: název zdroje.

  • ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), na který se zdroj vztahuje.

  • OrderAttribute: pořadí, ve kterém se má zdroj objevit (s ohledem na jiné zdroje).

  • Následující příklad ukazuje atributy exportu u zprostředkovatele zdroje dokončení.

Export(typeof(ICompletionSourceProvider))]
[Name(" Test Statement Completion Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestCompletionSourceProvider : ICompletionSourceProvider

Další informace o implementaci zdrojů IntelliSense najdete v následujících návodech:

Implementace kontroleru IntelliSense

Pokud chcete přizpůsobit kontroler, musíte implementovat IIntellisenseController rozhraní. Kromě toho musíte implementovat zprostředkovatele kontroleru společně s následujícími atributy:

  • NameAttribute: název kontroleru.

  • ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), na který se řadič vztahuje.

  • OrderAttribute: pořadí, ve kterém se má kontroler objevit (s ohledem na ostatní kontrolery).

    Následující příklad ukazuje atributy exportu u zprostředkovatele kontroleru dokončení.

Export(typeof(IIntellisenseControllerProvider))]
[Name(" Test Controller Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestIntellisenseControllerProvider : IIntellisenseControllerProvider

Další informace o používání kontrolerů IntelliSense najdete v následujících návodech: