在使用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删除的字符不再填充最新的寄存器。

其他回答

要删除某些内容而不将其保存在寄存器中,你可以使用“黑洞寄存器”:

"_d

当然,您也可以使用其他任何不包含您感兴趣的任何内容的寄存器。

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

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

它猛拉光标所在的单词

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

标准模式:

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

插入模式:

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

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

主要问题是在可视模式下使用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 "的内容没有改变。

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

对于你给出的具体例子,如果我理解了问题,那么这可能是可行的:

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)