任何方式删除VIM中没有覆盖你最后一个猛拉?

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

  • 抽出一条线
  • 去你想要粘贴的地方
  • 删除那里
  • 粘贴你的手,只发现它粘贴你刚刚删除的东西

显然,工作stream程是先删除,再删除。 但是,如果我不必这样做,那将是非常好的。 任何人都有这个技巧? vim是否有可以正常工作的粘贴缓冲区,或者是否有可以更改的.vimrc设置?

传递给黑名单,黑洞。

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

 "_dd 

另见:help registers

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

 "aY 

把一行写入registry。 贴上"ap

你的被抽出的线应该仍然在寄存器0中

 "0p 

粘贴行(并删除你想要的)

所有的删除和删除操作默认写入未命名的寄存器。 但是,最近的抽签和最近的删除总是(单独)存储在编号的寄存器中。 寄存器0保存最近一次的抽签 。 寄存器1-9保存最近9次删除(其中1是最近的删除)。

换句话说, 删除覆盖了未命名的寄存器中最近的一个YANK,但是它仍然存在于0寄存器中。 在其他答案中提到的blackhole-register trick( "_dd ,因为它可以防止覆盖未命名的寄存器,但这不是必需的。

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

 "0p 

这是一个很好的参考:

另一种可能性是:

像通常那样抽出你的线条

去你想要粘贴的地方,进入视线模式( V

select你想要replace的行

p来粘贴你的线。

这也有额外的好处,即缓冲区被replace的内容“交换”

我使用下面的映射使黑洞寄存器的删除更容易一些:

 nnoremap R "_d 

这样, dd变成Rdd$变成R$ 。 请注意, R通常会进入replace模式,但是我发现我从来没有使用过,所以记住“真正删除”function的关键是最简单的。

 " 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 

正如问的那样 ,对于你的具体问题,你能不能把最后两步的顺序换掉?

  • 拉线( 相同
  • 搬到新地点( 相同
  • 粘贴抽出的线( 步骤4
  • 删除你不想要的行( 步骤3

当然,我通常使用一个有名的寄存器来处理这种types的事情,但是有时候这个解决scheme比首先想到的要简单。

我写了这个插件(yankstack.vim)来解决这个问题。 它为你提供了一些类似于Emacs的 vim 杀手环 。 你可以抽出或删除多个东西,做一个粘贴,然后循环来回你的历史的抽出/死亡的文字。 我觉得比不得不记住我把什么东西放进去了。

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

 nmap <Mp> <Plug>yankstack_substitute_older_paste nmap <MP> <Plug>yankstack_substitute_newer_paste 

这让我击中ALT-P或ALT-SHIFT-P来循环来回浏览我的粘贴历史logging。

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

我发现所有这些关键组合繁琐。 相反,我写了一个函数来打开和closuresvim的覆盖缓冲区的删除操作的“副作用”行为。 这样,您可以将其closures,自由删除,完成后再切换。

看到我的答案在这里: https : //stackoverflow.com/a/12649560/778118

要使用它只是把它放在你的.vimrc

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

例如:

这将一行写入寄存器a ,删除不同的行,然后粘贴寄存器a

 "ayy` (move) `dd"aP 

如果你是一个邪恶的用户,你可能会考虑将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的function类似于dd,X $到d $,X0到d0等等。

如果你对它是如何工作感到好奇的话,那么“95”就代表“_ register”,所以它只是简单地改变了你的电话的删除方式,就好像“_已经被注册了。

诀窍是,你知道你想抓东西并移动,而你正在使用“懒”的第一个registry(它会被你刚刚删除的任何东西取代)。

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

在删除之前,指定任何不同于" 1 "寄存器。提示:检查你的寄存器:reg

现在,你可以通过按"任何命令之前select一个新的寄存器(很明显,在命令模式下)

  1. select你想要“剪切”(或在步骤2中指定一个范围)
  2. 将寄存器更改为( 1 ),然后删除: "1d"1x甚至"1c
  3. 去新的地方,删除更多
  4. 现在您已经准备好将您剪切并存储在寄存器1中的内容粘贴到"1p"1P

完成。 这也有解决用例的好处:从一个地方删除5个不同的东西,每个片段去一个不同的目的地…只是把一个在另一个"2等等…去到每个目的地和糊。