如何简化Vim中的“复制和粘贴”?

n3schb8v  于 2022-11-11  发布在  其他
关注(0)|答案(8)|浏览(185)

我发现在VIM中复制和粘贴的过程有点棘手:

  • 可视模式
  • Y型
  • p(或移位p)
  • 插入方式

如果您错误地按了“delete”键,您将丢失内容(它将被您删除的字符替换),您必须重新复制它!
我已经使用Vim几个月了,我很喜欢它,但是复制和粘贴机制让我很恼火。
有没有办法简化它?或者一些更简单的选择?
谢谢你

ndasle7k

ndasle7k1#

Vim维护了一个列表,列出了你在编号寄存器中最近9次删除的内容,所以"0p将粘贴你最近一次删除的内容,"1p将粘贴你第二次删除或修改的内容(注意这不包括简单删除的内容),依此类推,用于寄存器2-9。
如果你想使用超过最后9个删除的项目,或者如果你想一个简单的方法来访问以前的美国佬,我会推荐yankring插件,其中,除其他外,让你看到你的最后100个美国佬,并选择你想粘贴与:YRShow命令之一。
最后,如果你想在不离开插入模式的情况下粘贴,你可以使用Ctrl-R来插入任何寄存器的内容。因此,在插入模式下键入<Ctrl-R>"将插入未命名寄存器"的内容(当没有指定寄存器时,这是插入文本的位置)。

u0njafvf

u0njafvf2#

虽然不完全是“简化”,但你确实可以选择将文本复制到与被删除文本默认位置不同的寄存器中。这将保护你不会因为不小心删除了一些东西而丢失复制的内容。
要复制到寄存器a(作为示例),应执行以下操作:
“ay[移动命令]
然后,要粘贴文本,您可以执行以下操作:
“美联社
还有一件事你也可以做。如果你想在插入模式下粘贴,你可以按下ctrl+o,然后输入你的粘贴命令(比如我上面提到的register粘贴命令)。ctrl+o命令相当于按下esc,但是只有一个命令。阅读更多关于它的内容here
最后,您可以选择编写一个vim脚本来根据自己的喜好更改默认行为(或者找到一个插件,如yankring)。

更新

基于评论中与kellogs的对话,我决定研究如何使用任何寄存器进行复制/粘贴,但在复制命令的可视模式下(更容易直观地看到您正在抓取的内容)。
要在视觉模式下复制到寄存器a
v(进入可视模式)
然后执行与上面相同的操作,但首先执行移动命令:
[移动命令]“ay(通过移动命令突出显示您的选择,然后猛拉到寄存器a中)。
粘贴是通过上面列出的UPDATE的正常方式完成的。

ffvjumwh

ffvjumwh3#

当你删除某个内容时,Vim并没有完全丢弃被拽走的文本,它只是覆盖了"寄存器。最后一个被拽走的文本总是存储在0寄存器中,因此你可以在工作流中用"0p替换p,或者更好地,将其Map到,p并使用它:

nnoremap ,p "0p
xnoremap ,p "0p

另一种方法是丢弃被删除的文本(将其删除到黑洞寄存器_):"_dd"_x等等。我个人使用,dMap:

nnoremap ,d "_d
xnoremap ,d "_d

在这种情况下,Vim不会覆盖任何寄存器。
第三是使用字母寄存器,正如@杰森唐建议。

des4xlb0

des4xlb04#

对我来说,最简单的解决方案是创建一个组合键Map,在模式上切换这个删除副作用关闭或打开。
有了我的脚本,我输入,,我在“无副作用”模式,所以删除文本没有影响我的猛拉缓冲区,所以我可以猛拉删除粘贴自由和有效地所有我喜欢的。
然后,当我完成输入,,再次和vim回到它的默认行为与删除键副作用。
我发现这个解决方案非常理想,因为我不需要在每次复制粘贴时都考虑缓冲区。
vim toggling buffer overwrite behavior when deleting

hts6caw3

hts6caw35#

当我不想改变模式,我只是使用系统剪贴板复制和粘贴。
或者我使用CTRL-Y,如果我只是复制上一行的字符。
如果要从缓冲区中的其他位置复制整行的内容,请键入前几个字符并使用CTRL-XCTRL-L。
有关更多信息,请访问:

  • :help i_CTRL-Y
  • :help i_CTRL-X_CTRL-L
dgiusagp

dgiusagp6#

没什么好简化的--这就是Vim的工作原理。嗯,差不多吧。
然而,关于删除(因此,替换寄存器的内容)的问题--例如,您可以使用YankRing。它为Vim的yank/paste操作提供了一些“用户友好性”。
"它是如何运作的?"
你先到第一行,把它拽下来(Windows术语里的“复制”),然后你到第二行,把它拽下来,然后你到第七行,把它拽下来。
然后你去......任何地方,粘贴(!)。你得到最后一行(第七行)。按一个快捷键,最后一次粘贴被替换为前面的一行(第二行)。再次......第一行**:)
所以,这样一来,你就不必担心丢失你的内容,从我的理解,这是你的主要问题。

zu0ti5jz

zu0ti5jz7#

Vi(和Vim)的工作方式与普通的文本编辑器(如Gedit)有很大的不同。它的学习曲线也相当陡峭。如果你想学习一些基本的命令,可以从这个交互式教程开始。
然而,回答你的问题。系统剪贴板的内容可以通过加号寄存器访问。因此,要从系统剪贴板粘贴内容,你可以在正常模式下,按:“+p(不是同时,而是一个接一个)。

u5rb5r59

u5rb5r598#

问题是,你不应该“返回插入模式”。
编辑(拖动、删除、替换等)是在正常模式下完成的,插入模式仅用于键入文本。
如果您在插入模式下,并且想要重复使用文件中其他地方已经存在的某些文字,您可以按一下:

  • <C-n><C-p>以插入以光标左侧字符开头的单词
  • <C-x><C-l>,插入以光标左侧的字符开头的行

相关问题