Vim peut-il mettre en évidence les balises HTML correspondantes comme Notepad ++?

181

VIM prend en charge les paires de parenthèses, de parenthèses et de crochets correspondants. C'est idéal pour éditer des langages de style C comme PHP et Javascript. Mais qu'en est-il des balises HTML correspondantes?

Notepad ++ a cette fonctionnalité depuis aussi longtemps que je l'utilise. Être capable de repérer où les blocs de HTML commencent et se terminent est très utile. Ce que je recherche, c'est quelque chose comme ça pour vim (voir les balises div vertes):

(un bonus: mettre en évidence les balises HTML non fermées, comme la balise rouge dans cette capture d'écran).

matchit a été proposé comme la prochaine meilleure chose, mais il nécessite une frappe supplémentaire pour utiliser ses fonctionnalités. Je voudrais pouvoir voir où les blocs de HTML commencent et se terminent sans une pression de touche supplémentaire.

J'ai parcouru Internet pour trouver quelque chose comme ça pour vim. Apparemment, je ne suis pas le seul, selon 2 autres StackOverflow des questions et Nabble .

Je me suis presque résigné à ne pas pouvoir faire correspondre visuellement les balises html à vim. Est-il possible pour vim de faire cela?

Addendum: S'il n'est actuellement pas possible de le faire avec des plugins existants, est-ce qu'un assistant vimscript a des pointeurs sur la façon d'aborder l'écriture d'un plugin approprié?

linqq
la source
Pourriez-vous expliquer en quoi cette fonctionnalité "est très utile"? Je n'ai pas vraiment besoin de tout savoir sur tout à chaque instant. Quand j'ai besoin de savoir quelque chose, Vim est conçu pour le rendre très facile à savoir en très peu de frappes.
romainl
17
Bien que je n'ai pas besoin de tout savoir, être capable de savoir facilement quand une balise HTML se termine me permet de comprendre la structure du fichier avec lequel je travaille. Je traite également beaucoup de code mal écrit, donc parfois je rencontre une balise html sans balise de fermeture, qui doit toujours être corrigée.
linqq
5
@romainl J'ai lu votre réponse très souvent et j'aime beaucoup votre point de vue. Mais cette fois, je ne suis pas d'accord. Je peux considérer que cette fonctionnalité n'est pas essentielle mais je trouve que c'est une très bonne question. Cela me semble étrange qu'il n'y ait pas de moyen facile de l'obtenir avec Vim.
lucapette du
1
@lucapette, merci. J'aime aussi la question, en fait. Je n'ai jamais utilisé une telle fonctionnalité et je n'en ai jamais ressenti le besoin. Mais c'est probablement l'une de ces choses dont vous ne pouvez pas vivre une fois que vous avez essayé. J'aime mon flux de travail et mon espace de travail propres et concentrés, exempts de "débris administratifs" et je pense qu'une telle fonctionnalité pourrait être superflue. Le candidat parfait pour un plugin. On peut essayer de s'inspirer de matchit comme point de départ, probablement.
romainl
6
Avez-vous vu cette réponse? stackoverflow.com/questions/1957083/…
Greg Sexton

Réponses:

219

Je devais travailler avec du HTML aujourd'hui, alors j'ai pensé que je m'attaquerais à cela. Ajout d'un ftplugin à vim.org qui devrait résoudre votre problème.

Vous pouvez l'obtenir ici sur vim.org .

Vous pouvez l'obtenir ici sur github .

J'espère que ça marche pour toi. Dites moi si vous avez le moindre problème.

Greg Sexton
la source
1
Je vous remercie! C'est exactement la fonctionnalité que je recherche. Seulement deux petits soucis, si vous avez envie de les corriger: 1. Actuellement, seule la balise opposée correspond. Serait-il possible de faire correspondre également la balise sur laquelle se trouve le curseur? 2. Actuellement, si une balise html a des attributs, ceux-ci sont également sélectionnés. Est-il possible de sélectionner uniquement le nom de la balise, sans attributs?
linqq
Bonnes suggestions. Ils devraient tous deux être pris en charge dans la v1.2 sur vim.org. Le regex correspondant est plus compliqué maintenant, alors faites-moi savoir si vous trouvez des bogues.
Greg Sexton
1
Comme demandé, j'ai ajouté ce ftplugin à github. Voir ma réponse mise à jour pour le lien.
Greg Sexton
1
@GregSexton vous êtes officiellement un héros maintenant;)
lucapette
7
Je viens de trouver ça, ça a l'air bien, mais notez que j'ai dû ajouter "plugin filetype on" à mon ~ / .vimrc pour qu'il s'allume. Si cela ne fonctionne pas après avoir placé le plugin dans votre dossier ftplugin, ajoutez ce qui précède à votre ~ / .vimrc et vous devriez être prêt.
Geoff
95

Le plugin MatchTag.vim de Greg est génial, mais je voulais quelque chose de plus. Je voulais que les balises englobantes soient toujours mises en évidence, pas seulement lorsque le curseur se trouve sur l'une des balises.

J'ai donc écrit MatchTagAlways qui fait tout ce que fait MatchTag de Greg et met toujours en évidence la balise englobante, peu importe où se trouve le curseur dans le code. Il fonctionne également avec des balises non fermées et des langages de création de modèles HTML tels que Jinja ou Handlebars.

Voici un GIF le montrant en action:

MTA en action

Valloric
la source
4
Solution cool - j'utiliserais probablement la version originale, mais je peux voir à quel point cela est utile. J'aurais aimé que plus de réponses aient des démos GIF, c'est génial!
Jason le
3
Tout à fait d'accord avec Jason, +1 pour des hacks GIF incroyables.
Dan Bechard
Cela fonctionne mieux que la réponse acceptée. Mais je ne sais toujours pas comment vérifier les balises qui dépassent la hauteur verticale de l'écran. Je ne peux pas déplacer l'écran au-delà du curseur dans vim et un écran partagé n'affiche pas les balises actives dans les deux fenêtres.
radix07
1
Légende absolue, ma vie est devenue tellement meilleure grâce à cela ... <3
Karl Glaser
1
C'est beaucoup mieux que la réponse à la prime
MohitC
-2

Je suis venu ici à la recherche de crochets angulaires de style HTML correspondants dans Vim. Cela semble fonctionner:

:set mps+=<:>
:help matchpairs
Chris X
la source
7
Cette méthode n'est pas la solution, il suffit de laisser '<' correspondre à '>'
Daniel YC Lin