Aller aux balises XML correspondantes dans Vim

140

L' %opérateur Vim passe aux parenthèses correspondantes, à la fin du commentaire et à quelques autres choses. Cependant, il ne correspond pas aux balises XML (ou à toute autre balise, à ma connaissance).

Quelle est la meilleure façon de passer à la balise XML correspondante à l'aide de Vim?

Remarque: Ce que je veux vraiment faire, c'est dupliquer une section dans un fichier XML sans chercher manuellement la balise correspondante.

Nathan Fellman
la source
4
En abordant la question d'origine (précédant la note de clarification :) , la combinaison v + a + t semble vous déposer au bas de la sélection visuelle. L'autre aspect de cela semble être la commande "o" dans le mode visuel, qui vous amène à l'autre extrémité de votre sélection actuelle. C'est une astuce efficace non seulement dans les documents XML, mais aussi lors de l'édition de PHP / HTML (comme cela s'est produit pour moi).
Justin Bell

Réponses:

73

Il existe un plugin vim appelé matchit.vim. Vous pouvez le trouver ici: http://www.vim.org/scripts/script.php?script_id=39 . Il a été créé à peu près exactement dans le but que vous décrivez.

Installez-le, placez votre curseur sur le corps de la balise (pas le <>, sinon il correspondra à ceux-ci) et appuyez sur% pour passer à l'autre balise. Consultez la page du script pour savoir à quoi il correspond.

sykora
la source
4
Joli. A été assis sur mon disque dur tout le temps.
innaM
34
Il existe une version de matchit, qui est déjà livrée avec Vim. runtime macros/matchit.vimdevrait l'activer et permettre de %faire correspondre les balises XML.
Svend
1
mtchit.vim semble être activé par défaut dans NeoVim.
James
Il se peut que vous ayez déjà matchit, mais ce n'est pas activé par défaut. Ajoutez packadd! matchità .vimrcpour l'activer. Lire la suite:help matchit
ruuter
242

Vous pouvez le faire sans plugins supplémentaires:

  • placer le curseur sur l'étiquette
  • vat - sélectionnera la balise (extérieure) et placera le curseur à la fin
  • une fois que vous avez votre sélection, vous pouvez basculer entre le haut et le bas avec o( mise à jour basée sur la note de Michael Gruber )
  • c- changer ou, y- copier ou, échapper pour quitter le mode visuel ...

Une autre opération utile est: vit- sélectionnera le contenu de la balise (interne).

Mise à jour (grâce à @elrado) Exemple: vitovous permettra de sélectionner le contenu interne de la balise et de positionner le curseur au début du texte sélectionné.

Référence: /superuser/182355/how-can-i-select-an-html-tags-content-in-vim

Référence Vim (merci à @Geek pour l'avoir noté):

:help visual-operators

tu auras:

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
la source
1
Je veux accéder à une balise, pas "sélectionner" le contenu inclus. Et si je peux le faire avec 1 ou 2 touches, pourquoi dois-je faire 5 touches à chaque fois que je veux sélectionner une étiquette? (ce qui arrive BEAUCOUP de fois en fait)
kumarharsh
2
Bien qu'il existe un moyen intégré, bien que compliqué, de passer à la balise de fermeture. Le détour par le mode visuel est-il le seul moyen d'y arriver?
Mu Mind
2
Holy molly, tu apprends toujours de nouvelles choses avec Vim! Il y a tellement de choses à apprendre, cela m'a beaucoup aidé, merci!
gosukiwi
23
Juste à noter: une fois que vous avez votre sélection, vous pouvez basculer entre le haut et le bas avec 'o'
Michael Gruber
3
@Geek, «t» est pour «tag». Pour comprendre «a», vous devez d'abord comprendre «i». citchange la i nterior de l'étiquette - tout le contenu. catchanger un ll de l'étiquette - le contenu et un LSO l'étiquette elle - même, à la fois d' ouverture et de fermeture.
Edward
37

Le PO a déclaré que ce qu'il voulait vraiment faire était de copier une section de XML sans avoir à trouver la balise correspondante. Cela se fait facilement en mode normal avec yat<motion>p, qui extrait le texte à l'intérieur et y compris les balises correspondantes, puis le colle. yit<motion>pest presque le même, mais il n'inclut pas les balises externes.

Le "y" dans la chaîne est bien sûr la commande "yank" en mode normal. ( :help y)

aou ipeut être utilisé pour la sélection d'objets après un opérateur tel que you à l'intérieur d'une sélection visuelle. Le symbole après aou ispécifie ce qui doit être sélectionné. Le type d'objet tutilisé ici indique une balise SGML. ( :help object-select).

Bien sûr, cela <motion>signifie simplement se déplacer quelque part par le biais de votre choix et pmet le texte retiré à cet endroit.

Codie CodeMonkey
la source
isignifie «intérieur» (ou «intérieur»). asignifie "a"?
nilon
@nilon asignifie "tout".
Codie CodeMonkey
Le mnémonique que j'utilise est que asignifie autour . Cela a plus de sens pour moi.
Kit Johnson
5

Juste mon truc d'utiliser "yank", "object-select" (tag select) et "jump to last yanked text".

yit`] 

pour sauter à droite avant de fermer la balise

et

yit

pour sauter à droite après avoir ouvert la balise

Remarque: cela changera le contenu du registre par défaut

transang
la source