2

我下载了 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 适用于除列表项之外的所有标签?如何解决此行为?

4

2 回答 2

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>'

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

于 2012-08-07T18:58:32.787 回答
2

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

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

于 2012-08-07T18:52:34.153 回答