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

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

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

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


当前回答

Vim有时更倾向于复杂性,而不是实用性,这给用户带来了应用寄存器来复制/删除操作的负担——通常情况下,用户只想粘贴复制的内容,而“忘记”删除的内容。

但是,与其与vim复杂的寄存器作斗争,不如让它们更方便:选择一个“默认”寄存器来存储最新的删除。例如,发送删除到d寄存器(让a-c打开以供特别使用;D是一个很好的助记符):

nnoremap d "dd           "send latest delete to d register
nnoremap D "dD           "send latest delete to d register 
nnoremap dd "ddd         "send latest delete to d register
nnoremap x "_x           "send char deletes to black hole, not worth saving
nnoremap <leader>p "dp   "paste what was deleted
nnoremap <leader>P "dP   "paste what was deleted

这种方法可以防止删除操作破坏yanks,但不会丧失对删除操作的注册——用户可以粘贴(回)删除的内容,而不是将其丢失在黑洞中(就像已接受的答案一样)。在上面的例子中,这种召回是通过两个前导p映射完成的。这种方法的一个好处是,它让您能够选择要粘贴的内容:(A)刚刚删除的内容,或(b)刚刚删除的内容。

其他回答

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

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

它猛拉光标所在的单词

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

标准模式:

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

插入模式:

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

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

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

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

有一个简单的映射是很方便的,它可以让你用缓冲区替换当前选择。

例如,当你把这个放在你的。vimrc

" it's a capital 'p' at the end
vmap r "_dP

然后,在复制一些东西到寄存器(即用“y”)后,你可以选择你想要替换的文本,并简单地敲击键盘上的“r”。所选内容将被当前寄存器替换。

解释:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

我发现从一开始就更容易插入'p'缓冲区。

复制(又名:yank)

# highlight text you want to copy, then:
"py

粘贴

# delete or highlight the text you want to replace, then:
"pp

优点(相对于删除到特定寄存器):

“pp很容易上手 不会在删除时意外覆盖粘贴缓冲区。

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

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