2011-07-01 2 views
8

Je souhaite créer une extension Visual Studio 2010 VSIX qui développe du texte basé sur un appel à une méthode (en utilisant le Zen Coding selector-based syntax). Idéalement, un utilisateur taperait une chaîne de texte, frapperait un raccourci clavier et la chaîne de texte serait développée.Extension Visual Studio 2010 qui fait l'expansion de code

J'ai regardé beaucoup d'échantillons, mais ils se concentrent tous sur des services linguistiques complets ou sur de simples parures. Idéalement, j'aimerais trouver un échantillon complet, mais je serais content des interfaces/classes et du code.

Quelques références moi avons regardé:

Mise à jour: Je sais que ReSharper et CodeRush font ce genre de chose. Je voudrais le faire en tant que plugin autonome si possible.

+2

Semble comme "extraits de code" sur les stéroïdes. Je me demande s'il y a quelque chose que vous pouvez tirer parti de cette fonctionnalité. –

+0

Si l'expansion ne repose pas sur les détails contextuels de la base de code, un script AutoHotKey suffira peut-être. – AakashM

+0

Je viens de sortir une extension comme celle-ci en fait .. Check it out ici: http://yngvenilsen.wordpress.com/2011/11/19/zencoding-visual-studio-2010-extension-v1-7/ –

Répondre

9

Il semble que vous cherchiez un bon exemple/une référence sur la façon de gérer le clavier pour diriger l'insertion de texte dans le tampon Visual Studio.

Malheureusement, ce n'est pas une question qui a une réponse simple. La gestion du clavier dans Visual Studio est au mieux complexe et les cheveux sont parfois frustrants. J'ai essayé de garder cette réponse aussi simple que possible mais malheureusement le sujet ne se prête pas à la simplicité

Pour commencer, il existe au moins 5 mécanismes différents par lesquels Visual Studio achemine l'entrée clavier en commandes.

Lequel de ces vous devez accrocher dépend d'un co nombre de facteurs

  • Quelles versions de Visual Studio vous voulez que l'addin fonctionne?
  • Quel type de module complémentaire en serez-vous la construction: une réelle Addin, Vs Package ou VSIX
  • A quel point vous vous souciez de gagner la bataille pour l'entrée du clavier

Lequel de ces vous devez connecter en dépend beaucoup de la façon dont vous voulez que votre addin fonctionne et dans quelles versions de Visual Studio vous voulez qu'il fonctionne. Bien qu'il existe 2 routes de base que vous pouvez prendre si

Le premier est de développer un paquet Visual Studio et enregistrer un DTE.Command pour chaque touche de raccourci dans votre extension. Vous devez ensuite ajouter IOleCommandTarget dans la chaîne de filtrage IVsTextView pour traiter vos commandes. Cette approche vous permettra de traiter vos raccourcis-clavier dans la majorité des scénarios.

Le second est de développer un VSIX, accrocher dans la chaîne IOleCommandTarget du IVsTextView et intercepter de vraies commandes Visual Studio qui correspondent à vos touches de raccourci.

Ces deux approches ont leurs hauts et leurs bas mais ma réponse est déjà un peu trop longue. Si vous pouvez me donner plus de détails, je peux essayer de vous donner une réponse plus concise et utile.

Comme pour les exemples. VsVim gère assez bien le clavier pour Visual Studio et a un exemple pour l'une des méthodes mentionnées ci-dessus.

Permettez-moi de savoir qui vous intéresse et je peux vous indiquer au bon endroit dans le code source.

De plus, en travaillant moi-même à trouver l'enchevêtrement de la saisie au clavier, j'ai essayé de garder une trace de tout ce que j'avais appris. Il est pas complètement à jour, mais ce document décrit les aspects les plus fondamentaux de la façon dont l'entrée est acheminé

EDIT

Jon indiqué dans les commentaires du VSIX + IOleCommandTarget itinéraire

Ceci est à mon humble avis l'approche la plus simple. Cependant, la seule chose à savoir est de savoir comment les liaisons de commande affectent les données qui sont transmises par la chaîne IOleCommandTarget. La liaison de commande Visual Studio se produit avant que les données soient transmises à la chaîne IOleCommandTarget. Donc, si une entrée clé donnée est liée à une commande, elle sera transmise IOleCommandTarget comme commande et non comme entrée de clavier.

Par exemple, CTRL-Z est généralement mappé à la commande Visual Studio Undo. Si l'utilisateur tape CTRL-Z alors IOleCommandTarget verra la commande Annuler et non l'entrée du clavier CTRL-Z.

Voici quelques exemples que vous pouvez être intéressé à regarder

  • VsCommandTarget: exemple d'implémentation de IOleCommandTarget
  • OleCommandUtil: Permet de convertir les données transmises en IOleCommandTarget en commandes réelles et entrée du clavier
  • HostFactory: Détails comment raccorder un IOleCommandTarget dans un IVsTextView à partir d'une extension VSIX.
+0

Merci! Je voudrais ajouter le support de Zen Coding à Visual Studio, de préférence en tant que VSIX. Voici un aperçu: http://coding.smashingmagazine.com/2009/11/21/zen-coding-a-new-way-to-write-html-code/ - semble-t-il que le IOleCommandTarget avec IVsTextView pourrait fonctionner? Zen Coding est écrit en JavaScript, pensant que je pourrais faire appel à cela en utilisant un. JavaScript JavaScript comme IronJs/Jurassic. –

+0

@Jon J'ai mis à jour ma réponse pour avoir un peu plus de détails sur ce scénario. S'il vous plaît laissez-moi savoir si vous avez besoin d'autres informations – JaredPar

1

Je chercherais à construire sur les LiveTemplates de ReSharper. Vous pouvez faire beaucoup avec des macros pour rendre l'expansion plus intelligente que de simples remplir-dans-les-blancs. Je ne suis pas un expert dans ce domaine, mais j'ai vu des modèles assez sophistiqués construits de cette façon.

Questions connexes