小编Dan*_*208的帖子

如何使用Vim跳转到XML元素的下一个兄弟?

我现在正在编辑一些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前一个孩子).但是,我有一些问题:

  1. 我不能用计数作为前缀; 在映射之前执行此操作会导致奇怪的行为(请参阅:help v,v使用count 前缀不会执行我在此处所做的操作); 在映射中执行此操作(例如v2at)会连续选择"较高"的封闭元素.
  2. 如果子元素的序列不直接跟随,每个开始标记跟在前一个结束标记的下一行之后,则这将不起作用.
  3. 如果我在父母的最后一个Child上执行此操作,我将转到父项的结束标记(或者它的一些文本内容,如果它存在,或者其他)
  4. Clobbers以前选择的地区

数字2并不是非常重要 - 我可以对我正在编辑的文件强制执行正确的格式化,并且可以使用xmllint轻松完成此操作.如果可能的话,我仍然希望采用更"语义"的方法来实现优雅和稳健.3号真的不是什么大不了的事,如果我可以留在原地,或者去第一个孩子,最后一个孩子,这将是一个很好的奖励.4号对我来说还没有问题.也许它会干扰插件,或者我将来的工作,但无论如何,当然不是关键.

然而,1号是关键的,因为我经常发现自己想要让这么多的孩子失望.目前,我正在寻找我想去的孩子,瞥一眼我那条线的相对数字,然后往下走(或向上).这是

  • 令人讨厌,而且我对XML内容的思考方式并不明显
  • 不容易编写脚本/宏,但至少不够健壮

另一种可能的解决方案是搜索Child然后去[count]n[count]N.这也有一些问题:

  1. 要么我必须考虑并Child自己键入名称,这完全不可编程; 或者我做的事情vato<Esc>l*不能以我想要的方式作为计数的前缀
  2. Child元素嵌套在彼此内部时(具有用例),Child在单独Parent元素之间拆分元素,当字符串"Child"出现在除Child元素之外的任何位置时中断.
  3. Clobbers以前的搜索; 这是一个讨厌当我用搜索来突出当前相关的东西,或者仍然希望能够跳到下一个元素后,跳转到下一个搜索项.

理想情况下,我会创建一些函数+命令+映射,以强大,智能的方式处理所有这些.然后,我可能只是盲目地用我的命令,而编辑,并没有头痛试图记录,通过元素之间跳跃等工作的宏观不过,我还是很新的vimscripting并不太清楚如何开始.

xml vim

11
推荐指数
1
解决办法
607
查看次数

标签 统计

vim ×1

xml ×1