如何使用VIM在XML文件中复制整个条目?

如何使用VIM在XML文件中复制整个条目?,xml,vim,Xml,Vim,我在XML文件中包含以下内容: <TypeDef name="a"> <ArrayType high="14" low="0"> <UndefType type="node"> </UndefType> </ArrayType> </TypeDef> 我想复制这个条目。通常,我会转到第一行,使用V进入行视觉模式,转到最后一行,猛拉并粘贴 我如何复制整个条目而不自己查找条目的结尾?我今天学到的解决

我在XML文件中包含以下内容:

<TypeDef name="a">
  <ArrayType high="14" low="0">
    <UndefType type="node">
    </UndefType>
  </ArrayType>
</TypeDef>

我想复制这个条目。通常,我会转到第一行,使用
V
进入行视觉模式,转到最后一行,猛拉并粘贴


我如何复制整个条目而不自己查找条目的结尾?

我今天学到的解决方案(感谢谁回答了问题)是使用VIM的动作

将光标放在要复制的条目中,并在命令模式下键入以下内容:
yat

  • y
    根据以下动作猛拉
  • at
    选择当前标记
请注意,如果光标位于“ArrayType”标记内,则将拖动该标记。
还要注意的是,这不会拉扯整条线。仅从开始标记的开始大括号到结束标记的结束大括号。如果不小心,这可能会导致对齐问题

解决这个问题的一种方法是粘贴
:put
,而不是像这样粘贴
p
yat:put

请注意,这不会保留缩进,因为XML条目并没有作为一整行被拖动

另一种方法是:
vatVy

  • v
    进入可视模式
  • at
    如上所述
  • V
    切换到线路视觉模式并选择整条线路
  • y
    拖动所选内容

除了内森的答案,您可能还想查看matchit.vim。。。如果你有一个更新的安装,你可能有它

matchit扩展了vim的%(查找匹配括号)以涵盖xml/html标记等。因此,对于您的解决方案,操作将从开始标记开始

V%y

matchit当然对于一般的导航目的非常有用

令人印象深刻的方法!我试图定义一个新的vim函数,但文本对象似乎足够强大。你可以直接使用V。。。对于第二个例子来说,Vaty就足够了是的,但是做“at”会使我的视觉效果出格,无论如何我必须再次按V。我想我最好跳过第一个班次,只需按v'at'就可以让你在视觉上看不到线,因为“标签”不一定要跨越整条线,所以只有匹配的部分才会在视觉上被标记。除了切换回线条视觉模式,您还可以使用:putThanks按线条粘贴。我不知道:放。我将把它添加到答案中。