2011-07-01 8 views
8

Quiero construir una extensión VSIX de Visual Studio 2010 que expanda algo de texto basado en una llamada a un método (usando el Zen Coding selector-based syntax). Idealmente, un usuario escribiría una cadena de texto, presionaría una tecla rápida y la secuencia de texto se expandiría.Extensión de Visual Studio 2010 que amplía el código

He examinado muchas muestras, pero todas se centran en servicios completos de idiomas o en adornos simples. Idealmente, me gustaría encontrar una muestra de trabajo completa, pero estaría contento con las interfaces/clases y algunos códigos.

Unas referencias yo nos miramos:

Actualización: Yo sé que ReSharper y CodeRush hacen este tipo de cosas. Me gustaría hacer esto como un complemento independiente si es posible.

+2

Suena como "fragmentos de código" en los esteroides. Me pregunto si hay algo que pueda aprovechar de esa función. –

+0

Si la expansión no se basa en los detalles contextuales de la base de código, quizás una secuencia de comandos AutoHotKey sería suficiente. – AakashM

+0

Acabo de lanzar una extensión como esta en realidad ... Míralo aquí: http://yngvenilsen.wordpress.com/2011/11/19/zencoding-visual-studio-2010-extension-v1-7/ –

Respuesta

9

Parece que está buscando un buen ejemplo/referencia sobre cómo manejar el teclado para conducir la inserción de texto en el búfer de Visual Studio.

Lamentablemente, esta no es una pregunta que tenga una respuesta directa. El manejo del teclado en Visual Studio es complejo en el mejor de los casos y, a veces, la frustración del cabello es frustrante. Intenté mantener esta respuesta lo más simple posible, pero desafortunadamente el tema no se presta a la simplicidad

Para empezar hay al menos 5 mecanismos diferentes mediante los cuales Visual Studio enruta la entrada del teclado a los comandos.

¿Cuál de estos necesita enganchar depende de una co uple of factors

  • ¿En qué versiones de Visual Studio desea que funcione el complemento?
  • ¿Qué tipo de add-in va a ser edificio: un complemento real, Vs paquete o VSIX
  • lo mucho que se preocupa por ganar la batalla por la entrada de teclado

¿Cuál de estos es necesario conectar en depende mucho de cómo quiera que funcione su complemento y en qué versiones de Visual Studio desea que funcione. Aunque hay 2 rutas básicas que puede tomar aunque

La primera es desarrollar un paquete de Visual Studio y registrar un DTE.Command por cada tecla de acceso rápido en su extensión. Luego, deberá agregar IOleCommandTarget en la cadena de filtros IVsTextView para procesar sus comandos. Este enfoque le permitirá procesar sus teclas de acceso rápido en la mayoría de los escenarios.

El segundo es desarrollar un VSIX, enganchar en la cadena IOleCommandTarget del e interceptar los comandos reales de Visual Studio que se asignan a sus teclas de acceso rápido.

Ambos enfoques tienen sus altibajos pero mi respuesta ya es demasiado larga. Si puede darme más detalles, puedo intentar darle una respuesta más concisa y útil.

Como por ejemplos. VsVim realiza un manejo de teclado bastante extenso para Visual Studio y tiene un ejemplo para cualquiera de los métodos anteriores que mencioné.

Déjame saber cuál interés, usted y yo se puede apuntar al lugar correcto en el código fuente.

Además, al trabajar conmigo mismo para descifrar el enredo de la entrada del teclado, traté de mantener un registro de todo lo que había aprendido. No es totalmente al día, pero este documento se describen los aspectos más básicos de la forma de entrada va a parar

EDITAR

Jon indica en los comentarios ruta del VSIX + IOleCommandTarget

Esto es en mi humilde opinión el enfoque más simple. Sin embargo, una cosa a tener en cuenta es cómo los enlaces de comandos afectan a los datos que se pasan a la cadena IOleCommandTarget. El enlace del comando de Visual Studio ocurre antes de que los datos pasen a la cadena IOleCommandTarget. Por lo tanto, si una entrada de clave dada está vinculada a un comando, se transmitirá IOleCommandTarget como el comando y no la entrada del teclado. Por ejemplo, CTRL-Z se asigna comúnmente al comando Visual Studio Undo. Si el usuario toca CTRL-Z, entonces IOleCommandTarget verá el comando Deshacer y no la entrada del teclado CTRL-Z.

Éstos son algunos ejemplos que pueda estar interesado en el estudio de

  • VsCommandTarget: Ejemplo de implementación de IOleCommandTarget
  • OleCommandUtil: Se utiliza para convertir los datos pasados ​​en IOleCommandTarget en comandos reales y la entrada de teclado
  • HostFactory: Detalla cómo conectar realmente un IOleCommandTarget en un IVsTextView desde una extensión VSIX.
+0

¡Gracias! Me gustaría agregar soporte de Zen Coding a Visual Studio, preferiblemente como un VSIX. Aquí hay una descripción general: http://coding.smashingmagazine.com/2009/11/21/zen-coding-a-new-way-to-write-html-code/ - ¿Parece que tal vez funcione la aplicación IOleCommandTarget con IVsTextView? Zen Coding está escrito en JavaScript, pensando que podría invocarlo usando una impl JavaScript .NET como IronJs/Jurassic. –

+0

@Jon Actualicé mi respuesta para tener un poco más de detalle sobre ese escenario. Por favor, avíseme si necesita cualquier otra información – JaredPar

1

Me gustaría basarse en las Plantillas Vivas de ReSharper. Puede hacer mucho con las macros para hacer que la expansión sea más inteligente que el simple relleno de espacios en blanco. No soy un experto en esa área, pero he visto algunas plantillas bastante sofisticadas construidas de esta manera.

Cuestiones relacionadas