在使用Vim时,我经常想用我刚拉出的代码块替换代码块。

但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。

那么,在Vim中替换文本的最灵活、最快的方法是什么呢?

是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?


当前回答

我的情况:在普通模式下,当我使用x键删除字符时,这些删除会覆盖我的最新寄存器——当我想使用x删除字符并粘贴我在最近寄存器中的内容时(例如,在两个或多个位置粘贴相同的文本),这会使编辑复杂化。

我尝试了被接受的答案(“_d”)中的建议,但它不起作用。

然而,从https://vi.stackexchange.com/questions/122/performing-certain-operations-without-clearing-register上接受的回答/评论中,我把这个添加到我的~/中。vimrc,工作(你可能需要重新启动Vim):

nnoremap x "_x

也就是说,我现在可以执行普通的yank (y)、delete (d)和paste (p)命令——使用x删除的字符不再填充最新的寄存器。

其他回答

为了强调EBGreen所说的:

如果在选择文本时进行粘贴,则所选文本将替换为粘贴的文本。

如果您想复制一些文本,然后将其粘贴到多个位置,请使用“0p”进行粘贴。编号为0的寄存器包含来自最近yank命令的文本。


此外,你可以列出所有寄存器的内容:

:registers

该命令使得在执行dbr应答之类的操作时更容易找出需要的寄存器。您还将看到/,%,#寄存器。(请参见:帮助寄存器)


最后,检查cW和cW来改变一个单词,包括和不包括尾随空格。(大写W包含标点符号。)

在插入模式下删除的文本不会进入默认寄存器。

Noremap mm m

and

Noremap mx "_x

是我的处理方式。

对于Dvorak用户来说,一个非常方便的方法是将不需要的文本删除到“1寄存器”而不是“_黑洞寄存器”中,如果只是因为你可以在Dvorak中按“+ 1与相同的shift键和快速的小指运动,因为1是紧靠上面的键”(另一方面是PLUS d,这使得整个命令速度非常快)。

当然,1寄存器也可以用于其他事情,因为它很方便,但除非你有一个比替换文本更常见的目的,否则我认为它是一个很好的使用寄存器的方法。

我在适当的情况下使用的两种解决方案是;

用Vims VISUAL模式突出显示你想要替换的内容,然后粘贴寄存器。

我使用这个主要是出于习惯,因为我只是在很久以后才发现第二个解决方案,例如

yiw   " yank the whole word
viwp  " replace any word with the default register

YankRing。有了这个插件,你可以使用键绑定<ctrl>+<p>来替换之前的编号寄存器与你刚刚粘贴的。

基本上你去粘贴,因为你会,但当你意识到你已经覆盖了默认寄存器,从而失去了什么你实际上想要粘贴你可以<C-P>找到和替换从YankRing历史!

其中一个肯定有插件…