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

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

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

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


当前回答

我把以下内容放在我的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

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

其他回答

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

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

VIM文档:编号为0的寄存器包含来自最近yank命令的文本, 除非该命令指定了另一个["x]寄存器。

例如,我们删除“foo”和“bar”-注册表0仍然包含“foo”!因此“foo”可以使用“0p”来粘贴

为了强调EBGreen所说的:

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

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


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

:registers

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


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

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

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

主要问题是在可视模式下使用p。下面的函数将恢复未命名寄存器的内容后,你粘贴的东西在视觉模式。

 function! MyPaste(ex)
  let save_reg = @"
  let reg = v:register
  let l:count = v:count1
  let save_map = maparg('_', 'v', 0, 1)
  exec 'vnoremap _ '.a:ex
  exec 'normal gv"'.reg.l:count.'_'
  call mapset('v', 0, save_map)
  let @" = save_reg
endfunction

vmap p :<c-u>call MyPaste('p')<cr>
vmap P :<c-u>call MyPaste('P')<cr>

用法和以前一样,register "的内容没有改变。