Vim能像Notepad++一样突出显示匹配的HTML标签吗?

186

Vim支持匹配花括号、圆括号和方括号。这对于编辑类似PHP和JavaScript的C风格语言非常有用。但是HTML标签的匹配呢?

自从我开始使用Notepad++以来,它就具备了这个功能。能够找到HTML块的开头和结尾非常有用。我正在寻找像Vim一样的东西(请参见绿色div标记):

Example of matching HTML tags highlighting

一个奖励功能:突出显示未结束的HTML标记,例如上面截图中的红色标记。 matchit被提议为下一个最佳选择,但使用它的功能需要额外按键。我希望能够在不按额外按键的情况下看到HTML块的起始和结束位置。
我已经在互联网上搜索了类似于Vim的功能。根据two other StackOverflow问题和Nabblethread的说法,显然不只是我一个人有这个需求。
我差不多已经接受了Vim无法直观匹配HTML标签的事实。Vim可以做到吗?
补充说明:如果现有插件无法实现此目的,那么是否有任何Vimscript向导指导如何编写合适的插件?

19
虽然我不需要了解所有细节,但能够轻松地知道 HTML 标记何时结束可以让我理解正在处理的文件的结构。 我也要处理很多写得很糟糕的代码,所以有时我会遇到没有闭合标记的 html 标记,这总是需要修复的。 - linqq
5
@romainl 我经常读你的回答,非常欣赏你的观点。但这次我不得不表示不同意见。我可以认为这个功能并不是必要的,但我认为这是一个相当好的问题。在我的看法中,没有一个简单的方法来在 Vim 中实现这个功能,这让我感到很奇怪。 - lucapette
1
@lucapette,谢谢。我也喜欢这个问题。实际上,我从未使用过这样的功能,也从未感到需要它。但是一旦尝试过,可能就会发现无法离开。我喜欢我的工作流程和工作空间整洁、专注,没有“行政垃圾”,我认为这样的功能可能是多余的。这是插件的完美候选人。可以从matchit作为起点开始寻找灵感。 - romainl
你可以看一下matchparen插件(:help matchparen)。这个插件应该随Vim一起分发。它可以为括号等进行高亮显示。实现这个功能所使用的逻辑与匹配HTML标签所需的逻辑并没有太大不同。 - Greg Sexton
6
你看过这个答案吗?https://dev59.com/HUrSa4cB1Zd3GeqPa_wY#1960175 - Greg Sexton
显示剩余5条评论
3个回答

226

1
谢谢!这正是我正在寻找的功能。只有两个小问题,如果你愿意修复它们:
  1. 目前,只匹配相反的标签。是否可能也匹配光标所在的标签?
  2. 目前,如果一个HTML标签有属性,那些属性也会被选中。是否可能只选择标签名称,而不包括属性?
- linqq
1
根据要求,我已将这个ftplugin添加到GitHub。请查看我的更新答案获取链接。 - Greg Sexton
1
@GregSexton,你现在正式成为英雄了 ;) - lucapette
7
刚找到这个,看起来不错,但是请注意我必须在我的/.vimrc文件中添加"filetype plugin on"才能让它启动。如果你把插件放到了你的ftplugin文件夹里还是不能工作,那就把上述内容加到你的/.vimrc文件中,这样应该就可以了。 - Geoff
太棒了。我稍微修改了这个插件,通过将“<buffer> call …”改为“*.html call ...”,使其可以在多个缓冲区中工作。 - cbartondock
显示剩余9条评论

101

Greg的MatchTag.vim插件非常棒,但我想要更多。我想要包围标签始终被突出显示,而不仅仅是当光标在标签上时。

因此,我编写了MatchTagAlways,它做了所有Greg MatchTag能做的事情,还可以始终高亮显示包围标签,无论光标在代码中的位置如何。它也适用于未关闭的标签和HTML模板语言,例如Jinja或Handlebars。

下面是一个GIF演示:

MTA in action


5
不错的解决方案 - 我可能会使用原始版本,但我能看出这个有帮助。我希望更多的答案有GIF演示,那太棒了! - Jason
3
完全同意Jason的观点,为令人惊叹的GIF技巧点赞。 - Dan Bechard
1
你真是个传奇,我的生活因此变得更加美好了... <3 - Karl Glaser
1
这比悬赏答案好多了。 - MohitC
最后更新时间,它在Golang的*.gtpl文件中运行非常良好。 - Yusuf Ibrahim
显示剩余5条评论

-2

我来这里是为了在Vim中寻找匹配HTML样式的尖括号。这似乎有效:

:set mps+=<:>
:help matchpairs

8
这个方法并不是解决方案,它只是让“<”匹配“>”。 - Daniel YC Lin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接