17

我正在尝试提高 Vim 中粘贴功能的可用性,因为太多不同的删除操作(实际上我认为它们都是这样)也会拉到粘贴缓冲区。

这意味着我不再能够删除一些我想粘贴到某处的文本,清理一些东西,然后再粘贴。我不知道为什么这是我喜欢做事的顺序,但我不打算改变它。

在返回进行清理之前,我基本上必须“原子地”移动,否则我会得到令人沮丧的逗号、括号或空格粘贴。哦,我知道我按其他顺序做的原因。它只是更有效。我不必移动到目的地,然后返回清理,然后再返回

如何改善这一点?我的建议是一个插件,可用于事后增加粘贴操作。点击p,看到它粘贴了一个无用的临时删除字符,此时(在粘贴操作之后立即)我们的插件将允许一个键循环通过先前删除的寄存器,就地更新我们的粘贴。

这样我可以删除所有我想要的东西,而且我实际上可以快速提取任何最近删除的项目,只要它是一个连续的片段。这当然很容易通过视觉选择然后删除来设置。这牺牲了易用性的特殊性,因为我不再需要记住指定一些特定的命名寄存器以用于特定的粘贴。

特别是,应该有一个堆栈,其中 yanks 和 delete 都累积到其中,稍后在粘贴过程中使用单个绑定快速遍历该堆栈。

有没有一个插件已经这样做了?

4

3 回答 3

31

您对编号的寄存器 ( ) 有点困惑:h quote_number

只有一个yank 寄存器,即"0.

除此之外,还有九个编号的删除寄存器"1"9。这些被填充为一个队列,最近的删除在顶部。

"1对于Vim的删除寄存器"9具有您要求的内置功能:您可以粘贴"1p,如果不是您要查找的内容,您可以重复u. u. u.切换寄存器"2"3"4等,直到您已经找到了正确的。此行为记录在:h redo-register

滚动浏览以前被拉出的文本通常是通过插件完成的,我所知道的最流行的插件

  • YankRing.vim,“维护以前的 yank、更改和删除的历史记录”,和
  • yankstack,“针对 vim 的 emacs 杀戮环的轻量级实现”。
于 2013-06-09T21:19:44.747 回答
7

为什么不使用命名寄存器?例如,使用"ayyank to register a,然后再"ap从它粘贴,同时它不会被正常删除等破坏。

于 2013-06-09T20:21:03.207 回答
5
[l]orem ipsum dolor sit amet

    yiw yanks "lorem" in @" and @0

lorem [i]psum dolor sit amet

    daw deletes "ipsum " into @", @0 still contains "lorem"

lorem dolor [s]it amet

    ciwfoo deletes "sit" into @" and inserts "foo", @0 still contains "lorem"

因为 register0仍然包含您拉出的内容 ( lorem),所以即使经过大量c, d, s, 操作"0p也将始终粘贴lorem,直到您明确拉出其他内容为止。

我的示例只涉及 Vim 所谓的“小删除”,因此不使用编号寄存器;当你做更大的操作时,Vim 也使用寄存器1-9,但它不会改变寄存器的行为,0总是保持最新的显式 yank。

:h registers是一本很好且易于理解的读物:Vim 有很多特性,插件并不是万能的。

另外,请参阅我的这个答案,建议使用黑洞寄存器。

于 2013-06-10T05:36:01.747 回答