Conceptos de extensibilidad del editor

En este artículo se describe el modelo de objetos de extensibilidad que representa el editor de Visual Studio y el documento de texto que se abre para su edición. Para obtener una introducción al trabajo con la funcionalidad de extensión del editor, consulte Uso de la extensibilidad del editor de Visual Studio.

El modelo de objetos de extensibilidad del Editor de Visual Studio se compone de algunas partes integrales. En este artículo se tratan ITextViewSnapshot, ITextDocumentSnapshot y otras representaciones abstractas del documento completo, así como Position y Span, que representan la ubicación y los intervalos de texto, respectivamente.

ITextViewSnapshot

ITextViewSnapshot contiene el URI y la información de versión necesaria para adquirir un ITextDocumentSnapshot, así como algunas propiedades de la vista de texto, como selecciones.

  • Este objeto es inmutable y nunca cambiará después de crearlo.
  • Puede usar ITextViewSnapshot.GetTextDocumentAsync() para obtener el contenido del documento. Llamar a este método es costoso y solo debe realizarse si necesita el contenido del documento.
  • ITextViewSnapshot no se puede cambiar directamente. Todos los cambios se solicitan a través de la mutación. Consulte Realizar cambios en un documento de texto desde una extensión.

ITextDocumentSnapshot

ITextDocumentSnapshot contiene el contenido del documento de texto desde un momento dado o una versión.

Si está familiarizado con las extensiones heredadas de Visual Studio, ITextDocumentSnapshot es casi igual que ITextSnapshot y admite la mayoría de los mismos métodos para acceder al texto.

Procedimientos recomendados:

  • Puede usar Position y Span para representar subcadenas en el documento sin gastar recursos copiando o asignando cadenas. La mayoría de las API funcionan en términos de estos primitivos.
  • Puede usar la sintaxis del indexador, textDocument[0], para leer caracteres por carácter en el documento sin copiarla en una cadena.
  • Si debe crear una cadena como para usarla como clave de diccionario, use la sobrecarga que toma un Span, para evitar crear una cadena de gran tamaño desde toda la línea o documento.
  • Evite asumir que las líneas o documentos serán breves. Muchos lenguajes minimizan en líneas enormes o consumen archivos muy grandes
    • ITextDocumentSnapshot hace referencia a estructuras de datos grandes que pueden consumir memoria si se almacena una versión suficiente antigua. El procedimiento recomendado consiste en actualizar periódicamente las posiciones y intervalos que va a almacenar a largo plazo a la versión más reciente del documento a través de su TranslateTo() método para que la versión anterior ITextDocumentSnapshot se pueda recopilar como elementos no utilizados.

Posición

Representa una posición dentro del documento de texto. En lugar de las int posiciones, el tipo Position es consciente del ITextDocumentSnapshot del que procede y admite GetChar() para obtener directamente el carácter en ese momento.

Si está familiarizado con las extensiones heredadas de Visual Studio, Position es casi igual que SnapshotPoint y admite la mayoría de los mismos métodos.

Intervalo

Representa una subcadena contigua de caracteres dentro de un ITextDocumentSnapshot. En lugar de una cadena creada con string.Substring() o ITextDocumentSnapshot.CopyToString(), la creación de un intervalo no requiere asignaciones ni memoria adicional. Más adelante puede llamar a para darse cuenta Span.GetText() de ella en una cadena de forma diferida.

Si está familiarizado con las extensiones heredadas de Visual Studio, Position es casi igual que SnapshotSpan y admite la mayoría de los mismos métodos.

Revise el código de ejemplo para obtener una extensión sencilla basada en editor: