Matchit跳到HTML中的下一个列表项而不是结束标记

时间:2012-08-07 17:45:49

标签: vim tabs

我下载了Matchit插件并在我的HTML文件中使用它。一切都按原样运作,直到我在我的名单上使用它。

<ol>
    <li id="link-1"><a href="http://www.reddit.com/">reddit</a></li>
    <li id="link-2"><a href="http://www.vim.org/">vim</a></li>
    <li id="link-3"><a href="http://www.w3schools.com/">w3schools</a></li>
</ol>

如果光标在第一个o上,当我按Tab键时,光标会跳转到第一个列表项而不是结束ol。当我在第一个列表项的l上时,光标会跳转到下一个列表项标记的l。但是,如果我将光标移动到链接标签的第一个a并点击标签,那么Matchit工作正常并跳转到结束标签。 Matchit适用于所有标签,但列出项目?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

对于初学者,matchit与Vim一起分发而不被激活。您无需下载,只需按照:help matchit-install

中的说明操作即可

Matchit使用名为b:match_words的缓冲区变量来定义匹配标记对:打开HTML文件并键入echo b:match_words。这里的值是:

<:>,<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>

如果我正确理解:help matchit这些模式,那么<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>部分就是“问题”所在。请注意,定义列表的行为是相同的:不是跳转到结束标记,而是matchit跳转到中间标记。

我猜想在HTML ftplugin中粘贴它并进行一些自定义可以解决问题。

修改

这条线似乎完全解决了这个问题:

autocmd FileType html let b:match_words='<:>,<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'

我刚刚删除了<ul|ol><dl>的两个完全不必要的模式定义,只留下了基本匹配。

答案 1 :(得分:2)

尝试使用g%。 Matchit有不良行为:它不是跳到结束标记,而是在相关匹配列表上进行迭代。我不知道它是否为HTML编码,但在编辑vimscript时,它将迭代for - &gt; continue/break - &gt; endforg%使matchit以相反的方向迭代,因此,如果您在第一个项目上,它将带​​您到最后一个(for - &gt; endfor在我的示例中。

顺便说一句,几年前matchit被包含在vim发行版中。你不需要下载它,我甚至不能说它是在任何地方更新,而是在vim发行版中。