Dentro del editor

El editor se compone de varios subsistemas diferentes, que están diseñados para mantener el modelo de texto del editor separado de la vista de texto y la interfaz de usuario.

En estas secciones se describen distintos aspectos del editor:

En estas secciones se describen las características del editor:

Subsistemas

Subsistema del modelo de texto

El subsistema del modelo de texto es responsable de representar texto y habilitar su manipulación. El subsistema del modelo de texto contiene la ITextBuffer interfaz , que describe la secuencia de caracteres que va a mostrar el editor. Este texto se puede modificar, realizar un seguimiento y manipularlo de muchas maneras. El modelo de texto también proporciona tipos para los siguientes aspectos:

  • Un servicio que asocia texto a archivos y administra la lectura y escritura en el sistema de archivos.

  • Un servicio de diferenciación que encuentra las diferencias mínimas entre dos secuencias de objetos.

  • Sistema para describir el texto en un búfer en términos de subconjuntos del texto en otros búferes.

El subsistema del modelo de texto está libre de conceptos de interfaz de usuario (UI). Por ejemplo, no es responsable del formato de texto ni del diseño de texto, y no tiene conocimiento de adornos visuales que pueden estar asociados al texto.

Los tipos públicos del subsistema de modelos de texto se encuentran en Microsoft.VisualStudio.Text.Data.dll y Microsoft.VisualStudio.CoreUtility.dll, que dependen solo de la biblioteca de clases base de .NET Framework y managed Extensibility Framework (MEF).

Subsistema de vista de texto

El subsistema de vista de texto es responsable de dar formato y mostrar texto. Los tipos de este subsistema se dividen en dos capas, en función de si los tipos se basan en Windows Presentation Foundation (WPF). Los tipos más importantes son ITextView y IWpfTextView, que controlan el conjunto de líneas de texto que se van a mostrar, y también el símbolo de intercalación, la selección y las instalaciones para adornar el texto mediante elementos de interfaz de usuario de WPF. Este subsistema también proporciona márgenes alrededor del área de presentación de texto. Estos márgenes se pueden extender y pueden contener diferentes tipos de contenido y efectos visuales. Algunos ejemplos de márgenes son las pantallas de número de línea y las barras de desplazamiento.

Los tipos públicos del subsistema de vista de texto se encuentran en Microsoft.VisualStudio.Text.UI.dll y Microsoft.VisualStudio.Text.UI.Wpf.dll. El primer ensamblado contiene los elementos independientes de la plataforma y el segundo contiene los elementos específicos de WPF.

Subsistema de clasificación

El subsistema de clasificación es responsable de determinar las propiedades de fuente del texto. Un clasificador divide el texto en diferentes clases, por ejemplo, "palabra clave" o "comentario". El mapa de formato de clasificación relaciona estas clases con las propiedades de fuente reales, por ejemplo, "Blue Consolas 10 pt". Esta información la usa la vista de texto cuando da formato y representa texto. El etiquetado, que se describe con más detalle más adelante en este tema, permite asociar datos a intervalos de texto.

Los tipos públicos del subsistema de clasificación se encuentran en Microsoft.VisualStudio.Text.Logic.dll e interactúan con los aspectos visuales de la clasificación, incluidos en Microsoft.VisualStudio.Text.UI.Wpf.dll.

Subsistema de operaciones

El subsistema de operaciones define el comportamiento del editor. Proporciona la implementación de los comandos del editor de Visual Studio y el sistema de deshacer.

Un vistazo más detallado al modelo de texto y a la vista de texto

El modelo de texto

El subsistema del modelo de texto consta de diferentes agrupaciones de tipos de texto. Estos incluyen el búfer de texto, las instantáneas de texto y los intervalos de texto.

Búferes de texto y instantáneas de texto

La ITextBuffer interfaz representa una secuencia de caracteres Unicode codificados mediante UTF-16, que es la codificación que usa el String tipo en .NET Framework. Un búfer de texto se puede conservar como un documento del sistema de archivos, pero no es necesario.

ITextBufferFactoryService se usa para crear un búfer de texto vacío o un búfer de texto que se inicializa desde una cadena o desde TextReader. El búfer de texto se puede conservar en el sistema de archivos como .ITextDocument

Cualquier subproceso puede editar el búfer de texto hasta que un subproceso tome posesión del búfer de texto llamando a TakeThreadOwnership. Después, solo ese subproceso puede realizar modificaciones.

Un búfer de texto puede pasar por muchas versiones durante su vigencia. Se genera una nueva versión cada vez que se edita el búfer y un inmutable ITextSnapshot representa el contenido de esa versión del búfer. Dado que las instantáneas de texto son inmutables, puede acceder a una instantánea de texto en cualquier subproceso, sin restricciones, incluso si el búfer de texto que representa continúa modificando.

Instantáneas de texto y líneas de instantáneas de texto

Puede ver el contenido de una instantánea de texto como una secuencia de caracteres o como una secuencia de líneas. Los caracteres y las líneas se indexan a partir de cero. Una instantánea de texto vacía contiene cero caracteres y una línea vacía. Una línea está delimitada por cualquier secuencia de caracteres de salto de línea Unicode válida o por el principio o el final del búfer. Los caracteres de salto de línea se representan explícitamente en la instantánea de texto y los saltos de línea de una instantánea de texto no tienen que ser todos iguales.

Nota:

Para obtener más información sobre los caracteres de salto de línea en el editor de Visual Studio, vea Codificaciones y saltos de línea.

Una línea de texto se representa mediante un ITextSnapshotLine objeto , que se puede obtener de una instantánea de texto para un número de línea determinado o para una posición de carácter determinada.

SnapshotPoints, SnapshotSpans y NormalizedSnapshotSpanCollections

SnapshotPoint representa una posición de carácter en una instantánea. Se garantiza que la posición se encuentra entre cero y la longitud de la instantánea. SnapshotSpan un objeto representa un intervalo de texto en una instantánea. Se garantiza que su posición final se encuentra entre cero y la longitud de la instantánea. NormalizedSnapshotSpanCollection consta de un conjunto de SnapshotSpan objetos de la misma instantánea.

Intervalos y NormalizedSpanCollections

Span representa un intervalo que se puede aplicar a un intervalo de texto en una instantánea de texto. Las posiciones de instantánea son de base cero, por lo que los intervalos pueden comenzar en cualquier posición, incluido cero. La End propiedad de un intervalo es igual a la suma de su Start propiedad y su Length propiedad. No Span incluye el carácter indizado por la End propiedad . Por ejemplo, un intervalo que tiene Start=5 y Length=3 tiene End=8 e incluye los caracteres en las posiciones 5, 6 y 7. La notación de este intervalo es [5..8].

Dos intervalos se intersecan si tienen posiciones en común, incluida la posición Final. Por lo tanto, la intersección de [3, 5) y [2, 7) es [3, 5) y la intersección de [3, 5) y [5, 7) es [5, 5). (Observe que [5, 5) es un intervalo vacío).)

Dos intervalos se superponen si tienen posiciones en común, excepto la posición Final. Un intervalo vacío nunca se superpone a ningún otro intervalo y la superposición de dos intervalos nunca está vacía.

Es NormalizedSpanCollection una lista de intervalos en el orden de las propiedades Start de los intervalos. En la lista, se combinan intervalos superpuestos o de botones. Por ejemplo, dado el conjunto de intervalos [5..9), [0..1), [3..6) y [9..10), la lista normalizada de intervalos es [0..1), [3..10).

Notificaciones de cambio de texto, TextVersion y ITextEdit

El contenido de un búfer de texto se puede cambiar mediante un ITextEdit objeto . La creación de este objeto (mediante uno de los CreateEdit() métodos de ) inicia una transacción de ITextBuffertexto que consta de ediciones de texto. Cada edición es un reemplazo de algún intervalo de texto en el búfer por una cadena. Las coordenadas y el contenido de cada edición se expresan en relación con la instantánea del búfer cuando se inició la transacción. El ITextEdit objeto ajusta las coordenadas de las ediciones afectadas por otras modificaciones de la misma transacción.

Por ejemplo, considere un búfer de texto que contenga esta cadena:

abcdefghij

Aplique una transacción que contenga dos ediciones, una edición que reemplace el intervalo en [2..4) mediante el carácter X y una segunda edición que reemplace el intervalo en [6..9) mediante el carácter Y. El resultado es este búfer:

abXefYj

Las coordenadas de la segunda edición se calcularon con respecto al contenido del búfer al principio de la transacción, antes de aplicar la primera edición.

Los cambios en el búfer surten efecto cuando el ITextEdit objeto se confirma llamando a su Apply() método. Si se ha producido al menos una edición no vacía, se crea un nuevo ITextVersion , se crea un nuevo ITextSnapshot y se genera un Changed evento. Cada versión de texto tiene una instantánea de texto diferente. Una instantánea de texto representa el estado completo del búfer de texto después de una transacción de edición, pero una versión de texto describe solo los cambios de una instantánea a la siguiente. En general, las instantáneas de texto están diseñadas para usarse una vez y, a continuación, se descartan, mientras que las versiones de texto deben permanecer activas durante algún tiempo.

Una versión de texto contiene un INormalizedTextChangeCollection. En esta colección se describen los cambios que, cuando se aplican a la instantánea, generan la instantánea posterior. Cada ITextChange de la colección contiene la posición de carácter del cambio, la cadena reemplazada y la cadena de reemplazo. La cadena reemplazada está vacía para una inserción básica y la cadena de reemplazo está vacía para una eliminación básica. La colección normalizada siempre null es para la versión más reciente del búfer de texto.

Solo se puede crear una instancia de un ITextEdit objeto para un búfer de texto en cualquier momento y todas las modificaciones de texto deben realizarse en el subproceso que posee el búfer de texto (si se ha reclamado la propiedad). Una edición de texto se puede abandonar llamando a su Cancel método o a su Dispose método.

ITextBuffer también proporciona Insert()métodos , Delete()y Replace() que se asemejan a los que se encuentran en la ITextEdit interfaz. Llamar a estos tiene el mismo efecto que crear un ITextEdit objeto, realizar la llamada similar y, a continuación, aplicar la edición.

Puntos de seguimiento y intervalos de seguimiento

ITrackingPoint representa una posición de carácter en un búfer de texto. Si el búfer se edita de una manera que hace que la posición del carácter cambie, el punto de seguimiento cambia con él. Por ejemplo, si un punto de seguimiento hace referencia a la posición 10 de un búfer y se insertan cinco caracteres al principio del búfer, el punto de seguimiento hace referencia a la posición 15. Si una inserción se produce precisamente en la posición indicada por el punto de seguimiento, su comportamiento viene determinado por su PointTrackingMode, que puede ser Positive o Negative. Si el modo de seguimiento es positivo, el punto de seguimiento hace referencia al mismo carácter, que ahora está al final de la inserción. Si el modo de seguimiento es negativo, el punto de seguimiento hace referencia al primer carácter insertado en la posición original. Si se elimina el carácter en la posición representada por un punto de seguimiento, el punto de seguimiento cambia al primer carácter que sigue al intervalo eliminado. Por ejemplo, si un punto de seguimiento hace referencia al carácter en la posición 5 y se eliminan los caracteres de las posiciones 3 a 6, el punto de seguimiento hace referencia al carácter en la posición 3.

ITrackingSpan representa un intervalo de caracteres en lugar de solo una posición. Su comportamiento viene determinado por su SpanTrackingMode. Si el modo de seguimiento de intervalos es SpanTrackingMode.EdgeInclusive, el intervalo de seguimiento crece para incorporar texto insertado en sus bordes. Si el modo de seguimiento de intervalo es SpanTrackingMode.EdgeExclusive, el intervalo de seguimiento no incorpora texto insertado en sus bordes. Sin embargo, si el modo de seguimiento de intervalos es SpanTrackingMode.EdgePositive, una inserción inserta la posición actual hacia el inicio y, si el modo de seguimiento de intervalo es SpanTrackingMode.EdgeNegative, una inserción inserta la posición actual hacia el final.

Puede obtener la posición de un punto de seguimiento o el intervalo de un intervalo de seguimiento para cualquier instantánea del búfer de texto al que pertenecen. Los puntos de seguimiento y los intervalos de seguimiento se pueden hacer referencia de forma segura desde cualquier subproceso.

Tipos de contenido

Los tipos de contenido son un mecanismo para definir diferentes tipos de contenido. Un tipo de contenido puede ser un tipo de archivo como "text", "code" o "binary" o un tipo de tecnología como "xml", "vb" o "c#". Por ejemplo, la palabra "using" es una palabra clave en C# y Visual Basic, pero no en otros lenguajes de programación. Por lo tanto, la definición de esta palabra clave se limitaría a los tipos de contenido "c#" y "vb".

Los tipos de contenido se usan como filtro para adornos y otros elementos del editor. Muchas características del editor y puntos de extensión se definen por tipo de contenido. Por ejemplo, el coloración de texto es diferente para los archivos de texto sin formato, los archivos XML y los archivos de código fuente de Visual Basic. Los búferes de texto generalmente se asignan a un tipo de contenido cuando se crean y se puede cambiar el tipo de contenido de un búfer de texto.

Los tipos de contenido pueden heredar varios de otros tipos de contenido. ContentTypeDefinition permite especificar varios tipos base como elementos primarios de un tipo de contenido determinado.

Los desarrolladores pueden definir sus propios tipos de contenido y registrarlos mediante .IContentTypeRegistryService Muchas características del editor se pueden definir con respecto a un tipo de contenido específico mediante .ContentTypeAttribute Por ejemplo, los márgenes del editor, los adornos y los controladores de mouse se pueden definir para que solo se apliquen a los editores que muestran tipos de contenido concretos.

Vista de texto

La parte de vista del patrón del controlador de vista de modelo (MVC) define la vista de texto, el formato de la vista, elementos gráficos como la barra de desplazamiento y el símbolo de intercalación. Todos los elementos de presentación del editor de Visual Studio se basan en WPF.

Vistas de texto

La ITextView interfaz es una representación independiente de la plataforma de una vista de texto. Se usa principalmente para mostrar documentos de texto en una ventana, pero también se puede usar para otros fines, por ejemplo, en una información sobre herramientas.

La vista de texto hace referencia a diferentes tipos de búferes de texto. La TextViewModel propiedad hace referencia a un ITextViewModel objeto que apunta a estos tres búferes de texto diferentes: el búfer de datos, que es el búfer de nivel de datos superior, el búfer de edición, en el que se produce la edición y el búfer visual, que es el búfer que se muestra en la vista de texto.

El texto tiene el formato basado en los clasificadores que se adjuntan al búfer de texto subyacente y se adorna mediante los proveedores de adornos que se adjuntan a la propia vista de texto.

Sistema de coordenadas de vista de texto

El sistema de coordenadas de vista de texto especifica posiciones en la vista de texto. En este sistema de coordenadas, el valor x 0,0 corresponde al borde izquierdo del texto que se muestra y el valor y 0,0 corresponde al borde superior del texto que se muestra. La coordenada x aumenta de izquierda a derecha y la coordenada y aumenta de arriba a abajo.

Una ventanilla (la parte del texto visible en la ventana de texto) no se puede desplazar de la misma manera horizontalmente que se desplaza verticalmente. Una ventanilla se desplaza horizontalmente cambiando su coordenada izquierda para que se mueva con respecto a la superficie de dibujo. Sin embargo, una ventanilla solo se puede desplazar verticalmente cambiando el texto representado, lo que hace que se genere un LayoutChanged evento.

Las distancias del sistema de coordenadas corresponden a píxeles lógicos. Si la superficie de representación de texto se muestra sin una transformación de escalado, una unidad del sistema de coordenadas de representación de texto corresponde a un píxel de la pantalla.

Márgenes

La ITextViewMargin interfaz representa un margen y habilita el control de la visibilidad del margen y su tamaño. Hay cuatro márgenes predefinidos, que se denominan "Top", "Left", "Right" y "Bottom" y se adjuntan al borde superior, inferior, izquierdo o derecho de una vista. Estos márgenes son contenedores en los que se pueden colocar otros márgenes. La interfaz define métodos que devuelven el tamaño del margen y la visibilidad de un margen. Los márgenes son elementos visuales que proporcionan información adicional sobre la vista de texto a la que se adjuntan. Por ejemplo, el margen de número de línea muestra números de línea para la vista de texto. El margen del glifo muestra los elementos de la interfaz de usuario.

La IWpfTextViewMarginProvider interfaz controla la creación y colocación de márgenes. Los márgenes se pueden ordenar con respecto a otros márgenes. Los márgenes de mayor prioridad se encuentran más cerca de la vista de texto. Por ejemplo, si hay dos márgenes izquierdos, el margen A y el margen B, y el margen B tiene una prioridad menor que el margen A, el margen B aparece a la izquierda del margen A.

Host de vista de texto

La IWpfTextViewHost interfaz contiene la vista de texto y las decoraciones de botones que acompañan a la vista, por ejemplo, barras de desplazamiento. El host de vista de texto también contiene márgenes adjuntos a un borde de la vista.

Texto con formato

El texto que se muestra en una vista de texto se compone de ITextViewLine objetos . Cada línea de vista de texto corresponde a una línea de texto de la vista de texto. Las líneas largas del búfer de texto subyacente se pueden ocultar parcialmente (si el ajuste de palabras no está habilitado) o dividirse en varias líneas de vista de texto. La ITextViewLine interfaz contiene métodos y propiedades para la asignación entre coordenadas y caracteres, y para los adornos que pueden estar asociados a la línea.

ITextViewLine Los objetos se crean mediante una IFormattedLineSource interfaz . Si solo le preocupa el texto que se muestra actualmente en la vista, puede omitir el origen de formato. Si está interesado en el formato de texto que no se muestra en la vista (por ejemplo, para admitir un corte y pegado de texto enriquecido), puede usar IFormattedLineSource para dar formato al texto en un búfer de texto.

La vista de texto da formato de uno ITextSnapshotLine a uno.

Características del editor

Las características del editor están diseñadas para que la definición de la característica sea independiente de su implementación. El editor incluye estas características:

  • Etiquetas y clasificadores

  • Adornos

  • Proyección

  • esquematizar

  • Enlaces de mouse y teclas

  • Operaciones y primitivos

  • IntelliSense

Etiquetas y clasificadores

Las etiquetas son marcadores asociados a un intervalo de texto. Se pueden presentar de diferentes maneras, por ejemplo, mediante el color de texto, subrayados, gráficos o elementos emergentes. Los clasificadores son un tipo de etiqueta.

Otros tipos de etiquetas son TextMarkerTag para resaltar texto, OutliningRegionTag para esquematización y ErrorTag para errores de compilación.

Tipos de clasificación

Una IClassificationType interfaz representa una clase de equivalencia, que es una categoría abstracta de texto. Los tipos de clasificación pueden heredar varios de otros tipos de clasificación. Por ejemplo, las clasificaciones del lenguaje de programación pueden incluir "palabra clave", "comentario" e "identificador", que todos heredan de "código". Los tipos de clasificación de lenguaje natural pueden incluir "sustantivo", "verbo" y "adjetivo", que todos heredan de "lenguaje natural".

Clasificaciones

Una clasificación es una instancia de un tipo de clasificación determinado, normalmente en un intervalo de texto. ClassificationSpan Se usa para representar una clasificación. Un intervalo de clasificación se puede considerar como una etiqueta que cubre un intervalo determinado de texto y indica al sistema que este intervalo de texto es de un tipo de clasificación determinado.

Clasificadores

Un IClassifier es un mecanismo que divide el texto en un conjunto de clasificaciones. Los clasificadores deben definirse para tipos de contenido específicos y crear instancias para búferes de texto específicos. Los clientes deben implementar IClassifier para participar en la clasificación de texto.

Agregadores clasificadores

Un agregador clasificador es un mecanismo que combina todos los clasificadores de un búfer de texto en un solo conjunto de clasificaciones. Por ejemplo, tanto un clasificador de C# como un clasificador de idioma inglés podrían crear clasificaciones sobre un comentario en un archivo de C#. Tenga en cuenta este comentario:

// This method produces a classifier

Un clasificador de C# podría etiquetar todo el intervalo como comentario y el clasificador de idioma inglés podría clasificar "produce" como "verbo" y "método" como un "sustantivo". El agregador genera un conjunto de clasificaciones no superpuestas y el tipo del conjunto se basa en todas las contribuciones.

Un agregador clasificador también es un clasificador porque divide el texto en un conjunto de clasificaciones. El agregador clasificador también garantiza que no haya clasificaciones superpuestas y que las clasificaciones se ordenen. Los clasificadores individuales son libres de devolver cualquier conjunto de clasificaciones, en cualquier orden y superposición de cualquier manera.

Formato de clasificación y coloración de texto

El formato de texto es un ejemplo de una característica que se basa en la clasificación de texto. La capa de vista de texto la usa para determinar la presentación del texto en una aplicación. El área de formato de texto depende de WPF, pero la definición lógica de las clasificaciones no.

Un formato de clasificación es un conjunto de propiedades de formato para un tipo de clasificación específico. Estos formatos heredan del formato del elemento primario del tipo de clasificación.

IClassificationFormatMap es un mapa de un tipo de clasificación a un conjunto de propiedades de formato de texto. La implementación del mapa de formato en el editor controla todas las exportaciones de formatos de clasificación.

Adornos

Los adornos son efectos gráficos que no están directamente relacionados con la fuente y el color de los caracteres de la vista de texto. Por ejemplo, el subrayado ondulado rojo que se usa para marcar código no compilado en muchos lenguajes de programación es un adorno incrustado y la información sobre herramientas son adornos emergentes. Los adornos se derivan de UIElement e implementan ITag. Dos tipos especializados de etiqueta de adorno son , SpaceNegotiatingAdornmentTagpara adornos que ocupan el mismo espacio que el texto en una vista y , para el ErrorTagsubrayado de subrayado ondulado.

Los adornos incrustados son gráficos que forman parte de la vista de texto con formato. Se organizan en diferentes capas de orden Z. Hay tres capas integradas, como se indica a continuación: texto, intercalación y selección. Sin embargo, los desarrolladores pueden definir más capas y colocarlas en orden con respecto a otras. Los tres tipos de adornos incrustados son adornos relativos al texto (que se mueven cuando se mueve el texto y se eliminan cuando se elimina el texto), adornos relativos a la vista (que tienen que ver con partes que no son de texto de la vista) y adornos controlados por el propietario (el desarrollador debe administrar su ubicación).

Los adornos emergentes son gráficos que aparecen en una ventana pequeña encima de la vista de texto, por ejemplo, información sobre herramientas.

Proyección

La proyección es una técnica para construir un tipo diferente de búfer de texto que realmente no almacena texto, sino que combina texto de otros búferes de texto. Por ejemplo, se puede usar un búfer de proyección para concatenar el texto de otros dos búferes y presentar el resultado como si estuviera en un solo búfer, o para ocultar partes del texto en un búfer. Un búfer de proyección puede actuar como un búfer de origen en otro búfer de proyección. Un conjunto de búferes relacionados con la proyección se puede construir para reorganizar el texto de muchas maneras diferentes. (Este conjunto también se conoce como grafo de búfer). La característica de esquematización de texto de Visual Studio se implementa mediante un búfer de proyección para ocultar el texto contraído y el editor de Visual Studio para ASP.NET páginas usa la proyección para admitir lenguajes incrustados como Visual Basic y C#.

IProjectionBuffer Se crea mediante IProjectionBufferFactoryService. Un búfer de proyección se representa mediante una secuencia ordenada de objetos que se conocen como intervalos de ITrackingSpan origen. El contenido de estos intervalos se presenta como una secuencia de caracteres. Los búferes de texto desde los que se dibujan los intervalos de origen se denominan búferes de origen. Los clientes de un búfer de proyección no tienen que tener en cuenta que difieren de un búfer de texto normal.

El búfer de proyección escucha eventos de cambio de texto en los búferes de origen. Cuando cambia el texto de un intervalo de origen, el búfer de proyección asigna las coordenadas de texto modificadas a sus propias coordenadas y genera los eventos de cambio de texto adecuados. Por ejemplo, considere los búferes de origen A y B que tienen estos contenidos:

A: ABCDE
B: vwxyz

Si el búfer de proyección P se forma a partir de dos intervalos de texto, uno que tiene todo el búfer A y el otro que tiene todo el búfer B, P tiene el siguiente contenido:

P: ABCDEvwxyz

Si la subcadena xy se elimina del búfer B, el búfer P genera un evento que indica que se eliminaron los caracteres de las posiciones 7 y 8.

El búfer de proyección también se puede editar directamente. Propaga las modificaciones a los búferes de origen adecuados. Por ejemplo, si una cadena se inserta en el búfer P en la posición 6 (la posición original del carácter "v"), la inserción se propaga al búfer B en la posición 1.

Hay restricciones en los intervalos de origen que contribuyen a un búfer de proyección. Es posible que los intervalos de origen no se superpongan; una ubicación en un búfer de proyección no se puede asignar a más de una ubicación en ningún búfer de origen y una ubicación en un búfer de origen no se puede asignar a más de una ubicación en un búfer de proyección. No se permiten circularidades en la relación de búfer de origen.

Los eventos se generan cuando cambia el conjunto de búferes de origen para un búfer de proyección y cuando cambia el conjunto de intervalos de origen. Un búfer de elisión es un tipo especial de búfer de proyección. Se usa principalmente para esquematización y para operaciones que expanden y contraen bloques de texto. Un búfer de elisión se basa solo en un búfer de origen y los intervalos del búfer de elisión deben ordenarse igual que se ordenan en el búfer de origen.

Gráfico de búfer

La IBufferGraph interfaz permite la asignación en un gráfico de búferes de proyección. Todos los búferes de texto y los búferes de proyección se recopilan en un gráfico acíclico dirigido, al igual que el árbol de sintaxis abstracta generado por un compilador de lenguaje. El gráfico se define mediante el búfer superior, que puede ser cualquier búfer de texto. El gráfico de búfer puede asignarse desde un punto del búfer superior a un punto de un búfer de origen o desde un intervalo del búfer superior a un conjunto de intervalos en un búfer de origen. Del mismo modo, puede asignar un punto o intervalo de un búfer de origen a un punto del búfer superior. Los gráficos de búfer se crean mediante .IBufferGraphFactoryService

Eventos y búferes de proyección

Cuando se modifica un búfer de proyección, las modificaciones se envían desde el búfer de proyección a los búferes que dependen de él. Una vez modificados todos los búferes, se generan eventos de cambio de búfer, empezando por el búfer más profundo.

esquematizar

La esquematización es la capacidad de expandir o contraer diferentes bloques de texto en una vista de texto. La esquematización se define como un tipo de ITag, de la misma manera que se definen los adornos. Es OutliningRegionTag una etiqueta que define una región de texto que se puede expandir o contraer. Para usar la esquematización, debe importar IOutliningManagerService para obtener un IOutliningManager. El administrador de esquematización enumera, contrae y expande los distintos bloques, que se representan como ICollapsible objetos y genera eventos en consecuencia.

Enlaces del mouse

Los enlaces del mouse vinculan los movimientos del mouse a distintos comandos. Los enlaces del mouse se definen mediante un IMouseProcessorProvider, y los enlaces de teclas se definen mediante un IKeyProcessorProvider. Crea IWpfTextViewHost automáticamente una instancia de todos los enlaces y los conecta a eventos del mouse en la vista.

La IMouseProcessor interfaz contiene controladores de eventos previos y posteriores al proceso para diferentes eventos del mouse. Para controlar uno de los eventos, puede invalidar algunos de los métodos de MouseProcessorBase.

Operaciones del editor

Las operaciones del editor se pueden usar para automatizar la interacción con el editor, con fines de scripting u otros fines. Puede importar para IEditorOperationsFactoryService acceder a las operaciones en un determinado ITextView. A continuación, puede usar estos objetos para modificar la selección, desplazar la vista o mover el símbolo de intercalación a diferentes partes de la vista.

IntelliSense

IntelliSense admite la finalización de instrucciones, la ayuda de firma (también conocida como información de parámetros), la información rápida y las bombillas.

La finalización de instrucciones proporciona listas emergentes de posibles finalizaciones para nombres de método, elementos XML y otros elementos de codificación o marcado. En general, un gesto de usuario invoca una sesión de finalización. La sesión muestra la lista de posibles finalizaciones y el usuario puede seleccionar una o descartar la lista. ICompletionBroker es responsable de crear y desencadenar .ICompletionSession ICompletionSource calcula los CompletionSet elementos de finalización de la sesión.

Solución de problemas de importación y exportación: acceso al registro de errores de composición de MEF

Puede experimentar problemas si intenta importar algo que no existe en la instalación actual de VS o si crea incorrectamente la importación o exportación. La forma principal de buscar y solucionar estos problemas es hacer referencia al registro de errores de composición de Managed Extensibility Framework (MEF), almacenado en %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.