2010-06-14 17 views
6

Utilizo VIM como mi editor de texto y edito una gran cantidad de archivos XML y WSDL.Travesía XSD en VIM

Los archivos WSDL tienen una sección XSD. ¿Hay algún complemento VIM que pueda usar para recorrer los tipos XSD? es decir, si tengo la siguiente línea y el símbolo de intercalación es donde '|' signo es:

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

y pulse Ctrl + Alt + Foo (o alguna otra combinación de magia) que me va a llegar a la definición de MagicFooType, es decir:

<xsd:complexType name="MagicFooType"> 

no pude encontrar la forma para usar ctags para este y todos los otros complementos que pude encontrar son para lenguajes imperativos (es decir, Java). ¿Hay algún plugin/script para hacer el trabajo?

+2

No cierre en forma de preguntas Vim/Emacs son material adecuado para el SO - http://meta.stackexchange.com/questions/25925/vim-questions-so-or-su.Además, la respuesta a esta pregunta requerirá la creación de scripts de Vim, ya que no existe una forma predeterminada de hacer lo que el OP está solicitando. – jamessan

Respuesta

2

He estado viendo este hilo por un tiempo y me lo pregunto ya que soy un usuario de VIM y trabajo con muchos archivos XML muy grandes y XSD asociados, XSLT y XQuery, todos los cuales podrían beneficiarse de este tipo de la cosa, como estoy seguro de que te puedes imaginar.

Después de algunas investigaciones esto se puede hacer con ctags, pero no hay nada por el momento que cree el archivo ctags para él. Esencialmente un CTAG se ve así:

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

Debido a que el tagaddress es un comando de modo ex puede llevar a cualquier lugar en un archivo en particular a derecha aterrizar en la definición.

Básicamente todo lo que tendríamos que hacer es crear un script que se ejecute a través del WSDL (o XSD, o lo que sea) y, conociendo la ubicación de la etiqueta y el archivo, cree las líneas apropiadas en un archivo ctags para mapear todo de las definiciones. Suena como un pequeño proyecto divertido y útil.

Disculpe que esta no es exactamente una respuesta completa, pero es posible hacerlo con ctags y le dará la solidez que busca.

+0

Lamentablemente, parece la forma más práctica. Bueno, quién sabe, tal vez este verano entre otros dos proyectos :) Si voy a hacer esto en un mes, ¿te gustaría colaborar? – maayank

+0

Estaría encantado de sí. De hecho, ya he discutido esto con algunos de mis compañeros de trabajo y todos pensamos que sería una buena idea. No dude en ponerse en contacto conmigo sin conexión y podremos discutir ideas de colaboración. –

+0

No puedo ver su dirección de correo electrónico y no puedo encontrar ningún otro método de comunicación personal en SO, así que envíeme un correo electrónico a [email protected] (o déjelo aquí, lo que más le convenga :) – maayank

2

gd ("ir a declaración") no tiene conocimiento del formato XML pero podría hacer el trabajo en este caso, suponiendo que la sección XSD está en la parte superior del WSDL.

+0

Gracias, un poco mejor que buscar manualmente el nombre del tipo, pero como dijiste, no tiene conocimiento de xml/xsd y es incómodo de usar en archivos grandes. – maayank

3

Esto es relativamente fácil de lograr usando ctags. Utilizo Vim exclusivamente para edición XSD y en combinación con ctags exuberantes (http://ctags.sourceforge.net/) esto funciona muy bien para mí.

Dado que las ctags exuberantes no son compatibles con XSD, debe generar una definición de idioma personalizada.

Utilizo el siguiente archivo como .ctags en mi proyecto XSD. Después de ejecutar el comando ctags en la raíz del proyecto, puedo usar navegación estándar con etiqueta VIM (Ctrl-[ para seguir y Ctrl-O para volver) para saltar a las definiciones.

Para obtener vim para recoger archivos de etiquetas en los directorios padre que utilizo el siguiente fragmento en mi .vimrc

set tags=./tags; 

Pon esto en .ctags en la raíz del proyecto.

--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