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

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

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

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


当前回答

对于那些主要感兴趣的人,当您通过虚拟选择和粘贴替换文本时,不覆盖未命名寄存器。

你可以使用下面的解决方案,这是简单的,最适合我:

Xnoremap <expr> p 'pgv"'.v:register.'y'

以下是回答(和评论): 如何粘贴而不覆盖寄存器

它首先经过选区,然后再次选择带有新文本的选区(gv)。现在是上次在可视模式下使用的寄存器(通常是未命名的寄存器,但如果使用另一个寄存器进行粘贴,也会产生副作用)。然后将新值再次拉入寄存器。

PS:如果你需要一个更简单的变种,它也适用于intellj idea插件vim-simulation,你可以采用这个(缺点:覆盖未命名的寄存器,即使另一个寄存器被给出粘贴):

Vnoremap p pgvy

其他回答

在windows版本中(可能也在Linux中),你可以使用“*y”(即在你的yank命令前加双引号和星号)插入系统的复制/粘贴缓冲区。

然后,您可以正常删除可替换的行,并使用“*p”粘贴复制的文本。

寄存器0到9是最新的东西你拉或削减等,不包括删除的东西等。所以如果你拉/切一些东西,它也在寄存器0中,即使你说在那之后删除了东西,寄存器0仍然是你拉/切的最后一个东西。

yiw#转到默认寄存器和寄存器0

它猛拉光标所在的单词

删除的东西等将去默认寄存器,但不是寄存器0

标准模式:

“0p#放入寄存器0的内容

插入模式:

Ctrl-r 0 #放入寄存器0的内容

我也有一个朋友,他总是猛拉/切来注册x,哈哈。

我把以下内容放在我的vimrc中:

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

现在我从剪贴板寄存器中插入和放入,而不必关心默认寄存器中发生了什么。另外一个好处是,我可以轻松地从其他应用中粘贴。我失去了一些功能,我知道(我不再能够管理剪贴板寄存器和默认寄存器的不同复制信息),但我只是无法跟踪多个寄存器/剪贴板。

你可以创建一个简单的宏: q " _dwq

现在要在不覆盖寄存器的情况下删除下一个单词,可以使用@d

对于'replace word',请在正常模式下尝试cw。

对于“替换段落”,尝试在正常模式下使用cap。