在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
当前回答
对于那些使用JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA)与IdeaVim。你可能会遇到像nnoremap d "_d这样的重映射问题,并使用它来删除一行dd。可能的解决方案:nnoremap dd "_dd
youtrack上有一些问题,请为它们投票: https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363
其他回答
我找到了一个非常有用的映射:
xnoremap p "_dP
删除的文本被放入“黑洞寄存器”,而被拉拽的文本仍然存在。
来源:http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text
在windows版本中(可能也在Linux中),你可以使用“*y”(即在你的yank命令前加双引号和星号)插入系统的复制/粘贴缓冲区。
然后,您可以正常删除可替换的行,并使用“*p”粘贴复制的文本。
下面的vscode设置应该允许dd和dw变成“_dd和”_dw,现在我们的remapper可以正常工作。
{
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["d"],
"after": [ "\"", "_", "d" ]
}
]
}
我把以下内容放在我的vimrc中:
noremap y "*y
noremap Y "*Y
noremap p "*p
noremap P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P
现在我从剪贴板寄存器中插入和放入,而不必关心默认寄存器中发生了什么。另外一个好处是,我可以轻松地从其他应用中粘贴。我失去了一些功能,我知道(我不再能够管理剪贴板寄存器和默认寄存器的不同复制信息),但我只是无法跟踪多个寄存器/剪贴板。
是的。这比先删除“旧”文本稍微复杂一些,但是:
我从。开始。
line1
line2
line3
line4
old1
old2
old3
old4
shift+v选择line1, line2, line3和line4,然后用d命令删除它们
然后用同样的方法删除原来的1-4行。
然后,做
"2p
这将粘贴倒数第二行(第1-4行)。“3p会做倒数第三,以此类推。
最后得到
line1
line2
line3
line4
参考: 编号寄存器上的Vim文档