Vai ai tag XML corrispondenti in Vim


140

L' %operatore Vim passa alle parentesi corrispondenti, termina i commenti e poche altre cose. Tuttavia, non corrisponde ai tag XML (o qualsiasi altro tag, per quanto ne sappia).

Qual è il modo migliore per passare al tag XML corrispondente usando Vim?

Nota: quello che voglio davvero fare è duplicare una sezione in un file XML senza cercare manualmente il tag corrispondente.


4
Nell'affrontare la domanda originale (prima della Nota di chiarimento :) , la combinazione v + a + t sembra farti cadere in fondo alla selezione visiva. L'altro lato di questo sembra essere il comando "o" all'interno della modalità visiva, che ti porta all'estremità alternativa della selezione corrente. Questo è un trucco efficace non solo nei documenti XML, ma anche durante la modifica di PHP / HTML (come è successo a me stesso).
Justin Bell,

Risposte:


73

Esiste un plugin vim chiamato matchit.vim. Puoi trovarlo qui: http://www.vim.org/scripts/script.php?script_id=39 . È stato creato praticamente per lo scopo esatto che descrivi.

Installalo, posiziona il cursore sul corpo del tag (non <>, altrimenti corrisponderà a quelli) e premi% per passare all'altro tag. Vedi la pagina dello script per scoprire cos'altro corrisponde.


4
Ben fatto. È stato sempre seduto sul mio disco rigido.
innaM

34
Esiste una versione di matchit, che viene fornita con Vim già a proposito. runtime macros/matchit.vimdovrebbe abilitarlo e consentire la %corrispondenza dei tag XML.
Svend

1
mtchit.vim sembra essere abilitato di default in NeoVim.
James,

È possibile che tu abbia già matchit, ma non è abilitato per impostazione predefinita. Aggiungi packadd! matchita .vimrcper abilitarlo. Per saperne di più:help matchit
ruuter,

242

Puoi farlo senza plugin aggiuntivi:

  • posiziona il cursore sul tag
  • vat - seleziona il tag (esterno) e posiziona il cursore alla fine
  • una volta ottenuta la selezione, puoi alternare tra la parte superiore e quella inferiore o( aggiornamento basato sulla nota di Michael Gruber )
  • c- modifica o, y- copia o, esci per uscire dalla modalità visiva ...

Un'altra utile operazione è: vit- selezionerà il contenuto del tag (interno).

Aggiornamento (grazie a @elrado) Esempio: vitoti permetterà di selezionare il contenuto interno del tag e posizionare il cursore all'inizio del testo selezionato.

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

Riferimento Vim (grazie a @Geek per averlo notato):

:help visual-operators

otterrai:

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

1
Voglio passare a un tag, non "selezionare" il contenuto allegato. E se riesco a farlo con 1 o 2 tratti di tasto, perché dovrò fare 5 pressioni di tasto ogni volta che voglio selezionare un tag? (che succede
molte

2
Bello che ci sia un modo integrato, sebbene contorto, per saltare al tag di chiusura. Fare una deviazione attraverso la modalità visiva è l'unico modo per arrivarci?
Mu Mind,

2
Santo cielo, impari sempre cose nuove con Vim! C'è così tanto da imparare, questo mi ha aiutato molto, grazie!
gosukiwi

23
Solo per notare: una volta ottenuta la selezione è possibile alternare tra la parte superiore e inferiore con 'o'
Michael Gruber,

3
@Geek, 't' sta per 'tag'. Per capire "a" devi prima capire "i". citcambia l' ho nterior del tag - solo il contenuto. catcambiare un ll del tag - il contenuto e un LSO il tag stesso, sia in apertura che in chiusura.
Edward,

37

L'OP ha affermato che ciò che voleva davvero fare è copiare una sezione di XML senza dover trovare il tag corrispondente. Questo viene fatto facilmente in modalità normale con yat<motion>p, che strappa il testo all'interno e include i tag corrispondenti, quindi lo incolla. yit<motion>pè quasi lo stesso, ma non include i tag esterni.

La "y" nella stringa è ovviamente il comando "yank" in modalità normale. ( :help y)

ao ipuò essere utilizzato per la selezione di oggetti dopo un operatore come yo all'interno di una selezione visiva. Il simbolo dopo ao ispecifica cosa deve essere selezionato. Il tipo di oggetto tutilizzato qui indica un tag SGML. ( :help object-select).

Ovviamente <motion>significa solo spostarsi da qualche parte con il mezzo scelto e pmettere il testo strappato in quella posizione.


ista per "dentro" (o "interno"). asta per "a"?
nilon,

@nilon asignifica "tutto".
Codie CodeMonkey

L'uso che mnemonico è che asta per giro . Ha più senso per me.
Kit Johnson,

5

Solo il mio trucco per usare "yank", "object-select" (tag select) e "jump to last yanked text".

yit`] 

per saltare a destra prima di chiudere il tag

e

yit

per saltare a destra dopo aver aperto il tag

Nota: questo cambierà il contenuto del registro predefinito

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.