我发现在VIM中复制和粘贴的过程有些棘手:
- 进入可视化模式(Visual mode)
- 按下Y键
- 按下p键(或shift+p)
- 进入插入模式(insert mode)
如果你不小心按下了“删除”键,你会丢失内容(它被你删除的字符所替代),你需要重新复制一遍!
我已经使用Vim工作了几个月,我很喜欢它,但是复制和粘贴机制让我感到烦恼。
有没有一种简化它的方法?或者还有其他更简单的替代方案吗?
谢谢
我发现在VIM中复制和粘贴的过程有些棘手:
如果你不小心按下了“删除”键,你会丢失内容(它被你删除的字符所替代),你需要重新复制一遍!
我已经使用Vim工作了几个月,我很喜欢它,但是复制和粘贴机制让我感到烦恼。
有没有一种简化它的方法?或者还有其他更简单的替代方案吗?
谢谢
Ctrl-o
,但不知道Ctrl-R
。谢谢你告诉我。+1 - Jason Down"0p
会粘贴您最近复制的内容,而不是复制并删除的内容。 "1p
将为删除执行此操作,仅适用于已删除的内容,对"2p
(第二个最近删除的内容)等也适用。您可以在:h quote_number
中找到此信息。 - ZyX虽然并不是“简化版”,但您可以选择将文本复制到与默认删除文本所在的不同寄存器中。这样,当您意外删除某些内容时,就可以保护您复制的内容,避免丢失。
例如,要复制到寄存器a
,您需要执行以下操作:
" a y [移动命令]
然后,要粘贴文本,您需要执行以下操作:
" a p
还有一件事可以做。如果您希望在插入模式下粘贴,可以按ctrl+o,然后输入您的粘贴命令(例如我上面提到的寄存器粘贴命令)。ctrl+o命令等同于按下esc,但只能用于一个单独的命令。在这里了解更多信息。
最后,您总是可以选择编写一个vim脚本来更改默认行为以满足自己的需求(或者找到一个插件,例如yankring)。
更新
根据与kellogs
在评论中的交谈,我决定研究如何在视觉模式下使用任何寄存器进行复制/粘贴操作(更容易看到您要获取的内容)。结果证明这是可能的。
要将内容复制到寄存器a
,但在视觉模式下:
v(进入视觉模式)
然后执行上述相同的操作,但首先执行移动命令:
[移动命令] "ay(通过移动命令突出显示您的选择,然后将其复制到寄存器a
中)。
粘贴的方式与上述更新中列出的方式相同。
" a y 2 w
,这从我的当前光标位置提取了2个单词并将它们存储在寄存器a中。然后我可以通过 " a p
进行粘贴(尝试在几个位置进行,包括同一文件、新选项卡、不同的现有文件)。 - Jason DownVim在删除某些内容时并没有完全丢弃复制的文本,它只是覆盖了"
寄存器。上一个复制的文本始终存储在寄存器0
中,因此您可以将工作流程中的p
替换为"0p
,或者更好的方法是将其映射到,p
并使用:
nnoremap ,p "0p
xnoremap ,p "0p
_
):"_dd
,"_x
等。我个人使用,d
映射来实现此功能:nnoremap ,d "_d
xnoremap ,d "_d
在这种情况下,Vim不会覆盖任何寄存器。
第三种方法是使用字母寄存器,正如@Jason Down建议的那样。
没有太多可以简化的 - 这就是 Vim 的工作方式。嗯,或多或少。
然而,关于您删除(因此替换寄存器内容)的问题 - 您可以使用 YankRing 作为例子。它为 Vim 的复制/粘贴操作提供了一些“用户友好性”。
它是如何工作的?
您进入第一行,并将其拖动(在Windows术语中为“复制”)。 然后,您转到第二行并再次拖动。 然后,您转到第七行并也将其拖动。
然后,您可以去任何地方并粘贴!您会得到最后一个(第七)行。 按下快捷键,最后一个粘贴将被替换为先前的拖动(第二行)。 再次... 第一行 :)
因此,在这种方式下,您不必担心丢失已拖动的内容,这是我所理解的您的主要问题。
事情在于,您不应该“返回插入模式”。
编辑(拷贝、删除、替换等)是在正常模式下完成的,插入模式仅用于输入文本。
如果您处于插入模式并想要重复使用文档中已经存在的某些文本,则可以按以下键:
<C-n>
和 <C-p>
插入以光标左侧字符开头的单词<C-x><C-l>
插入以光标左侧字符开头的行