复制所有行到剪贴板。

772

在VI编辑器中有没有一种方法可以将打开文件的所有行复制到剪贴板中。我尝试使用yG,但它没有使用剪贴板来存储这些行。

那么,这是否可能呢?


1
类似的问题 - https://dev59.com/PXRA5IYBdhLWcg3wyBD1 和 https://dev59.com/YW865IYBdhLWcg3wFqdV - user66001
1
如果你在Windows上使用yank无法工作,请参考顶部第17个答案:https://dev59.com/LnI-5IYBdhLWcg3w6c-1#38008065 - Noumenon
28个回答

927
使用:
使用%y+来复制所有行。
解释:
- %用于将下一个命令应用于所有行。 - y用于复制这些行。 - +用于复制到系统剪贴板。
注意:在Windows中,+*是等效的请参考此答案
如果出现E850: Invalid register name错误,请尝试使用:%y"+将所有内容复制到剪贴板,然后使用"+p进行粘贴(感谢@deadLock)。

30
此句意为“此外,它不会更改光标位置”。 - mike3996
7
我需要执行set clipboard=unnamed命令,但之后这个功能运作得很好! - cdunn2001
451
Vim显示E850:非法的寄存器名称:(。 - lony
31
只有在安装了 vim 的 clipboard 选项(运行 vim --version 可以看到 +clipboard)的情况下,这个解决方案才可行。如果没有安装该选项,则 Brian 的解决方案(:%w !pbcopy)适用于 Mac。其他操作系统可以使用其他替代方案(例如 xclip)。 - yaccob
45
如果出现“E850:无效的寄存器名称”错误,请尝试使用 :%y"+ 命令将所有内容复制到剪贴板,然后使用 "+p 命令将其粘贴。请注意,不要改变原始意思。 - deadLock
显示剩余16条评论

801

你应该将文本yank到*+ 寄存器中:

gg"*yG

解释:

  • gg 将光标移动到文件的第一个字符
  • "*y 开始一个yank命令,将从第一行开始直到最后一行的文本复制到寄存器*中...
  • G 跳转到文件的结尾

12
你如何标记文本使其看起来像是键值?我在 Stack Overflow 上还没有看到过这样的方法。 - Jamison Dance
19
你好...不能工作吗?剪贴板数据保持不变。当我输入"gg"时,光标跳到第一行...但是当我输入"*yG"时,CPU会发出蜂鸣声..这正常吗?还是我的vim存在问题?我在Ubuntu上。 - Xinus
2
你启用了Deadkeys吗?(例如,当您按下'a时,会得到á)如果是这样,您需要在“`”后按空格。 - Tordek
167
只有启用了xterm_clipboard功能的Vim才能访问系统剪贴板。要查看您是否具有此功能,请在vim中运行“:version”,并查找“+xterm_clipboard”标志。如果前面有一个减号,则表示您没有此功能。如果是这种情况,您可能需要自己编译Vim,或者运行通常已启用此功能的gvim。 - nelstrom
10
这种方法的问题在于它会两次移动光标和滚动窗口。而另一个回答则打出的按键更少,且没有这些缺点 :) - sehe
显示剩余14条评论

111

在Mac上

  • 复制选定部分:可视选择文本(在正常模式下输入 vV),然后键入:w !pbcopy

  • 复制整个文件 :%w !pbcopy

  • 从剪贴板粘贴 :r !pbpaste


7
运行顺畅。解释一下命令会非常好。 - Vlad Manuel Mureșan
8
@Geo pbcopy是Mac操作系统的一个实用程序。在Linux上,可能可以使用xsel替代,而在Windows上则可以使用clip - David Lord
1
如果文件长度超过终端的高度,这将无法工作。 - Sridhar Sarnobat
1
如果文件长度超过终端的高度,则 @SridharSarnobat 的命令 :%w !pbcopy 仍然有效。 - Adrian Schmidt
哦,抱歉,我的意思是通过ssh,在客户端为Mac,服务器为Linux的情况下(我认为这就是OP所寻找的,但现在我想想,那是一个无关的问题)。为了辩护自己,我会避免使用vim来复制和粘贴本地文件,但那只是我的个人喜好。好的建议。 - Sridhar Sarnobat

92

如果你使用 VI 遇到问题,另一种简单的复制整个文件的方法就是只需键入 "cat 文件名"。 它会将文件输出到屏幕上,然后您只需上下滚动并复制/粘贴即可。


2
E603: :catch没有:try。 - Paul Chris Jones
2
如果你想在不离开vim的情况下执行此操作,可以运行以下命令::!cat %。在Mac OS上将文件内容以编程方式复制到剪贴板的方法是::!cat % | pbcopy - TanguyP
需要将Ubuntu虚拟机上的文件复制到在浏览器窗口中打开的GCP上的Debian... :/ 不同的vim yanking变体都不起作用,这种方法可以将文件粘贴到Windows,然后上传到GCP。 - frmbelz
这是一种直截了当的方法,我喜欢它。 - Abdul Salam
21
只需要向上或向下滚动一千行。 - Albert van der Horst

67

剪贴板是一个缓冲区+。要复制到剪贴板,请执行"+y和[移动]。

因此,gg"+yG将复制整个文件。

类似地,要从剪贴板粘贴,使用"+p


4
仅作补充(4年之后……),这有一个小缺点,即您的光标位置会跳到文件顶部。为避免这种情况(例如,如果您将其映射到vimrc中的某个快捷方式),您可以执行以下操作:mqgg"+yG`q - Tom Lord

52

这是我用来复制整个文件的方法:

ggVGy

23
很抱歉,您所提供的答案并没有回答问题,因为您是将内容拉到默认寄存器而不是剪贴板。 - Conspicuous Compiler
2
@ConspicuousCompiler 如果他将“剪贴板”设置为将取出的文本复制到“+”中,那就可以了。 - TankorSmash
2
@TankorSmash 不是最快的方法(:%y),也不是最整洁的方法(至少ggyG更好)。 - pedroapero
1
@ConspicuousCompiler 什么是“默认寄存器”和“剪贴板”的区别? - nilon

46
你可以使用 "cat" 命令打开文件,并用鼠标复制。

6
但这不是 "vi" 的方式,如果文件很大,那么这也会成为一个问题...这可能有效,但不建议这样做... - Aditya
1
事先重置终端,然后选择全部并复制。这适用于通过SSH会话操作。 - arcol
1
如果xterm_clipboard不可用,处理不同远程服务器上大文件(小于10,000行)的最快方法是什么? - Matias Haeussler
简单易行的解决方案 - balaji dileep kumar

12

在Ubuntu 12上

你可以尝试安装vim-gnome软件包:

sudo apt-get install vim-gnome

我尝试了一下,因为vim --version告诉我将会禁用标志xterm_clipboard(由-表示),而这是使用剪贴板功能所需的。

在Ubuntu 12上安装vim-gnome软件包也会安装基于控制台的Vim版本,该选项已启用(在xterm_clipboard标志之前有+

在Arch Linux上

出于同样的原因,您可以安装vim-clipboard

如果您运行neovim,则应安装xclip(如help clipboard-tool所述)


1
有其他选项吗? - Sandip Pingle

12

(回复@rshdev,并为了避免像OP评论中@nelstrom所说的那样必须重新编译带有+xterm_clipboard的vim)

在Ubuntu 11上,有一个名为xclip的程序可以像putclip一样工作:

:%!xclip -sel clip
u

默认情况下它未安装。若要安装,请使用:

sudo apt-get install xclip

这也适用于vi,而不仅仅是vim。ESC:version 在Linux上,即使您键入了“vi”,您可能也没有运行它。 - Kajukenbo
为了避免在命令后输入“u”,只需在“%”后插入“w”,如下所示:“:%w!xclip -sel clip” - Chris Robinson

8
请复制整个文件到vim或其选项卡中。
y G 

然后切换到一个标签页,并通过

粘贴。
p

要删除整个文件,请使用以下命令:

d G

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