Dela via


Språktjänst- och redigeringstilläggspunkter

Redigeraren innehåller tilläggspunkter som du kan utöka som MEF-komponentdelar (Managed Extensibility Framework), inklusive de flesta språktjänstfunktioner. Det här är de viktigaste tilläggspunktkategorierna:

  • Innehållstyper

  • Klassificeringstyper och klassificeringsformat

  • Marginaler och rullningslister

  • Etiketter

  • Utsmyckningar

  • Musprocessorer

  • Släpp hanterare

  • Alternativ

  • IntelliSense

Utöka innehållstyper

Innehållstyper är definitioner av de typer av text som hanteras av redigeraren, till exempel "text", "kod" eller "CSharp". Du definierar en ny innehållstyp genom att deklarera en variabel av typen ContentTypeDefinition och ge den nya innehållstypen ett unikt namn. Om du vill registrera innehållstypen med redigeraren exporterar du den tillsammans med följande attribut:

  • NameAttribute är namnet på innehållstypen.

  • BaseDefinitionAttribute är namnet på innehållstypen som den här innehållstypen härleds från. En innehållstyp kan ärva från flera andra innehållstyper.

    ContentTypeDefinition Eftersom klassen är förseglad kan du exportera den utan typparameter.

    I följande exempel visas exportattribut för en definition av innehållstyp.

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

Innehållstyper kan baseras på noll eller fler befintliga innehållstyper. Det här är de inbyggda typerna:

  • Alla: den grundläggande innehållstypen. Överordnad för alla andra innehållstyper.

  • Text: den grundläggande typen för innehåll som inte är projektion. Ärver från "any".

  • Klartext: för text som inte är kod. Ärver från "text".

  • Kod: för kod av alla slag. Ärver från "text".

  • Inert: exkluderar texten från alla typer av hantering. Text av den här innehållstypen kommer aldrig att ha något tillägg tillämpat på den.

  • Projektion: för innehållet i projektionsbuffertar. Ärver från "any".

  • Intellisense: för innehållet i IntelliSense. Ärver från "text".

  • Sighelp: signaturhjälp. Ärver från "intellisense".

  • Sighelp-doc: dokumentation om signaturhjälp. Ärver från "intellisense".

    Det här är några av de innehållstyper som definieras av Visual Studio och några av de språk som finns i Visual Studio:

  • Grundläggande

  • C/C++

  • ConsoleOutput

  • CSharpa

  • CSS

  • ENC

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

    Om du vill identifiera listan över tillgängliga innehållstyper importerar du IContentTypeRegistryService, som underhåller samlingen med innehållstyper för redigeraren. Följande kod importerar den här tjänsten som en egenskap.

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

Om du vill associera en innehållstyp med filnamnstillägget använder du FileExtensionToContentTypeDefinition.

Anmärkning

I Visual Studio registreras filnamnstillägg med hjälp ProvideLanguageExtensionAttribute av på ett språktjänstpaket. Associerar FileExtensionToContentTypeDefinition en MEF-innehållstyp med ett filnamnstillägg som har registrerats på det här sättet.

Om du vill exportera filnamnstillägget till innehållstypsdefinitionen måste du inkludera följande attribut:

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

Hanterar IFileExtensionRegistryService associationerna mellan filnamnstillägg och innehållstyper.

Utöka klassificeringstyper och klassificeringsformat

Du kan använda klassificeringstyper för att definiera de typer av text som du vill ange olika typer av hantering för (till exempel färgläggning av texten "nyckelord" blå och texten "kommentar" grön). Definiera en ny klassificeringstyp genom att deklarera en variabel av typen ClassificationTypeDefinition och ge den ett unikt namn.

Om du vill registrera klassificeringstypen med redigeraren exporterar du den tillsammans med följande attribut:

  • NameAttribute: namnet på klassificeringstypen.

  • BaseDefinitionAttribute: namnet på den klassificeringstyp som den här klassificeringstypen ärver från. Alla klassificeringstyper ärver från "text" och en klassificeringstyp kan ärva från flera andra klassificeringstyper.

    ClassificationTypeDefinition Eftersom klassen är förseglad kan du exportera den utan typparameter.

    I följande exempel visas exportattribut för en definition av klassificeringstyp.

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

IStandardClassificationService Ger åtkomst till standardklassificeringar. Inbyggda klassificeringstyper omfattar följande:

  • "text"

  • "naturligt språk" (härleds från "text")

  • "formellt språk" (härleds från "text")

  • "string" (härleds från "literal")

  • "character" (härleds från "literal")

  • "numerisk" (härleds från "literal")

    En uppsättning olika feltyper ärver från ErrorTypeDefinition. De innehåller följande feltyper:

  • "syntaxfel"

  • "kompilatorfel"

  • "annat fel"

  • "varning"

    Om du vill arbeta med listan över tillgängliga klassificeringstyper importerar du IClassificationTypeRegistryService, som underhåller samlingen med klassificeringstyper för redigeraren. Följande kod importerar den här tjänsten som en egenskap.

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

Du kan definiera en definition av klassificeringsformat för den nya klassificeringstypen. Härled en klass från ClassificationFormatDefinition och exportera den med typen EditorFormatDefinition, tillsammans med följande attribut:

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

Om du vill identifiera listan över tillgängliga format importerar du IEditorFormatMapService, som underhåller samlingen med format för redigeraren. Följande kod importerar den här tjänsten som en egenskap.

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

Utöka marginaler och rullningslister

Marginaler och rullningslister är huvudvyelementen i redigeraren utöver själva textvyn. Du kan ange valfritt antal marginaler utöver de standardmarginaler som visas runt textvyn.

Implementera ett IWpfTextViewMargin gränssnitt för att definiera en marginal. Du måste också implementera IWpfTextViewMarginProvider gränssnittet för att skapa marginalen.

Om du vill registrera marginalprovidern med redigeraren måste du exportera providern tillsammans med följande attribut:

  • NameAttribute: namnet på marginalen.

  • OrderAttribute: i vilken ordning marginalen visas i förhållande till de andra marginalerna.

    Det här är de inbyggda marginalerna:

    • "Vågrät rullningslist för Wpf"

    • "Wpf Lodrät rullningslist"

    • "Wpf Line Number Margin"

      Vågräta marginaler som har ett orderattribut After="Wpf Horizontal Scrollbar" visas under den inbyggda marginalen, och vågräta marginaler som har ett orderattribut Before ="Wpf Horizontal Scrollbar" visas ovanför den inbyggda marginalen. Höger lodräta marginaler som har ett orderattribut After="Wpf Vertical Scrollbar" visas till höger om rullningslisten. Vänster lodräta marginaler som har ett orderattribut After="Wpf Line Number Margin" visas till vänster om radnummermarginalen (om den är synlig).

  • MarginContainerAttribute: typ av marginal (vänster, höger, överkant eller nederkant).

  • ContentTypeAttribute: den typ av innehåll (till exempel "text" eller "kod") som marginalen är giltig för.

    I följande exempel visas exportattribut på en marginalprovider för en marginal som visas till höger om radnummermarginalen.

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

Utöka taggar

Taggar är ett sätt att associera data med olika typer av text. I många fall visas associerade data som en visuell effekt, men inte alla taggar har en visuell presentation. Du kan definiera din egen typ av tagg genom att implementera ITag. Du måste också implementera ITagger<T> för att ange taggarna för en viss uppsättning textintervall och en ITaggerProvider för att ange taggern. Du måste exportera taggerprovidern tillsammans med följande attribut:

  • ContentTypeAttribute: den typ av innehåll (till exempel "text" eller "kod") som taggen är giltig för.

  • TagTypeAttribute: den typ av tagg.

    I följande exempel visas exportattribut på en taggerprovider.

<CodeContentPlaceHolder>8</CodeContentPlaceHolder> Följande typer av taggar är inbyggda:

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

Taggar och MarkerFormatDefinitions

Du kan utöka MarkerFormatDefinition klassen för att definiera utseendet på en tagg. Du måste exportera klassen (som en EditorFormatDefinition)med följande attribut:

  • NameAttribute: namnet som används för att referera till det här formatet

  • UserVisibleAttribute: Detta gör att formatet visas i användargränssnittet

    I konstruktorn definierar du visningsnamnet och utseendet på taggen. BackgroundColor definierar fyllningsfärgen och ForegroundColor definierar kantlinjefärgen. DisplayName är formatdefinitionens localizable-namn.

    Följande är ett exempel på en formatdefinition:

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

Om du vill använda den här formatdefinitionen på en tagg refererar du till det namn som du angav i klassens namnattribut (inte visningsnamnet).

Anmärkning

Ett exempel på en MarkerFormatDefinitionfinns i klassen HighlightWordFormatDefinition i Genomgång: Markera text.

Utöka utsmyckningar

Utsmyckningar definierar visuella effekter som kan läggas till antingen i texten som visas i en textvy eller i själva textvyn. Du kan definiera din egen utsmyckning som alla typer av UIElement.

I din utsmyckningsklass måste du deklarera en AdornmentLayerDefinition. Om du vill registrera utsmyckningsskiktet exporterar du det tillsammans med följande attribut:

  • NameAttribute: namnet på utsmyckningen.

  • OrderAttribute: ordningen på utsmyckningen med avseende på andra utsmyckningsskikt. Klassen PredefinedAdornmentLayers definierar fyra standardlager: Markering, Beskriver, Caret och Text.

    I följande exempel visas exportattribut för en utsmyckningslagerdefinition.

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

Du måste skapa en andra klass som implementerar IWpfTextViewCreationListener och hanterar händelsen TextViewCreated genom att instansiera utsmyckningen. Du måste exportera den här klassen tillsammans med följande attribut:

  • ContentTypeAttribute: den typ av innehåll (till exempel "text" eller "kod") som utsmyckningen är giltig för.

  • TextViewRoleAttribute: den typ av textvy som den här utsmyckningen är giltig för. Klassen PredefinedTextViewRoles har en uppsättning fördefinierade textvisningsroller. Används till exempel Document främst för textvyer av filer. Interactive används för textvyer som en användare kan redigera eller navigera med hjälp av en mus och ett tangentbord. Exempel på Interactive vyer är redigeringstextvyn och utdatafönstret .

    I följande exempel visas exportattribut för utsmyckningsprovidern.

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

En rymdförhandlings utsmyckning är en som upptar utrymme på samma nivå som texten. Om du vill skapa den här typen av utsmyckning måste du definiera en taggklass som ärver från SpaceNegotiatingAdornmentTag, som definierar mängden utrymme som utsmyckningen upptar.

Som med alla utsmyckningar måste du exportera definitionen av utsmyckningsskiktet.

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

För att instansiera utrymmesförhandlingen måste du skapa en klass som implementerar ITaggerProvider, utöver klassen som implementerar IWpfTextViewCreationListener (som med andra typer av utsmyckningar).

Om du vill registrera taggerprovidern måste du exportera den tillsammans med följande attribut:

  • ContentTypeAttribute: den typ av innehåll (till exempel "text" eller "kod") som utsmyckningen är giltig för.

  • TextViewRoleAttribute: den typ av textvy som den här taggen eller utsmyckningen är giltig för. Klassen PredefinedTextViewRoles har en uppsättning fördefinierade textvisningsroller. Används till exempel Document främst för textvyer av filer. Interactive används för textvyer som en användare kan redigera eller navigera med hjälp av en mus och ett tangentbord. Exempel på Interactive vyer är redigeringstextvyn och utdatafönstret .

  • TagTypeAttribute: den typ av tagg eller utsmyckning som du har definierat. Du måste lägga till en sekund TagTypeAttribute för SpaceNegotiatingAdornmentTag.

    I följande exempel visas exportattribut på taggerprovidern för en utsmyckningstagg för blankstegsförhandling.

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

Utöka musprocessorer

Du kan lägga till särskild hantering för musinmatning. Skapa en klass som ärver från MouseProcessorBase och åsidosätter mushändelserna för de indata som du vill hantera. Du måste också implementera IMouseProcessorProvider i en andra klass och exportera den tillsammans med ContentTypeAttribute den som anger vilken typ av innehåll (till exempel "text" eller "kod") som mushanteraren är giltig för.

I följande exempel visas exportattribut på en musprocessorprovider.

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

Utöka släpphanterare

Du kan anpassa beteendet för släpphanterare för specifika typer av text genom att skapa en klass som implementerar IDropHandler och en andra klass som implementeras IDropHandlerProvider för att skapa släpphanteraren. Du måste exportera släpphanteraren tillsammans med följande attribut:

  • DropFormatAttribute: det textformat som den här släpphanteraren är giltig för. Följande format hanteras i prioritetsordning från högsta till lägsta:

    1. Valfritt anpassat format

    2. FileDrop

    3. EnhancedMetafile

    4. WaveAudio

    5. Riff

    6. Dif

    7. Lokal

    8. Palett

    9. PenData

    10. Serialiserbar

    11. Symbolisk länk

    12. Xaml

    13. XamlPackage

    14. Tiff

    15. Bitmap

    16. Dib

    17. MetafilePicture

    18. CSV

    19. System.String

    20. HTML-format

    21. UnicodeText (på engelska)

    22. OEMText

    23. Text

  • NameAttribute: namnet på släpphanteraren.

  • OrderAttribute: Ordering of the drop handler before or after the default drop handler( Ordering of the drop handler before or after the default drop handler). Standardborttagningshanteraren för Visual Studio heter "DefaultFileDropHandler".

    I följande exempel visas exportattribut på en drop-hanterarprovider.

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

Utöka redigeringsalternativ

Du kan definiera att alternativ endast ska vara giltiga i ett visst omfång, till exempel i en textvy. Redigeraren innehåller den här uppsättningen fördefinierade alternativ: redigeringsalternativ, visningsalternativ och WPF-vyalternativ (Windows Presentation Foundation). De här alternativen finns i DefaultOptions, DefaultTextViewOptionsoch DefaultWpfViewOptions.

Om du vill lägga till ett nytt alternativ härleder du en klass från någon av dessa alternativdefinitionsklasser:

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

Utöka IntelliSense

IntelliSense är en allmän term för en grupp funktioner som ger information om strukturerad text och slutförande av instruktion för den. Dessa funktioner omfattar komplettering av instruktioner, signaturhjälp, snabbinformation och glödlampor. Komplettering av instruktion hjälper användare att skriva ett språknyckelord eller medlemsnamn korrekt. Signaturhjälpen visar signaturen eller signaturerna för den metod som användaren just har skrivit. Snabbinformation visar en fullständig signatur för en typ eller ett medlemsnamn när musen vilar på den. Glödlampa ger ytterligare åtgärder för vissa identifierare i vissa sammanhang, till exempel byta namn på alla förekomster av en variabel efter att en förekomst har bytt namn.

Utformningen av en IntelliSense-funktion är ungefär densamma i alla fall:

  • En IntelliSense-mäklare ansvarar för den övergripande processen.

  • En IntelliSense-session representerar sekvensen av händelser mellan utlösaren av presentatören och incheckningen eller annulleringen av valet. Sessionen utlöses vanligtvis av en viss användargest.

  • En IntelliSense-kontrollant ansvarar för att bestämma när sessionen ska starta och avslutas. Den bestämmer också när informationen ska checkas in och när sessionen ska avbrytas.

  • En IntelliSense-källa tillhandahåller innehållet och bestämmer den bästa matchningen.

  • En IntelliSense-presentatör ansvarar för att visa innehållet.

    I de flesta fall rekommenderar vi att du anger minst en källa och en kontrollant. Du kan också ange en presentatör om du vill anpassa visningen.

Implementera en IntelliSense-källa

Om du vill anpassa en källa måste du implementera ett (eller flera) av följande källgränssnitt:

Viktigt!

ISmartTagSource har blivit inaktuell till förmån för ISuggestedActionsSource.

Dessutom måste du implementera en provider av samma slag:

Viktigt!

ISmartTagSourceProvider har blivit inaktuell till förmån för ISuggestedActionsSourceProvider.

Du måste exportera providern tillsammans med följande attribut:

  • NameAttribute: källans namn.

  • ContentTypeAttribute: den typ av innehåll (till exempel "text" eller "kod") som källan gäller för.

  • OrderAttribute: i vilken ordning källan ska visas (med avseende på andra källor).

  • I följande exempel visas exportattribut för en slutförande källprovider.

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

Mer information om hur du implementerar IntelliSense-källor finns i följande genomgångar:

Implementera en IntelliSense-styrenhet

Om du vill anpassa en kontrollant måste du implementera IIntellisenseController gränssnittet. Dessutom måste du implementera en kontrollantprovider tillsammans med följande attribut:

  • NameAttribute: namnet på kontrollanten.

  • ContentTypeAttribute: den typ av innehåll (till exempel "text" eller "kod") som kontrollanten gäller för.

  • OrderAttribute: I vilken ordning styrenheten ska visas (med avseende på andra kontrollanter).

    I följande exempel visas exportattribut på en slutförande kontrollantprovider.

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

Mer information om hur du använder IntelliSense-styrenheter finns i följande genomgångar: