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

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

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

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


当前回答

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

其他回答

Noremap mm m

and

Noremap mx "_x

是我的处理方式。

对于那些使用JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA)与IdeaVim。你可能会遇到像nnoremap d "_d这样的重映射问题,并使用它来删除一行dd。可能的解决方案:nnoremap dd "_dd

youtrack上有一些问题,请为它们投票: https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363

我经常犯一个错误,当我执行命令“y'ank then '”_d'elete into a black hole then 'p'aste。我更喜欢'y'ank,然后删除我喜欢的,然后从0寄存器中删除' ' 0p',这是最后复制的文本被推入的地方。

好吧,首先执行以下命令:

:h d

然后你会发现你可以删除到一个特定的寄存器。这样就不会改变默认寄存器中的内容。

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

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