我喜欢vim,但一个常见的问题是:

拉起一条线 去你想粘贴的地方 删除已有内容 粘贴你的yank,却发现它粘贴了你刚刚删除的内容

显然,工作流是先删除,再删除。但如果我不这么做就太好了。有人有诀窍吗?vim是否有一个工作良好的粘贴缓冲区,或者是否有一个我可以更改的.vimrc设置?


当前回答

你的被拉拽的行应该仍然在寄存器0中。所以做

"0p

粘贴这一行(并随时删除)

其他回答

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

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

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

"0p

这是一个很好的参考:

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

我写了这个插件(洋栈.vim)来解决这个问题。就像Emacs给vim的杀人戒指一样。您可以删除或删除多个内容,进行粘贴,然后在删除/删除文本的历史记录中来回循环。我发现这比记住我把东西放进哪个寄存器要容易得多。

在我的.vimrc中,我有这些映射:

nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste

它可以让我按ALT-p或ALT-SHIFT-p在粘贴历史中来回循环。

你可以使用寄存器:"<register><command> .

例如:

这将把一行插入寄存器a,删除另一行,然后粘贴寄存器a

"ayy` (move) `dd"aP

您还可以尝试以下脚本:ReplaceWithRegister at vim.org/scripts/

你的被拉拽的行应该仍然在寄存器0中。所以做

"0p

粘贴这一行(并随时删除)