¿Puede VIM resaltar etiquetas HTML coincidentes como Notepad ++?

181

VIM tiene soporte para emparejar pares de llaves, paréntesis y corchetes. Esto es genial para editar lenguajes de estilo C como PHP y Javascript. ¿Pero qué pasa con las etiquetas HTML coincidentes?

Notepad ++ ha tenido esta característica durante el tiempo que la he estado usando. Poder detectar dónde comienzan y terminan los bloques de HTML es muy útil. Lo que estoy buscando es algo como esto para vim (ver las etiquetas div verdes):

(una característica adicional: resaltar etiquetas HTML no cerradas, como la etiqueta roja en esta captura de pantalla).

matchit se ha propuesto como el siguiente mejor producto, pero requiere una pulsación de tecla adicional para usar su funcionalidad. Me gustaría poder ver dónde comienzan y terminan los bloques de HTML sin presionar una tecla adicional.

He rastreado internet para encontrar algo así para vim. Al parecer, no soy el único, de acuerdo con otros 2 StackOverflow preguntas y nabble .

Casi me he resignado a que vim no pueda hacer coincidir visualmente las etiquetas html. ¿Es posible que vim haga esto?

Anexo: Si actualmente no es posible hacer esto con los complementos existentes, ¿algún asistente de vimscript tiene punteros sobre cómo abordar la escritura de un complemento adecuado?

linqq
fuente
¿Podría explicar de qué manera esta característica "es muy útil"? Realmente no necesito saber todo sobre todo en todo momento. Cuando necesito saber algo, Vim está diseñado para que sea muy fácil saberlo con muy pocas teclas.
romainl
17
Si bien no necesito saberlo todo, poder saber fácilmente cuándo termina una etiqueta HTML me permite asimilar la estructura del archivo con el que estoy trabajando. También trato con un montón de código mal escrito, por lo que a veces me encuentro con una etiqueta html sin etiqueta de cierre, que siempre debe repararse.
linqq
55
@romainl Leo tu respuesta muy a menudo y realmente me gusta tu punto de vista. Pero esta vez tengo que estar en desacuerdo. Puedo considerar que esta característica no es esencial, pero creo que esta es una buena pregunta. Me parece extraño que no haya una manera fácil de hacerlo con Vim.
lucapette
1
@lucapette, gracias. También me gusta la pregunta, en realidad. Nunca he usado tal característica y nunca he sentido la necesidad de hacerlo. Pero es probablemente una de esas cosas sin las que no puedes vivir una vez que lo intentas. Me gusta que mi flujo de trabajo y espacio de trabajo estén limpios y enfocados, libres de "desechos administrativos" y creo que tal característica podría ser superflua. El candidato perfecto para un complemento. Uno puede intentar inspirarse en Matchit como punto de partida, probablemente.
romainl
66
¿Has visto esta respuesta? stackoverflow.com/questions/1957083/…
Greg Sexton

Respuestas:

219

Tuve que trabajar con algo de HTML hoy, así que pensé en abordar esto. Se agregó un ftplugin a vim.org que debería resolver su problema.

Puede obtenerlo aquí en vim.org .

Puedes conseguirlo aquí en github .

Espero que funcione para ti. Hasme saber si tienes algunos problemas.

Greg Sexton
fuente
1
¡Gracias! Esa es exactamente la funcionalidad que estoy buscando. Solo dos objeciones menores, si tiene ganas de arreglarlas: 1. Actualmente, solo se corresponde con la etiqueta opuesta. ¿Sería posible hacer coincidir también la etiqueta en la que está el cursor? 2. Actualmente, si una etiqueta html tiene atributos, estos también se seleccionan. ¿Es posible seleccionar solo el nombre de la etiqueta, sin atributos?
linqq
Buenas sugerencias Ambos deben ser atendidos en v1.2 en vim.org. La expresión regular correspondiente es más complicada ahora, así que avíseme si encuentra algún error.
Greg Sexton
1
Según lo solicitado, agregué este ftplugin a github. Vea mi respuesta actualizada para el enlace.
Greg Sexton
1
@ GregSexton eres oficialmente un héroe ahora;)
lucapette
77
Acabo de encontrar esto, se ve bien, pero tenga en cuenta que tuve que agregar "filetype plugin on" a mi ~ / .vimrc para que se encienda. Si no funciona después de colocar el complemento en su carpeta ftplugin, agregue lo anterior a su ~ / .vimrc y debería estar listo.
Geoff
95

El complemento MatchTag.vim de Greg es increíble, pero quería algo más. Quería que las etiquetas adjuntas siempre estuvieran resaltadas, no solo cuando el cursor está en una de las etiquetas.

Así que escribí MatchTagAlways, que hace todo lo que hace MatchTag de Greg y también siempre resalta la etiqueta adjunta, sin importar dónde esté el cursor en el código. También funciona con etiquetas no cerradas y lenguajes de plantillas HTML como Jinja o Handlebars.

Aquí hay un GIF que lo muestra en acción:

MTA en acción

Valloric
fuente
44
Solución genial: probablemente usaría la versión original, pero puedo ver cómo esto es útil. Desearía que más respuestas tuvieran demostraciones GIF, ¡eso es increíble!
Jason
3
Totalmente de acuerdo con Jason, +1 por increíbles hacks GIF.
Dan Bechard
Esto funciona mejor que la respuesta aceptada. Pero todavía no estoy seguro de cómo verificar las etiquetas que superan la altura vertical de la pantalla. No puedo mover la pantalla más allá del cursor en vim y una pantalla dividida no muestra las etiquetas activas en ambas ventanas.
radix07
1
Leyenda absoluta, mi vida ha mejorado mucho con esto ... <3
Karl Glaser
1
Esto es mucho mejor que una respuesta
generosa
-2

Vine aquí buscando corchetes angulares de estilo html a juego en Vim. Esto parece funcionar:

:set mps+=<:>
:help matchpairs
Chris X
fuente
77
Este método no es la solución, solo deja que '<' coincida con '>'
Daniel YC Lin