在Vim中,假设我想用一个String的内容替换另一个String的内容。
原始输入
var1 = "January"
var2 = "February"
所需的输出
var1 = "January"
var2 = "January"
我通常会做的是:
y
i
"
(猛烈的内部引语)v
i
"
p
(视觉选择内部引号,粘贴)虽然效果很好,但我通常尽量避免使用视觉模式,所以我对第4步(v
i
"
p
)并不完全满意
有没有办法在不使用可视模式的情况下指定“目标粘贴区域”?我怀疑它可能是g
的链接,但我想不出任何东西。
答案 0 :(得分:3)
有很多方法可以做到这一点,但使用视觉模式是最简单的。
"_di"P
ci"<c-r>0
。 <c-r>
插入寄存器的内容pldt"
然而,视觉模式仍然有我的投票。我发现大多数人的担忧是使用可视模式+粘贴是默认寄存器与所选文本交换,并且不能很好地重复。大家好消息! 0
寄存器始终存储最后一个yank。坏消息是视觉模式仍然不能很好地重复。有关详细信息,请查看此vimcast剧集Pasting from Visual mode。它提到了一些有助于此的插件。
答案 1 :(得分:2)
这不是特别漂亮,但这里有:
yi"
"_di"hp
删除引号中的内容,但将删除的文本发送到黑洞寄存器。然后它将光标向后移动一个,并粘贴你从第一行拉出的东西。
总而言之,您可以从第一行开始并输入yi"j"_di"hp
。为什么人们发现vim令人生畏? ;)
或者,将第一行拉到正常位置,然后放到第二行并输入ci"<Ctrl+p>
并从菜单中选择之前被拉出的文本。
答案 2 :(得分:2)
摘自我的.vimrc:
" Delete to 'black hole' register
nnoremap <leader>d "_d
vnoremap <leader>d "_d
因此,您只需\di"P
作为最后一步(假设您使用\
作为<leader>
)。
答案 3 :(得分:2)
我经常需要这个,我写了一个插件来简化并允许最大速度:ReplaceWithRegister。
此插件提供了一个二合一gr
命令,该命令用{motion} / text对象,整行或当前选择覆盖的文本替换寄存器的内容;旧文本被删除到黑洞寄存器中,即它已经消失了。它透明地处理许多极端情况,并允许通过标准.
命令快速重复。如果您不喜欢它,它的页面会链接到替代品。
答案 4 :(得分:1)
有一个插件可以准确地解决这个问题。它可能是出于你所感受到的同样的感觉,即视觉模式通常对高级Vim用户来说感觉不太理想。
operator-replace - 用注册内容替换文本的运算符
安装了操作员替换后,替换就像这样。