Salte a las etiquetas XML coincidentes en Vim

140

El %operador de Vim salta a paréntesis, termina comentarios y algunas otras cosas. Sin embargo, no coincide con las etiquetas XML (o cualquier otra etiqueta, que yo sepa).

¿Cuál es la mejor manera de saltar a la etiqueta XML correspondiente usando Vim?

Nota: Lo que realmente quiero hacer es duplicar una sección en un archivo XML sin buscar manualmente la etiqueta correspondiente.

Nathan Fellman
fuente
44
Al abordar la pregunta original (que precede a la Nota aclaratoria :) , la combinación v + a + t parece llevarlo al final de la selección visual. El otro lado de esto parece ser el comando "o" dentro del modo visual, que lo lleva al final alternativo de su selección actual. Este es un truco efectivo no solo en documentos XML, sino también al editar PHP / HTML (como sucedió para mí).
Justin Bell el

Respuestas:

73

Hay un complemento vim llamado matchit.vim. Puede encontrarlo aquí: http://www.vim.org/scripts/script.php?script_id=39 . Fue creado más o menos el propósito exacto que usted describe.

Instale eso, coloque el cursor en el cuerpo de la etiqueta (no el <>, de lo contrario coincidirá con esos) y presione% para saltar a la otra etiqueta. Vea la página del script para averiguar qué más coincide.

sykora
fuente
44
Buena esa. Ha estado sentado en mi disco duro todo el tiempo.
innaM
34
Hay alguna versión de matchit, que se envía con Vim ya por cierto. runtime macros/matchit.vimdebería habilitarlo y permitir %que coincidan las etiquetas XML.
Svend
1
mtchit.vim parece estar habilitado de forma predeterminada en NeoVim.
James
Es posible que ya tenga matchit, pero no está habilitado de forma predeterminada. Agregar packadd! matchita .vimrcpara habilitarlo. Leer más:help matchit
ruuter
242

Puede hacer esto sin complementos adicionales:

  • colocar el cursor en la etiqueta
  • vat - seleccionará la etiqueta (externa) y colocará el cursor al final
  • una vez que tenga su selección, puede alternar entre la parte superior e inferior con o( actualización basada en la nota de Michael Gruber )
  • c- cambiar o, y- copiar o escapar para salir del modo visual ...

Otra operación útil es: vit- seleccionará el contenido de la etiqueta (interior).

Actualización (gracias a @elrado) Ejemplo: vitole permitirá seleccionar el contenido interno de la etiqueta y posicionar el cursor al comienzo del texto seleccionado.

Referencia: /superuser/182355/how-can-i-select-an-html-tags-content-in-vim

Referencia de Vim (gracias a @Geek por señalar esto):

:help visual-operators

obtendrás:

4. Operating on the Visual area             *visual-operators*

The objects that can be used are:
    ...
    at  a <tag> </tag> block (with tags)        |v_at|
    it  inner <tag> </tag> block            |v_it|
    ...
Robert Lujo
fuente
1
Quiero saltar a una etiqueta, no "seleccionar" el contenido adjunto. Y si puedo hacerlo con 1 o 2 pulsaciones de teclas, ¿por qué haré 5 pulsaciones de teclas cada vez que quiera seleccionar una etiqueta? (lo que ocurre muchas veces en realidad)
kumarharsh
2
Es bueno que haya una forma integrada, aunque complicada, de saltar a la etiqueta de cierre. ¿Tomar un desvío a través del modo visual es la única forma de llegar allí?
Mu Mind
2
Santa Molly, ¡siempre aprendes cosas nuevas con Vim! Hay mucho que aprender, esto me ayudó mucho, ¡gracias!
gosukiwi
23
Solo para tener en cuenta: una vez que tenga su selección, puede alternar entre la parte superior e inferior con 'o'
Michael Gruber
3
@ Geek, 't' es para 'etiqueta'. Para entender 'a' primero debes entender 'i'. citcambia el i nterior de la etiqueta - sólo el contenido. catcambiar un ll de la etiqueta - el contenido y un lso la propia etiqueta, tanto en apertura y cierre.
Edward
37

El OP declaró que lo que realmente quería hacer era copiar una sección de XML sin tener que encontrar la etiqueta correspondiente. Esto se hace fácilmente en modo normal con yat<motion>p, que tira del texto dentro e incluye las etiquetas coincidentes, luego lo pega. yit<motion>pes casi lo mismo, pero no incluye las etiquetas externas.

La 'y' en la cadena es, por supuesto, el comando "yank" en modo normal. ( :help y)

ao ipuede usarse para la selección de objetos después de un operador como yo dentro de una selección visual. El símbolo después ao iespecifica lo que debe seleccionarse. El tipo de objeto tutilizado aquí indica una etiqueta SGML. ( :help object-select)

Por supuesto, <motion>solo significa moverse a algún lugar por el medio que elija y pcoloca el texto extraído en esa ubicación.

Codie CodeMonkey
fuente
isignifica "dentro" (o "interior"). asignifica "a"?
nilon
@nilon asignifica "todos".
Codie CodeMonkey
La nemotécnica que uso es la que asignifica alrededor . Tiene más sentido para mí.
Kit Johnson el
5

Solo mi truco de usar "tirar", "seleccionar objeto" (seleccionar etiqueta) y "saltar al último texto".

yit`] 

saltar a la derecha antes de cerrar la etiqueta

y

yit

saltar a la derecha después de abrir la etiqueta

Nota: esto cambiará el contenido del registro predeterminado

transang
fuente