在vim中,通过移动来覆盖粘贴

3
考虑以下经常出现的情况。
do_something("argument to use");
do_something_else("here I want the same argument es above");

我从其他地方复制了第二行,但它有错误的参数。我想让它与上面的那一行参数相同。所以我移到上面的 argument…a 处,在普通模式下按下 yt"(=yank till ")。这将复制引号内和引号外的所有内容。然后我向下移动一行到 here…h 处,我想用刚刚复制的内容替换这些引号中的所有内容,类似于 rt"(=replace till "),但 r 已经用于替换单个字符。这是否可能?
PS:我知道在这种情况下,我可以只复制第一行并将 _else 添加到 do_something 中。但这只是一个例子,我不知道是否有办法像我在vim中描述的那样做。
4个回答

3
您可以使用可视化模式来完成此操作。当您的光标位于 h 上时,只需按下:
vt"p
  • v 启用可视模式。
  • t" 会将您的光标移动到 " 的前面,并选择其路径上的所有内容。
  • p 将粘贴到所选文本上。

啊,好的,我通常尽量避免使用可视化模式,但这次它确实很方便,谢谢! - undefined
没问题!是啊,视觉模式也不是我最喜欢的,但它有一些强大的功能。 - undefined

3
我经常需要这个功能,因此编写了一个插件来简化操作并实现最大速度: ReplaceWithRegister
此插件提供了一个双合一的gr命令,可以将被{motion} /文本对象覆盖的文本、整行或当前选择区域替换为寄存器中的内容;旧文本将被删除到黑洞寄存器中,即已不存在。它可以透明地处理许多边角情况,并允许通过标准的.命令快速重复。如果您不喜欢它,该页面链接了其他替代方案。

谢谢,我会看一下! - undefined

2

作为可视模式解决方案的替代,您可以使用黑洞寄存器在粘贴正确版本之前删除第二行的文本。

"_di"P
  • "_di" 删除 "" 之间的内容(如果您在引用的开头,则与 "_dt" 相同)
  • P 执行上述操作后,光标位于闭合的 " 上,因此请在光标之前粘贴文本。

这也是更像vim的方式,但我认为在这种情况下使用可视模式更容易理解,也更容易实现。 - undefined
太酷了。我之前不知道关于“内部”的东西。谢谢!但正如Sander所说,他的版本更简单。 - undefined
没问题。最重要的是在那个时候最有用的东西。还有a作为i的补充,它包括周围的字符。例如,da"将删除"以及它们之间的文本。 - undefined

2

您还可以使用c{motion},然后在插入模式下使用CTRL-R0来粘贴最后一次yank的内容。

ci"<C-R>0
  • ci" 命令会删除引号内的内容并进入插入模式。
  • <C-R>{register} 命令会将寄存器 {register} 中的内容粘贴到当前光标位置,并进入插入模式。寄存器 0 中保存着最近一次复制的内容,可通过命令 :h "0 查看详细信息。

相比于 "_di"P 命令,我发现这个解决方案更容易操作,同时还能实现多次粘贴。


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