在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
当前回答
下面的vscode设置应该允许dd和dw变成“_dd和”_dw,现在我们的remapper可以正常工作。
{
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["d"],
"after": [ "\"", "_", "d" ]
}
]
}
其他回答
懒人的微创解决方案:
寄存器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
VIM文档:编号为0的寄存器包含来自最近yank命令的文本, 除非该命令指定了另一个["x]寄存器。
例如,我们删除“foo”和“bar”-注册表0仍然包含“foo”!因此“foo”可以使用“0p”来粘贴
对于Dvorak用户来说,一个非常方便的方法是将不需要的文本删除到“1寄存器”而不是“_黑洞寄存器”中,如果只是因为你可以在Dvorak中按“+ 1与相同的shift键和快速的小指运动,因为1是紧靠上面的键”(另一方面是PLUS d,这使得整个命令速度非常快)。
当然,1寄存器也可以用于其他事情,因为它很方便,但除非你有一个比替换文本更常见的目的,否则我认为它是一个很好的使用寄存器的方法。
寄存器0到9是最新的东西你拉或削减等,不包括删除的东西等。所以如果你拉/切一些东西,它也在寄存器0中,即使你说在那之后删除了东西,寄存器0仍然是你拉/切的最后一个东西。
yiw#转到默认寄存器和寄存器0
它猛拉光标所在的单词
删除的东西等将去默认寄存器,但不是寄存器0
标准模式:
“0p#放入寄存器0的内容
插入模式:
Ctrl-r 0 #放入寄存器0的内容
我也有一个朋友,他总是猛拉/切来注册x,哈哈。
对于那些主要感兴趣的人,当您通过虚拟选择和粘贴替换文本时,不覆盖未命名寄存器。
你可以使用下面的解决方案,这是简单的,最适合我:
Xnoremap <expr> p 'pgv"'.v:register.'y'
以下是回答(和评论): 如何粘贴而不覆盖寄存器
它首先经过选区,然后再次选择带有新文本的选区(gv)。现在是上次在可视模式下使用的寄存器(通常是未命名的寄存器,但如果使用另一个寄存器进行粘贴,也会产生副作用)。然后将新值再次拉入寄存器。
PS:如果你需要一个更简单的变种,它也适用于intellj idea插件vim-simulation,你可以采用这个(缺点:覆盖未命名的寄存器,即使另一个寄存器被给出粘贴):
Vnoremap p pgvy