Vim中有没有不覆盖上一次复制内容的情况下删除文本的方法?

332

我喜欢使用vim,但经常会遇到以下问题:

  • 复制一行
  • 移动到希望粘贴的位置
  • 删除该位置原有的内容
  • 粘贴你之前复制的内容,却发现它粘贴了你之前删除的内容

显然,正确的操作是先删除再复制。但如果我不想这样做,有什么技巧可以解决吗?Vim是否有一个可靠的粘贴缓冲区,或者是否有我可以更改的.vimrc设置?


3
Vi纯粹主义者会对我这样做感到不满,但你也可以使用“mswin”行为。它允许你使用Ctrl-C和Ctrl-V进行复制和粘贴。它使用自己的寄存器,因此你可以使用“yy”和“dd”任意次数。要使用此行为,请将以下行添加到您的*.vimrc*文件中:source $VIMRUNTIME/mswin.vimbehave mswin - Cristian Ciupitu
7
@Cristian - 它使用 * 寄存器。你可以使用vim命令将任意的移动内容复制到系统剪贴板,例如 "*y/foo<enter> 将把光标到下一个 "foo" 的文本复制到Windows剪贴板中。(如果使用 mswin/Ctrl-C,你需要先进入可视化模式。) - dash-tom-bang
@dash-tom-bang:是的,我不记得它是哪个寄存器了。 - Cristian Ciupitu
1
我发现http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text非常有用和深入。 - Micha Wiedenmann
vim-easyclip(https://github.com/svermeulen/vim-easyclip)的设计旨在解决这个确切的问题。 - Steve Vermeulen
@CristianCiupitu 不错的想法,但是 msvin 不起作用了(再也不行了?)。ctrl+v 总是空的。 - phil294
13个回答

1

1

我觉得所有这些键盘组合很麻烦。相反,我编写了一个函数来切换vim的“副作用”行为,从而避免删除操作覆盖缓冲区。这样,您只需切换它关闭,自由删除,然后完成后再切换回来。

请参见我的答案:https://dev59.com/-2jWa4cB1Zd3GeqPvfH8#12649560

要使用它,只需将其放入您的.vimrc文件中即可。


0

诀窍在于你知道你想要抓取并移动什么,而且你正在使用“懒惰”的第一个寄存器(它将被刚刚删除的任何内容替换)。

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

在删除之前,指定与"不同的任何寄存器。提示:使用:reg查看您的寄存器

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

  1. 选择要“剪切”的内容(或在步骤2中指定范围)
  2. 更改寄存器到任何东西(这里是1)并删除:"1d"1x甚至"1c
  3. 去新地方,再删除一些
  4. 现在,您已经准备好粘贴您在寄存器1中剪切和存储的内容:"1p"1P

完成。这也有一个优点,解决了用例:从一个地方删除5个不同的东西,每个部分都去不同的目的地...只需将一个放在"1,另一个放在"2"等等...到达每个目的地并粘贴即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接