任何方式删除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
变成Rd
, d$
变成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一个新的寄存器(很明显,在命令模式下)
- select你想要“剪切”(或在步骤2中指定一个范围)
- 将寄存器更改为(
1
),然后删除:"1d
或"1x
甚至"1c
- 去新的地方,删除更多
- 现在您已经准备好将您剪切并存储在寄存器1中的内容粘贴到
"1p
或"1P
完成。 这也有解决用例的好处:从一个地方删除5个不同的东西,每个片段去一个不同的目的地…只是把一个在另一个"2
等等…去到每个目的地和糊。