在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
当前回答
懒人的微创解决方案:
寄存器0总是包含最后一个yank (Rafael, alex2k8和idbrii已经提到过)。不幸的是,一直选择寄存器0会非常烦人,所以如果p默认使用“0”就好了。这可以通过在你的.vimrc中放入以下行来实现:
noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
execute 'noremap "'.s:i.'p "'.s:i.'p'
execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor
第一行将每个p笔画映射到“0p”。但是,这将阻止p访问任何其他寄存器。因此,具有显式选择寄存器的所有p笔画都映射到for循环中的等效命令行表达式。P也是一样。
这样就保留了标准的行为,除了隐式的p和p笔画,它们现在默认使用寄存器0。
提示1:cut命令现在是“0d而不是d。但因为我很懒,这对我来说太长了;)因此,我使用以下映射:
noremap <LEADER>d "0d
noremap <LEADER>D "0D
默认情况下,先导键是\,因此您可以通过输入\d或\d轻松地剪切文本。
提示2:多键映射的默认超时时间非常短。您可能希望增加它,以便在选择寄存器时有更多的时间。参见:help timeoutlen了解详细信息,我正在使用:
set timeout timeoutlen=3000 ttimeoutlen=100
其他回答
默认情况下,所有的yank和delete操作都写入未命名寄存器。然而,最近的yank和最近的delete总是存储在有编号的寄存器中(分开)。寄存器0保存最近的yank。寄存器1-9保存了最近的9个删除(其中1是最近的)。
换句话说,delete覆盖了未命名寄存器中最近的yank,但它仍然存在于0寄存器中。在其他答案中提到的黑洞寄存器技巧(“_dd)之所以有效,是因为它可以防止覆盖未命名的寄存器,但这不是必要的。
你可以使用双引号引用一个寄存器,所以可以像这样粘贴最近拉出的文本:
"0p
这是一个很好的参考:
http://blog.sanctum.geek.nz/advanced-vim-registers/
有一个简单的映射是很方便的,它可以让你用缓冲区替换当前选择。
例如,当你把这个放在你的。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
好吧,首先执行以下命令:
:h d
然后你会发现你可以删除到一个特定的寄存器。这样就不会改变默认寄存器中的内容。
对于'replace word',请在正常模式下尝试cw。
对于“替换段落”,尝试在正常模式下使用cap。
Noremap mm m
and
Noremap mx "_x
是我的处理方式。