2010-06-14 10 views
6

J'utilise VIM comme éditeur de texte et j'édite beaucoup de fichiers XML et WSDL.Traversée XSD dans VIM

fichiers WSDL ont une section XSD. Y at-il un plugin VIM que je peux utiliser pour parcourir les types XSD? c'est-à-dire, si j'ai la ligne suivante et que le signe '|' signe:

<xsd:element minOccurs="0" name="FooName" type="Magic|FooType"/> 

et j'appuyez sur Ctrl + Alt + Foo (ou un autre combo magique), il me rendre à la définition de MagicFooType, à savoir:

<xsd:complexType name="MagicFooType"> 

Je ne pouvais pas trouver comment utiliser ctags pour cela et tous les autres plugins que j'ai pu trouver sont pour les langages impératifs (ie Java). Y at-il un plugin/script pour faire le travail?

+2

Ne pas près des questions vim/emacs sont matériel approprié pour le SO - http://meta.stackexchange.com/questions/25925/vim-questions-so-or-su.De plus, la réponse à cette question nécessitera des scripts Vim car il n'y a pas de moyen par défaut de faire ce que l'OP demande. – jamessan

Répondre

2

J'ai regardé ce sujet un peu et je me le demande moi-même en tant qu'utilisateur VIM et je travaille avec beaucoup de très gros fichiers XML et fichiers XSD, XSLT et XQuery associés, qui pourraient tous bénéficier de cette sorte de chose, comme je suis sûr que vous pouvez imaginer.

Après quelques recherches, cela peut être fait avec ctags, mais il n'y a rien là-bas au moment qui va créer le fichier ctags pour elle. Essentiellement un CTAG ressemble à ceci:

{tagname}<tab>{tagfile}<tab>{tagaddress} 

Parce que la tagaddress est une commande de mode ex, il peut vous emmener partout dans un fichier particulier à la terre à droite sur la définition. Fondamentalement tout ce que nous aurions besoin de faire est de créer un script qui serait exécuté par le WSDL (ou XSD, ou autre) et, connaissant l'emplacement du tag et du fichier, créer les lignes appropriées dans un fichier ctags pour mapper tous des définitions. On dirait un petit projet amusant et utile.

Désolé que ce n'est pas exactement une réponse complète, mais il est possible de le faire avec ctags et vous donnera la robustesse et vous recherchez.

+0

Malheureusement, il semble le plus pratique. Eh bien, qui sait, peut-être cet été entre deux autres projets :) Si je vais prendre ça dans un mois, aimeriez-vous collaborer? – maayank

+0

Je serais heureux de oui. En fait, j'en ai déjà discuté avec quelques-uns de mes collègues et nous pensons tous que ce serait une bonne idée. N'hésitez pas à me contacter hors ligne et nous pourrions être en mesure de discuter des idées de collaboration. –

+0

Je n'arrive pas à voir votre adresse e-mail et je ne trouve aucune autre méthode de communication personnelle sur SO, alors envoyez-moi un email à [email protected] (ou laissez-le ici, ce qui vous convient :) – maayank

2

GD (« aller à la déclaration ») ne connaît pas le format XML, mais peut faire le travail dans ce cas, en supposant la section XSD est au sommet du WSDL.

+0

Merci, un peu mieux que de chercher manuellement le nom du type, mais comme vous l'avez dit, il n'est pas au courant de xml/xsd et maladroit à utiliser sur les gros fichiers. – maayank

3

Ceci est relativement facile à réaliser en utilisant ctags. J'utilise Vim exclusivement pour l'édition XSD et en combinaison avec des ctags exubérants (http://ctags.sourceforge.net/) cela fonctionne très bien pour moi.

Parce que ctags exubérante ne prend pas en charge XSD hors de la boîte, vous devez générer une définition de langue personnalisée.

J'utilise le fichier ci-dessous comme .ctags dans mon projet XSD. Après l'exécution de la commande ctags dans la racine du projet, je peux utiliser la navigation par étiquette VIM standard (Ctrl-[ pour suivre et Ctrl-O pour revenir) pour passer aux définitions.

Pour obtenir vim pour ramasser les fichiers tags dans les répertoires parents que j'utilise l'extrait suivant dans mon .vimrc

set tags=./tags; 

Mettre cela en .ctags dans la racine de votre projet.

--langdef=XSD 
--langmap=XSD:+.xsd 
--langmap=XSD:+.wsdl 
--regex-XSD=/element name="([a-zA-Z0-9_]+:){0,1}([a-zA-Z0 -9_]+)"/\2/d,definition/ 
--regex-XSD=/Type [a-zA-Z0-9="]*[ ]{0,1}name="([a-z_]+:){0,1}([a-zA-Z0-9_]+)"/\2/d,definition/ 
--exclude=.git 
--recurse=yes