在Vim中跳转到匹配的XML标签

146

Vim % 操作符可以跳转到匹配的括号、注释结尾和其他一些东西。然而,据我所知,它并不匹配 XML 标记(或任何其他标记)。

在 Vim 中,如何最好地跳转到匹配的 XML 标记?

注意: 我真正想做的是在 XML 文件中复制某个部分,而不是手动查找匹配的标记。


4
在回答之前的问题(在澄清的 注意事项 之前), v+a+t组合 似乎会使您跳转到视觉选区的底部。这个技巧的另一面似乎是视觉模式中的 "o" 命令,它会带您到当前选择的另一端。这不仅在 XML 文档中是有效的技巧,同样在编辑 PHP/HTML(正如我自己的情况)时也适用。 - Justin Bell
相关问题:如何在Vim中跳转到匹配的HTML/XML标签?(来自Vim SE) - kenorb
4个回答

258
你可以不用额外的插件实现这个操作:
1. 将光标放在标签上 2. vat - 会选择(外部)标签并将光标置于末尾 3. 一旦你选择好了,你可以使用o在顶部和底部之间切换 4. c - 修改或者y - 复制或者按Esc退出可视模式...
另一个有用的操作是:vit - 会选择标签内容(内部)。
更新(感谢@elrado)示例:vito将使您能够选择标记的内部内容,并将光标定位到所选文本的开头。
参考:https://superuser.com/questions/182355/how-can-i-select-an-html-tags-content-in-vim Vim参考(感谢@Geek指出):
:help visual-operators

你将获得:

4. Operating on the Visual area             *visual-operators*

The objects that can be used are:
    ...
    at  a <tag> </tag> block (with tags)        |v_at|
    it  inner <tag> </tag> block            |v_it|
    ...

2
很好,有一种内置的方式(虽然有点复杂),可以跳转到闭合标签。是通过可视化模式绕路才能到达那里吗? - Mu Mind
2
哇塞,使用Vim总是能学到新东西!有很多要学的,这对我帮助很大,谢谢! - gosukiwi
25
请注意:一旦您选择了内容,您可以使用“o”在顶部和底部之间切换。 - Michael Gruber
1
@Robert,第二个要点中的组合a+t代表什么意思?就像c代表复制y代表粘贴一样。当你理解特定组合的含义时,记忆起来会更容易。 - Geek
3
@Geek,“t”代表“标记”。要理解“a”,您必须先了解“i”。cit更改标记内部 - 仅更改内容。 cat更改整个标记 - 包括内容和标记本身,即开头和结尾。 - Edward
显示剩余9条评论

75

有一个叫做matchit.vim的vim插件。你可以在这里找到它:http://www.vim.org/scripts/script.php?script_id=39。它的创建目的与你描述的几乎完全相同。

安装这个插件后,把光标放在标签的内容上(而不是<>,否则会匹配这些字符),按%键即可跳转到另一个标签。请查看脚本页面以了解它还可以匹配哪些内容。


4
不错。一直都在我的硬盘里呢。 - innaM
38
Vim自带了一些版本的matchit。通过运行runtime macros/matchit.vim可以启用它,并且允许%匹配XML标签。 - Svend
1
在NeoVim中,mtchit.vim似乎是默认启用的。 - James
1
也许你已经安装了matchit,但它不是默认启用的。将packadd! matchit添加到.vimrc中以启用它。更多信息请阅读:help matchit - ruuter
1
matchit在大型HTML源代码中失败了。 https://github.com/andymass/vim-matchup在该源代码中成功。 - 2.7182818

37
该用户表示他真正想做的是复制XML的一部分,而不必找到匹配的标记。在普通模式下,可以通过使用yat<motion>p轻松完成此操作,它会复制包括匹配标记在内的文本,然后粘贴它。yit<motion>p几乎相同,但不包括外部标记。
字符串中的“y”当然是普通模式下的“复制”命令。(:help y
在运算符(例如y)之后或在可视选择内部,可以使用ai进行对象选择。 ai后面的符号指定应选择什么。此处使用的对象类型t表示SGML标记。(:help object-select)。
当然,<motion>只是意味着通过您选择的方式移动到某个位置,p将复制的文本放置在那个位置。

i代表“内部”(或“内部的”)。a代表“一个”? - nilon
@nilon中的a代表“全部”。 - Codie CodeMonkey
1
我使用的助记符是 a 代表 around。这对我来说更有意义。 - Kit Johnson

6

这是我使用“yank”、“对象选择”(标记选择)和“跳转到最后复制的文本”的技巧。

yit`] 

跳转到关闭标签前

yit

跳转到标签后

注意:这将更改默认寄存器的内容。


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