Share via


Servicio de lenguaje y puntos de extensión del editor

El editor proporciona puntos de extensión que se pueden extender como partes de componentes de Managed Extensibility Framework (MEF), incluida la mayoría de las características del servicio de lenguaje. Estas son las principales categorías de puntos de extensión:

  • Tipos de contenido

  • Tipos de clasificación y formatos de clasificación

  • Márgenes y barras de desplazamiento

  • Etiquetas

  • Adornos

  • Procesadores de mouse

  • Controladores de colocación

  • Opciones

  • IntelliSense

Extensión de tipos de contenido

Los tipos de contenido son las definiciones de los tipos de texto que controla el editor, por ejemplo, "text", "code" o "CSharp". Para definir un nuevo tipo de contenido, declare una variable del tipo ContentTypeDefinition y asigne al nuevo tipo de contenido un nombre único. Para registrar el tipo de contenido con el editor, expórtelo junto con los atributos siguientes:

  • NameAttribute es el nombre del tipo de contenido.

  • BaseDefinitionAttribute es el nombre del tipo de contenido del que se deriva este tipo de contenido. Un tipo de contenido puede heredar de otros tipos de contenido.

    Dado que la ContentTypeDefinition clase está sellada, puede exportarla sin ningún parámetro de tipo.

    En el ejemplo siguiente se muestran los atributos de exportación en una definición de tipo de contenido.

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

Los tipos de contenido se pueden basar en cero o más tipos de contenido preexistentes. Estos son los tipos integrados:

  • Cualquiera: el tipo de contenido básico. Primario de todos los demás tipos de contenido.

  • Texto: el tipo básico para el contenido que no es de proyección. Hereda de "any".

  • Texto sin formato: para texto que no es de código. Hereda de "text".

  • Código: para el código de todo tipo. Hereda de "text".

  • Inert: excluye el texto de cualquier tipo de control. El texto de este tipo de contenido nunca tendrá ninguna extensión aplicada.

  • Proyección: para el contenido de los búferes de proyección. Hereda de "any".

  • IntelliSense: para el contenido de IntelliSense. Hereda de "text".

  • Sighelp: ayuda de firma. Hereda de "intellisense".

  • Sighelp-doc: documentación de ayuda de firma. Hereda de "intellisense".

    Estos son algunos de los tipos de contenido definidos por Visual Studio y algunos de los lenguajes hospedados en Visual Studio:

  • Basic

  • C/C++

  • ConsoleOutput

  • CSharp

  • CSS

  • ENC

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

    Para detectar la lista de tipos de contenido disponibles, importe , IContentTypeRegistryServiceque mantiene la colección de tipos de contenido para el editor. El código siguiente importa este servicio como una propiedad.

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

Para asociar un tipo de contenido a una extensión de nombre de archivo, use FileExtensionToContentTypeDefinition.

Nota:

En Visual Studio, las extensiones de nombre de archivo se registran mediante en ProvideLanguageExtensionAttribute un paquete de servicio de lenguaje. FileExtensionToContentTypeDefinition Asocia un tipo de contenido MEF a una extensión de nombre de archivo que se ha registrado de esta manera.

Para exportar la extensión de nombre de archivo a la definición de tipo de contenido, debe incluir los siguientes atributos:

  • FileExtensionAttribute: especifica la extensión de nombre de archivo.

  • ContentTypeAttribute: especifica el tipo de contenido.

    Dado que la FileExtensionToContentTypeDefinition clase está sellada, puede exportarla sin ningún parámetro de tipo.

    En el ejemplo siguiente se muestran los atributos de exportación de una extensión de nombre de archivo a una definición de tipo de contenido.

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

IFileExtensionRegistryService administra las asociaciones entre las extensiones de nombre de archivo y los tipos de contenido.

Ampliar los tipos de clasificación y los formatos de clasificación

Puede usar tipos de clasificación para definir los tipos de texto para los que desea proporcionar un control diferente (por ejemplo, colorear el texto "palabra clave" azul y el texto "comentario" verde). Para definir un nuevo tipo de clasificación, declare una variable de tipo ClassificationTypeDefinition y asígnele un nombre único.

Para registrar el tipo de clasificación con el editor, expórtelo junto con los atributos siguientes:

  • NameAttribute: el nombre del tipo de clasificación.

  • BaseDefinitionAttribute: el nombre del tipo de clasificación del que hereda este tipo de clasificación. Todos los tipos de clasificación heredan de "text" y un tipo de clasificación puede heredar de otros tipos de clasificación.

    Dado que la ClassificationTypeDefinition clase está sellada, puede exportarla sin ningún parámetro de tipo.

    En el ejemplo siguiente se muestran los atributos de exportación en una definición de tipo de clasificación.

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

IStandardClassificationService proporciona acceso a las clasificaciones estándar. Entre los tipos de clasificación integrados se incluyen los siguientes:

  • "text"

  • "lenguaje natural" (deriva de "texto")

  • "lenguaje formal" (deriva de "texto")

  • "string" (deriva de "literal")

  • "character" (deriva de "literal")

  • "numeric" (deriva de "literal")

    Un conjunto de tipos de error diferentes hereda de ErrorTypeDefinition. Incluyen los siguientes tipos de error:

  • "error de sintaxis"

  • "error del compilador"

  • "otro error"

  • "advertencia"

    Para detectar la lista de tipos de clasificación disponibles, importe , IClassificationTypeRegistryServiceque mantiene la colección de tipos de clasificación para el editor. El código siguiente importa este servicio como una propiedad.

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

Puede definir una definición de formato de clasificación para el nuevo tipo de clasificación. Derive una clase de ClassificationFormatDefinition y expórtela con el tipo EditorFormatDefinition, junto con los atributos siguientes:

  • NameAttribute: el nombre del formato.

  • DisplayNameAttribute: el nombre para mostrar del formato.

  • UserVisibleAttribute: especifica si el formato aparece en la página Fuentes y colores del cuadro de diálogo Opciones .

  • OrderAttribute: la prioridad del formato. Los valores válidos proceden de Priority.

  • ClassificationTypeAttribute: el nombre del tipo de clasificación al que se asigna este formato.

    En el ejemplo siguiente se muestran los atributos de exportación en una definición de formato de clasificación.

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

Para detectar la lista de formatos disponibles, importe , IEditorFormatMapServiceque mantiene la colección de formatos para el editor. El código siguiente importa este servicio como una propiedad.

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

Extender márgenes y barras de desplazamiento

Los márgenes y las barras de desplazamiento son los elementos de vista principales del editor, además de la propia vista de texto. Puede proporcionar cualquier número de márgenes además de los márgenes estándar que aparecen alrededor de la vista de texto.

Implemente una IWpfTextViewMargin interfaz para definir un margen. También debe implementar la IWpfTextViewMarginProvider interfaz para crear el margen.

Para registrar el proveedor de margen con el editor, debe exportar el proveedor junto con los atributos siguientes:

  • NameAttribute: el nombre del margen.

  • OrderAttribute: el orden en el que aparece el margen, en relación con los demás márgenes.

    Estos son los márgenes integrados:

    • "Barra de desplazamiento horizontal de Wpf"

    • "Barra de desplazamiento vertical de Wpf"

    • "Margen de número de línea de Wpf"

      Los márgenes horizontales que tienen un atributo order de After="Wpf Horizontal Scrollbar" se muestran por debajo del margen integrado y los márgenes horizontales que tienen un atributo order de Before ="Wpf Horizontal Scrollbar" se muestran por encima del margen integrado. Los márgenes verticales derecho que tienen un atributo order de After="Wpf Vertical Scrollbar" se muestran a la derecha de la barra de desplazamiento. Los márgenes verticales izquierdos que tienen un atributo order de After="Wpf Line Number Margin" aparecen a la izquierda del margen de número de línea (si está visible).

  • MarginContainerAttribute: el tipo de margen (izquierda, derecha, superior o inferior).

  • ContentTypeAttribute: el tipo de contenido (por ejemplo, "texto" o "código") para el que el margen es válido.

    En el ejemplo siguiente se muestran los atributos de exportación en un proveedor de margen para un margen que aparece a la derecha del margen de número de línea.

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

Extensión de etiquetas

Las etiquetas son una manera de asociar datos con diferentes tipos de texto. En muchos casos, los datos asociados se muestran como un efecto visual, pero no todas las etiquetas tienen una presentación visual. Puede definir su propio tipo de etiqueta implementando ITag. También debe implementar ITagger<T> para proporcionar las etiquetas de un conjunto determinado de intervalos de texto y para ITaggerProvider proporcionar el tagger. Debe exportar el proveedor de etiquetas junto con los atributos siguientes:

  • ContentTypeAttribute: el tipo de contenido (por ejemplo, "texto" o "código") para el que la etiqueta es válida.

  • TagTypeAttribute: el tipo de etiqueta.

    En el ejemplo siguiente se muestran los atributos de exportación en un proveedor de etiquetas.

<CodeContentPlaceHolder>8 Los siguientes tipos de etiqueta están integrados:

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

Etiquetas y MarkerFormatDefinitions

Puede extender la MarkerFormatDefinition clase para definir la apariencia de una etiqueta. Debe exportar la clase (como ) EditorFormatDefinitioncon los atributos siguientes:

  • NameAttribute: el nombre usado para hacer referencia a este formato.

  • UserVisibleAttribute: esto hace que el formato aparezca en la interfaz de usuario.

    En el constructor, se define el nombre para mostrar y la apariencia de la etiqueta. BackgroundColor define el color de relleno y ForegroundColor define el color del borde. DisplayName es el nombre localizable de la definición de formato.

    A continuación se muestra un ejemplo de una definición de formato:

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

Para aplicar esta definición de formato a una etiqueta, haga referencia al nombre que estableció en el atributo name de la clase (no en el nombre para mostrar).

Nota:

Para obtener un ejemplo de MarkerFormatDefinition, vea la clase HighlightWordFormatDefinition en Walkthrough: Highlight Text.

Extender adornos

Los adornos definen los efectos visuales que se pueden agregar al texto que se muestra en una vista de texto o a la propia vista de texto. Puede definir su propio adorno como cualquier tipo de UIElement.

En la clase de adorno, debe declarar un AdornmentLayerDefinition. Para registrar la capa de adorno, expórtela junto con los atributos siguientes:

  • NameAttribute: el nombre del adorno.

  • OrderAttribute: el orden del adorno con respecto a otras capas de adorno. La clase PredefinedAdornmentLayers define cuatro capas predeterminadas: Selección, Esquemat y Texto.

    En el ejemplo siguiente se muestran los atributos de exportación en una definición de capa de adorno.

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

Debe crear una segunda clase que implemente IWpfTextViewCreationListener y controle su TextViewCreated evento mediante la creación de instancias del adorno. Debe exportar esta clase junto con los atributos siguientes:

  • ContentTypeAttribute: el tipo de contenido (por ejemplo, "texto" o "código") para el que el adorno es válido.

  • TextViewRoleAttribute: el tipo de vista de texto para el que este adorno es válido. La clase PredefinedTextViewRoles tiene el conjunto de roles de vista de texto predefinidos. Por ejemplo, Document se usa principalmente para las vistas de texto de los archivos. Interactive se usa para las vistas de texto que un usuario puede editar o navegar mediante un mouse y un teclado. Algunos ejemplos de Interactive vistas son la vista de texto del editor y la ventana Salida .

    En el ejemplo siguiente se muestran los atributos de exportación en el proveedor de adornos.

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

Un adorno de negociación espacial es aquel que ocupa el espacio en el mismo nivel que el texto. Para crear este tipo de adorno, debe definir una clase de etiqueta que herede de SpaceNegotiatingAdornmentTag, que define la cantidad de espacio que ocupa el adorno.

Al igual que con todos los adornos, debe exportar la definición de la capa de adorno.

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

Para crear una instancia del adorno de negociación espacial, debe crear una clase que implemente ITaggerProvider, además de la clase que implementa IWpfTextViewCreationListener (como con otros tipos de adornos).

Para registrar el proveedor de etiquetas, debe exportarlo junto con los atributos siguientes:

  • ContentTypeAttribute: el tipo de contenido (por ejemplo, "texto" o "código") para el que el adorno es válido.

  • TextViewRoleAttribute: el tipo de vista de texto para el que esta etiqueta o adorno es válida. La clase PredefinedTextViewRoles tiene el conjunto de roles de vista de texto predefinidos. Por ejemplo, Document se usa principalmente para las vistas de texto de los archivos. Interactive se usa para las vistas de texto que un usuario puede editar o navegar mediante un mouse y un teclado. Algunos ejemplos de Interactive vistas son la vista de texto del editor y la ventana Salida .

  • TagTypeAttribute: el tipo de etiqueta o adorno que ha definido. Debe agregar un segundo TagTypeAttribute para SpaceNegotiatingAdornmentTag.

    En el ejemplo siguiente se muestran los atributos de exportación en el proveedor de etiquetas para una etiqueta de adorno de negociación espaciadora.

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

Extensión de procesadores de mouse

Puede agregar un control especial para la entrada del mouse. Cree una clase que herede de MouseProcessorBase e invalide los eventos del mouse para la entrada que desea controlar. También debe implementar IMouseProcessorProvider en una segunda clase y exportarlo junto con el ContentTypeAttribute que especifica el tipo de contenido (por ejemplo, "texto" o "código") para el que el controlador del mouse es válido.

En el ejemplo siguiente se muestran los atributos de exportación en un proveedor de procesador del mouse.

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

Extender controladores de colocación

Puede personalizar el comportamiento de los controladores de colocación para determinados tipos de texto mediante la creación de una clase que implemente IDropHandler y una segunda clase que implemente IDropHandlerProvider para crear el controlador de colocación. Debe exportar el controlador de colocación junto con los atributos siguientes:

  • DropFormatAttribute: el formato de texto para el que este controlador de colocación es válido. Los siguientes formatos se controlan en orden de prioridad de mayor a menor:

    1. Cualquier formato personalizado

    2. FileDrop

    3. EnhancedMetafile

    4. WaveAudio

    5. Riff

    6. Dif

    7. Configuración regional

    8. Paleta

    9. PenData

    10. Serializable

    11. SymbolicLink

    12. Xaml

    13. XamlPackage

    14. Tiff

    15. Bitmap

    16. Dib

    17. MetafilePicture

    18. CSV

    19. System.String

    20. Formato HTML

    21. UnicodeText

    22. OEMText

    23. Texto

  • NameAttribute: el nombre del controlador de colocación.

  • OrderAttribute: el orden del controlador de colocación antes o después del controlador de colocación predeterminado. El controlador de colocación predeterminado para Visual Studio se denomina "DefaultFileDropHandler".

    En el ejemplo siguiente se muestran los atributos de exportación en un proveedor de controladores de colocación.

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

Extensión de las opciones del editor

Puede definir opciones para que solo sean válidas en un ámbito determinado, por ejemplo, en una vista de texto. El editor proporciona este conjunto de opciones predefinidas: opciones de editor, opciones de vista y opciones de vista de Windows Presentation Foundation (WPF). Estas opciones se pueden encontrar en DefaultOptions, DefaultTextViewOptionsy DefaultWpfViewOptions.

Para agregar una nueva opción, derive una clase de una de estas clases de definición de opción:

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

Extensión de IntelliSense

IntelliSense es un término general para un grupo de características que proporcionan información sobre texto estructurado y finalización de instrucciones para él. Estas características incluyen finalización de instrucciones, ayuda de firma, Información rápida y bombillas. La finalización de instrucciones ayuda a los usuarios a escribir correctamente una palabra clave de lenguaje o un nombre de miembro. La ayuda de firma muestra la firma o las firmas del método que el usuario acaba de escribir. Información rápida muestra una firma completa para un tipo o nombre de miembro cuando el mouse se sitúa en él. La bombilla proporciona acciones adicionales para determinados identificadores en determinados contextos, por ejemplo, cambiar el nombre de todas las apariciones de una variable después de que se haya cambiado el nombre de una repetición.

El diseño de una característica de IntelliSense es muy similar en todos los casos:

  • Un agente de IntelliSense es responsable del proceso general.

  • Una sesión de IntelliSense representa la secuencia de eventos entre el desencadenador del moderador y la confirmación o cancelación de la selección. Normalmente, la sesión se desencadena mediante algún gesto de usuario.

  • Un controlador de IntelliSense es responsable de decidir cuándo debe iniciarse y finalizar la sesión. También decide cuándo se debe confirmar la información y cuándo se debe cancelar la sesión.

  • Un origen de IntelliSense proporciona el contenido y decide la mejor coincidencia.

  • Un moderador de IntelliSense es responsable de mostrar el contenido.

    En la mayoría de los casos, se recomienda proporcionar al menos un origen y un controlador. También puede proporcionar un moderador si desea personalizar la pantalla.

Implementación de un origen de IntelliSense

Para personalizar un origen, debe implementar una (o varias) de las siguientes interfaces de origen:

Importante

ISmartTagSource ha quedado en desuso en favor de ISuggestedActionsSource.

Además, debe implementar un proveedor del mismo tipo:

Importante

ISmartTagSourceProvider ha quedado en desuso en favor de ISuggestedActionsSourceProvider.

Debe exportar el proveedor junto con los atributos siguientes:

  • NameAttribute: el nombre del origen.

  • ContentTypeAttribute: el tipo de contenido (por ejemplo, "texto" o "código") al que se aplica el origen.

  • OrderAttribute: el orden en el que debe aparecer el origen (con respecto a otros orígenes).

  • En el ejemplo siguiente se muestran los atributos de exportación en un proveedor de origen de finalización.

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

Para obtener más información sobre la implementación de orígenes de IntelliSense, consulte los siguientes tutoriales:

Implementación de un controlador intelliSense

Para personalizar un controlador, debe implementar la IIntellisenseController interfaz . Además, debe implementar un proveedor de controladores junto con los siguientes atributos:

  • NameAttribute: el nombre del controlador.

  • ContentTypeAttribute: el tipo de contenido (por ejemplo, "texto" o "código") al que se aplica el controlador.

  • OrderAttribute: el orden en el que debe aparecer el controlador (con respecto a otros controladores).

    En el ejemplo siguiente se muestran los atributos de exportación en un proveedor de controlador de finalización.

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

Para obtener más información sobre el uso de controladores de IntelliSense, consulte los siguientes tutoriales: