我现在正在编辑一些XML文件,它们具有某种结构,例如:
<Parent>
<Child name="Fred">
Some content
</Child>
<Child name="George" value="other content" />
...
</Parent>
Run Code Online (Sandbox Code Playgroud)
换句话说,某些父元素的内容将是子元素序列(在这种情况下具有相同的名称).例如,想一下目录中的待售物品清单,甚至是一系列<xsl:template>的<xsl:stylesheet>.
我想要做的是在vim中映射一些键序列,当我在父元素中时,转到下一个(或前一个)子元素,理想情况是能够在前面加上一个计数(这样我就可以"去"对于第五个下一个孩子,例如).理想情况下,我需要在Child元素的内容之外才有意义,所以在Child元素中我可以在同一个地图的孙子之间跳转.我在网上查找插件/解决方案,并没有找到任何东西.
我目前可以做的是vat<Esc>j在这个孩子关闭后下一个孩子在下一行的情况下(类似于vato<Esc>k前一个孩子).但是,我有一些问题:
:help v,v使用count 前缀不会执行我在此处所做的操作); 在映射中执行此操作(例如v2at)会连续选择"较高"的封闭元素.数字2并不是非常重要 - 我可以对我正在编辑的文件强制执行正确的格式化,并且可以使用xmllint轻松完成此操作.如果可能的话,我仍然希望采用更"语义"的方法来实现优雅和稳健.3号真的不是什么大不了的事,如果我可以留在原地,或者去第一个孩子,最后一个孩子,这将是一个很好的奖励.4号对我来说还没有问题.也许它会干扰插件,或者我将来的工作,但无论如何,当然不是关键.
然而,1号是关键的,因为我经常发现自己想要让这么多的孩子失望.目前,我正在寻找我想去的孩子,瞥一眼我那条线的相对数字,然后往下走(或向上).这是
另一种可能的解决方案是搜索Child然后去[count]n或[count]N.这也有一些问题:
Child自己键入名称,这完全不可编程; 或者我做的事情vato<Esc>l*不能以我想要的方式作为计数的前缀Child元素嵌套在彼此内部时(具有用例),Child在单独Parent元素之间拆分元素,当字符串"Child"出现在除Child元素之外的任何位置时中断.理想情况下,我会创建一些函数+命令+映射,以强大,智能的方式处理所有这些.然后,我可能只是盲目地用我的命令,而编辑,并没有头痛试图记录,通过元素之间跳跃等工作的宏观不过,我还是很新的vimscripting并不太清楚如何开始.
如果您经常需要此动作,那么为其创建自定义动作是有意义的。使用我的CountJump 插件,这非常简单:
call CountJump#Motion#MakeBracketMotion('<buffer>', '', '', '<Child', '<Child.*\zs/>\|</Child>', 0)
Run Code Online (Sandbox Code Playgroud)
这将修改[[ []等运动(您也可以选择其他映射),并且也支持计数。(将其放入例如~/.vim/ftplugin/xml_motions.vim。)
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |