在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
在使用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删除的字符不再填充最新的寄存器。
其他回答
我经常犯一个错误,当我执行命令“y'ank then '”_d'elete into a black hole then 'p'aste。我更喜欢'y'ank,然后删除我喜欢的,然后从0寄存器中删除' ' 0p',这是最后复制的文本被推入的地方。
好吧,首先执行以下命令:
:h d
然后你会发现你可以删除到一个特定的寄存器。这样就不会改变默认寄存器中的内容。
对于那些主要感兴趣的人,当您通过虚拟选择和粘贴替换文本时,不覆盖未命名寄存器。
你可以使用下面的解决方案,这是简单的,最适合我:
Xnoremap <expr> p 'pgv"'.v:register.'y'
以下是回答(和评论): 如何粘贴而不覆盖寄存器
它首先经过选区,然后再次选择带有新文本的选区(gv)。现在是上次在可视模式下使用的寄存器(通常是未命名的寄存器,但如果使用另一个寄存器进行粘贴,也会产生副作用)。然后将新值再次拉入寄存器。
PS:如果你需要一个更简单的变种,它也适用于intellj idea插件vim-simulation,你可以采用这个(缺点:覆盖未命名的寄存器,即使另一个寄存器被给出粘贴):
Vnoremap p pgvy
对于emacs-evil用户,可以在粘贴后触发函数(evil-paste-pop),并循环遍历杀死环中的先前条目。假设你将它绑定到<C-p> (Spacemacs中的默认值),你将按需要点击p后面的<C-p>。
默认情况下,所有的yank和delete操作都写入未命名寄存器。然而,最近的yank和最近的delete总是存储在有编号的寄存器中(分开)。寄存器0保存最近的yank。寄存器1-9保存了最近的9个删除(其中1是最近的)。
换句话说,delete覆盖了未命名寄存器中最近的yank,但它仍然存在于0寄存器中。在其他答案中提到的黑洞寄存器技巧(“_dd)之所以有效,是因为它可以防止覆盖未命名的寄存器,但这不是必要的。
你可以使用双引号引用一个寄存器,所以可以像这样粘贴最近拉出的文本:
"0p
这是一个很好的参考:
http://blog.sanctum.geek.nz/advanced-vim-registers/