在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
在使用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