2010-11-03 10 views
6

Hace tiempo que quería crear una extensión simple para manipular texto en Visual Studio, y ahora finalmente he encontrado algo de tiempo para analizar cómo se escriben las extensiones. Lo que tengo en mente podría lograrse a través de las macros de VBA, pero preferiría implementarlo como una extensión "real"; como un proceso de aprendizaje, y porque honestamente no soporto VBA.Creando una extensión simple de Visual Studio 2010 para manipular texto

Después de una buena cantidad de googlear, leer blogs, profundizar en MSDN y buscar publicaciones de StackOverflow, creo que he reunido suficiente información para poder implementarla, pero me gustaría saber si me estoy acercando a las cosas justo antes de empezar a cortar lejos :)

Lo que me gustaría es:

  1. comandos que los usuarios pueden unirse a través de teclas de acceso rápido a Herramientas-> Opciones-> Teclado Registro.
  2. Modifique el búfer de texto de la ventana activa cuando se invocan Comandos.
  3. que realmente no se preocupan por los menús o barras de herramientas, pero saben cómo agregarlo a través de archivos .vsct (hay mejores opciones?)

Para # 1, parece que tengo que hacer un VSPackage completa , archivo .vsct, etcétera. En su lugar, no hay un punto de extensión MEF agradable y fácil de manejar. (Tal vez exportar un IWpfTextViewCreationListener y juguetear con el manejo manual de atajos de teclado, pero eso sería un gran truco).

Para el n. ° 2, no estoy seguro de cómo obtener un ITextBuffer para el documento activo. Podría ir a través de DTE.ActiveDocument, pero no estoy seguro de cómo obtener un ITextBuffer de eso. Alternativamente, podría hacer algo en la línea de ...

var txtMgr = (IVsTextManager)ServiceProvider.GetService(typeof(SVsTextManager)); 
IVsTextView textViewCurrent; 
txtMgr.GetActiveView(true, null, out textView); 
IWpfTextView wpfViewCurrent = AdaptersFactory.GetWpfTextView(textView); 
ITextBuffer textCurrent = wpfViewCurrent.TextBuffer; 

... pero que seguro se ve como una forma indirecta de hacer las cosas?

Respuesta

9

Para ambos, echa un vistazo al Align Assignments extension source. Es un componente de paquete/MEF que agrega un comando y lo maneja en la ventana activa.

Su respuesta al n. ° 1 es correcta. La mejor forma de hacer comandos es con un archivo .vsct, que requiere un paquete. Sin embargo, todo lo que un paquete significa es que su proyecto producirá un dll con recursos incrustados (del archivo .vsct) y un archivo .pkgdef, que agrega claves de registro de acuerdo con los atributos que proporciona en su paquete. Es (con suerte) no es demasiado sobrecargado.

Para su segunda pregunta, hay una manera más limpia. Eche un vistazo al command filter, que escucha los comandos en la vista activa, en lugar de escucharlos globalmente y luego encontrar la vista activa. Le permite al shell manejar el enrutamiento de comandos y solo se concentra en la implementación.

+0

Gracias! Hay algo acerca de agregar un filtro a cada VsTextView que me molesta un poco, pero la solución * es * definitivamente mejor.Lástima que uno tenga que lidiar con el feo legado de com/ole, pero al menos es mínimo y puede abstraerse :) – snemarch

0

No del todo seguro de lo que quiere decir con "el búfer de texto", pero asumiendo que quiere decir o bien el archivo de texto actual, que está abierta o la selección actual, he aquí algo de código que tengo en un paquete para acceder a los:

EnvDTE.DTE app = (EnvDTE.DTE)GetService(typeof(SDTE)); 
if (app.ActiveDocument != null && app.ActiveDocument.Type == "Text") 
{ 
    EnvDTE.TextDocument text = (EnvDTE.TextDocument)app.ActiveDocument.Object(String.Empty); 
    if (!text.Selection.IsEmpty) 
    { 
     //work with text.Selection.Text 
    } 
} 

Por supuesto, si está haciendo una extensión de editor, sería diferente.

+0

Me refiero a obtener ITextBuffer para el documento actual/activo, que es la nueva forma de interactuar con los servicios de edición de texto, en lugar de los métodos DTE/Selección más limitados. – snemarch

Cuestiones relacionadas