有没有办法在vim中删除而不覆盖你的上一次猛拉?

时间:2010-09-03 18:27:32

标签: vim vi

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

  • 划了一条线
  • 转到您要粘贴的位置
  • 删除那里有什么
  • 粘贴你的猛拉,发现它粘贴你刚刚删除的东西

显然,工作流程首先是删除,然后是第二个。但如果我没有拥有,那将是非常好的。有人有这个诀窍吗? vim是否有一个运行良好的粘贴缓冲区,或者我可以更改.vimrc设置吗?

13 个答案:

答案 0 :(得分:296)

传递到_寄存器,即黑洞。

删除一行而不将其粘贴在寄存器中:

"_dd

另见:help registers

这可能是最安全的,如果你想反复粘贴一些东西,把它拉到一个“命名”的寄存器中。

"aY

a注册表中划线。用"ap粘贴它。

答案 1 :(得分:166)

你的猛拉线应该仍然在寄存器0中。所以

"0p

粘贴该行(并随时删除)

答案 2 :(得分:81)

默认情况下,所有yank和delete操作都会写入未命名的寄存器。但是,最近的删除和最近的删除始终(单独)存储在编号的寄存器中。 注册0拥有最近的一次。寄存器1-9包含最近的9个删除(1是最新的删除)。

换句话说,删除会覆盖未命名寄存器中最近的一个yank,但它仍然存在于0寄存器中。黑洞注册技巧("_dd )在其他答案中提到的有效,因为它可以防止覆盖未命名的寄存器,但这不是必需的。

您使用双引号引用寄存器,因此可以像这样粘贴最近出现的文本:

"0p

这是一个很好的参考:

答案 3 :(得分:38)

另一种可能性是:

像往常一样拉扯你的线条

转到要粘贴的位置,进入可视线模式(V

选择要替换的行

点击p粘贴你的行。

这还有一个额外的好处,即缓冲区与替换内容“交换”

答案 4 :(得分:23)

我使用以下映射来更容易删除黑洞寄存器:

nnoremap R "_d

这样,dd变为Rdd$变为R$。请注意,R通常必须进入替换模式,但我发现我从未使用过,因此最容易记住“真正删除”功能的密钥。

答案 5 :(得分:8)

" map paste, yank and delete to named register so the content
" will not be overwritten
nnoremap d "xd
vnoremap d "xd
nnoremap y "xy
vnoremap y "xy
nnoremap p "xp
vnoremap p "xp

答案 6 :(得分:5)

我写了this plugin (yankstack.vim)来解决这个问题。它为vim提供了Emacs's kill ring之类的东西。您可以抽取或删除多个内容,执行粘贴,然后在您的已删除/已删除文本的历史记录中来回循环。我发现它比记住我把东西塞进去的寄存器更容易。

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

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

让我点击ALT-p或ALT-SHIFT-p在我的粘贴历史记录中来回循环。

答案 7 :(得分:4)

对于您的具体问题,被问及,您不能只交换最后两个步骤的顺序吗?

  • yank line(相同
  • 移至新位置(相同
  • 粘贴拉线(是第4步
  • 删除您不想要的行(是第3步

当然,我通常会使用一个命名寄存器来处理这类事情,但有时解决方案比首先想到的更简单。

答案 8 :(得分:1)

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

E.g:

这会将一行放入注册a,删除另一行,然后粘贴注册a

"ayy` (move) `dd"aP

答案 9 :(得分:1)

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

答案 10 :(得分:1)

我发现所有这些关键组合都很麻烦。相反,我编写了一个函数来打开和关闭vim从删除操作覆盖缓冲区的“副作用”行为。这样你就可以关闭它,自由删除,然后在你完成后重新打开。

请在此处查看我的回答:https://stackoverflow.com/a/12649560/778118

要使用它,只需将其放入.vimrc

即可

答案 11 :(得分:0)

如果你是一个邪恶的用户,你可以考虑重新映射X来做相当于“_d。但是,完善实现对我来说有点棘手。尽管如此,我发现

(define-key evil-normal-state-map "X" 'evil-destroy)
(define-key evil-visual-state-map "X" 'evil-destroy)

(evil-define-operator evil-destroy (beg end type register yank-handler)
  "delete without yanking text"
  (evil-delete beg end type 95 yank-handler)
)

非常好地整合。例如,键入XX将类似于dd,X $到d $,X0到d0等等...

如果你对它是如何工作感到好奇,“95”表示“_ register,所以它只是将你的调用重新路由到删除,好像”_已经按下了寄存器。

答案 12 :(得分:0)

诀窍在于你知道你想抓住一些东西然后移动,而你正在使用'懒惰'的第一个寄存器(它被你刚删除的任何东西取代)。

你需要学会在vim中“剪切”。

删除前,请指定不同于"的寄存器。提示:使用:reg

查看您的注册表

现在,在任何命令之前按"选择一个新的寄存器(显然在命令模式下)

  1. 选择您要“剪切”的内容(或在步骤2中指定范围)
  2. 将注册更改为任何内容(此处1)并删除:"1d"1x或甚至"1c
  3. 去新地方,删除更多
  4. 现在您已准备好粘贴剪切并存储在寄存器1中的内容:"1p"1P
  5. 完成。这也有解决用例的优点:从一个地方删除5个不同的东西,每个部分去往不同的目的地......只需将"1中的一个放在"2中,依此类推...... 。去每个目的地并粘贴。