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

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

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

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


当前回答

默认情况下,所有的yank和delete操作都写入未命名寄存器。然而,最近的yank和最近的delete总是存储在有编号的寄存器中(分开)。寄存器0保存最近的yank。寄存器1-9保存了最近的9个删除(其中1是最近的)。

换句话说,delete覆盖了未命名寄存器中最近的yank,但它仍然存在于0寄存器中。在其他答案中提到的黑洞寄存器技巧(“_dd)之所以有效,是因为它可以防止覆盖未命名的寄存器,但这不是必要的。

你可以使用双引号引用一个寄存器,所以可以像这样粘贴最近拉出的文本:

"0p

这是一个很好的参考:

http://blog.sanctum.geek.nz/advanced-vim-registers/

其他回答

好吧,首先执行以下命令:

:h d

然后你会发现你可以删除到一个特定的寄存器。这样就不会改变默认寄存器中的内容。

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

复制(又名:yank)

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

粘贴

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

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

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

要删除某些内容而不将其保存在寄存器中,你可以使用“黑洞寄存器”:

"_d

当然,您也可以使用其他任何不包含您感兴趣的任何内容的寄存器。

下面的vscode设置应该允许dd和dw变成“_dd和”_dw,现在我们的remapper可以正常工作。

{
     "vim.normalModeKeyBindingsNonRecursive": [
        {
            "before": ["d"],
            "after": [ "\"", "_", "d" ]
        }
    ]
}

是的。这比先删除“旧”文本稍微复杂一些,但是:

我从。开始。

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文档