在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
当前回答
是的。这比先删除“旧”文本稍微复杂一些,但是:
我从。开始。
line1
line2
line3
line4
old1
old2
old3
old4
shift+v选择line1, line2, line3和line4,然后用d命令删除它们
然后用同样的方法删除原来的1-4行。
然后,做
"2p
这将粘贴倒数第二行(第1-4行)。“3p会做倒数第三,以此类推。
最后得到
line1
line2
line3
line4
参考: 编号寄存器上的Vim文档
其他回答
在插入模式下删除的文本不会进入默认寄存器。
我在适当的情况下使用的两种解决方案是;
用Vims VISUAL模式突出显示你想要替换的内容,然后粘贴寄存器。
我使用这个主要是出于习惯,因为我只是在很久以后才发现第二个解决方案,例如
yiw " yank the whole word
viwp " replace any word with the default register
YankRing。有了这个插件,你可以使用键绑定<ctrl>+<p>来替换之前的编号寄存器与你刚刚粘贴的。
基本上你去粘贴,因为你会,但当你意识到你已经覆盖了默认寄存器,从而失去了什么你实际上想要粘贴你可以<C-P>找到和替换从YankRing历史!
其中一个肯定有插件…
要删除某些内容而不将其保存在寄存器中,你可以使用“黑洞寄存器”:
"_d
当然,您也可以使用其他任何不包含您感兴趣的任何内容的寄存器。
对于那些主要感兴趣的人,当您通过虚拟选择和粘贴替换文本时,不覆盖未命名寄存器。
你可以使用下面的解决方案,这是简单的,最适合我:
Xnoremap <expr> p 'pgv"'.v:register.'y'
以下是回答(和评论): 如何粘贴而不覆盖寄存器
它首先经过选区,然后再次选择带有新文本的选区(gv)。现在是上次在可视模式下使用的寄存器(通常是未命名的寄存器,但如果使用另一个寄存器进行粘贴,也会产生副作用)。然后将新值再次拉入寄存器。
PS:如果你需要一个更简单的变种,它也适用于intellj idea插件vim-simulation,你可以采用这个(缺点:覆盖未命名的寄存器,即使另一个寄存器被给出粘贴):
Vnoremap p pgvy
下面的vscode设置应该允许dd和dw变成“_dd和”_dw,现在我们的remapper可以正常工作。
{
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["d"],
"after": [ "\"", "_", "d" ]
}
]
}