O vim pode destacar tags HTML correspondentes como o Notepad ++?

181

O VIM oferece suporte para pares correspondentes de colchetes, parênteses e colchetes. Isso é ótimo para editar linguagens no estilo C, como PHP e Javascript. Mas e as tags HTML correspondentes?

O Notepad ++ possui esse recurso há tanto tempo que eu o uso. Ser capaz de identificar onde os blocos de HTML começam e terminam é muito útil. O que estou procurando é algo parecido com isto para o vim (veja as tags div verdes):

(um recurso de bônus: destacar tags HTML não fechadas, como a etiqueta vermelha nesta captura de tela).

O matchit foi proposto como a melhor opção, mas requer um pressionamento de tecla extra para usar sua funcionalidade. Eu gostaria de ver onde os blocos de HTML começam e terminam sem pressionar mais as teclas.

Eu vasculhei a internet para encontrar algo parecido com isto para o vim. Aparentemente, eu não sou o único, de acordo com 2 outros StackOverflow perguntas e Nabble .

Eu quase me demiti do vim por não conseguir corresponder visualmente as tags html. É possível que o vim faça isso?

Adendo: Se atualmente não for possível fazer isso com nenhum plug-in existente, algum assistente de vimscript por aí tem alguma dica sobre como abordar a criação de um plug-in adequado?

linqq
fonte
Você poderia explicar de que maneira esse recurso "é muito útil"? Eu realmente não preciso saber tudo sobre tudo a todo momento. Quando eu preciso saber algo Vim é projetado para torná-lo muito fácil saber em poucas teclas.
romainl
17
Embora eu não precise saber tudo, ser capaz de saber facilmente quando uma tag HTML termina me permite agregar a estrutura do arquivo com o qual estou trabalhando. Eu também lido com muitos códigos mal escritos, então às vezes encontro uma tag html sem tag de fechamento, que sempre precisa ser corrigida.
Linqq 17/11/11
5
@romainl Eu leio sua resposta com muita frequência e gosto muito do seu ponto de vista. Mas desta vez eu tenho que discordar. Posso considerar esse recurso não essencial, mas acho que essa é uma pergunta bastante interessante. Parece estranho para mim que não há uma maneira fácil de obtê-lo com o Vim.
Lucapette
1
@ lucapette, obrigado. Também gosto da pergunta, na verdade. Eu nunca usei esse recurso e nunca senti a necessidade dele. Mas é provavelmente uma daquelas coisas que você não pode viver sem depois de tentar. Gosto do meu fluxo de trabalho e espaço de trabalho limpo e focado, livre de "detritos administrativos" e acho que esse recurso pode ser supérfluo. O candidato perfeito para um plugin. Pode-se tentar se inspirar no matchit como ponto de partida, provavelmente.
Romainl
6
Você já viu esta resposta? stackoverflow.com/questions/1957083/…
Greg Sexton

Respostas:

219

Hoje tive que trabalhar com um pouco de HTML, então pensei em resolver isso. Adicionado um ftplugin no vim.org que deve resolver seu problema.

Você pode obtê-lo aqui no vim.org .

Você pode obtê-lo aqui no github .

Espero que funcione para você. Deixe-me saber se você tiver algum problema.

Greg Sexton
fonte
1
Obrigado! Essa é exatamente a funcionalidade que estou procurando. Apenas duas pequenas quibbles, se você desejar corrigi-las: 1. Atualmente, apenas a tag oposta é correspondida. Seria possível também corresponder à marca em que o cursor está? 2. Atualmente, se uma tag html tiver atributos, eles também serão selecionados. É possível apenas selecionar o nome da tag, sem atributos?
Linqq 21/11
Boas sugestões. Ambos devem ser tratados na v1.2 em vim.org. O regex correspondente agora é mais complicado, então, deixe-me saber se você encontrar algum erro.
Greg Sexton
1
Conforme solicitado, adicionei este plug-in ao github. Veja minha resposta atualizada para o link.
Greg Sexton
1
@GregSexton você é oficialmente um herói agora;)
lucapette
7
Acabei de encontrar isso, parece bom, mas observe que eu tive que adicionar "plugin de tipo de arquivo" no meu ~ / .vimrc para ativá-lo. Se não estiver funcionando depois de colocar o plug-in na pasta ftplugin, adicione o item acima ao seu ~ / .vimrc e você deverá estar pronto.
Geoff
95

O plug-in MatchTag.vim de Greg é incrível, mas eu queria algo mais. Eu queria que as tags anexas fossem sempre destacadas, não apenas quando o cursor estiver em uma das tags.

Então, eu escrevi o MatchTagAlways, que faz tudo o que o MatchTag de Greg faz e também destaca sempre a marca anexa, não importa onde o cursor esteja no código. Também funciona com tags não fechadas e linguagens de modelagem HTML, como Jinja ou Handlebars.

Aqui está um GIF mostrando em ação:

MTA em ação

Valloric
fonte
4
Solução legal - eu provavelmente usaria a versão original, mas posso ver como isso é útil. Eu gostaria que mais respostas tivessem demos GIF, isso é incrível!
21413 Jason
3
Concordo totalmente com Jason, +1 em hacks GIF incríveis.
precisa
Isso funciona melhor que a resposta aceita. Mas ainda não sei como verificar as tags além da altura vertical da tela. Não consigo mover a tela além do cursor no vim e uma tela dividida não mostra as tags ativas nas duas janelas.
Radix07 17/07/2014
1
Você lenda absoluta, minha vida tornou-se muito melhor a partir deste ... <3
Karl Glaser
1
Isto é muito melhor do que resposta de recompensas
MohitC
-2

Eu vim aqui procurando por colchetes angulares de estilo html no Vim. Isso parece funcionar:

:set mps+=<:>
:help matchpairs
Chris X
fonte
7
Este método não é a solução, basta deixar '<' corresponder a '>' #
Daniel YC Lin