将所有行复制到剪贴板


564

有什么方法可以在VI编辑器中将所有行从打开的文件复制到剪贴板。我试过了,yG但是没有使用剪贴板存储这些行。

那有可能吗?



1
如果您使用的是Windows,并且无法执行yank,请从顶部查看第17个答案:stackoverflow.com/questions/1620018/…–
Noumenon

Answers:


635

您应该将文本拖到*+ 注册

gg"*yG

说明:

  • gg 将光标移到文件的第一个字符
  • "*y*从第一行开始向寄存器发送yank命令,直到...
  • G 去文件的结尾

6
您如何标记文本,使其看起来像键?在SO上我还没有看到。
jergason,2009年

10
您好...它不起作用?剪贴板数据保持不变。当我键入gg时,光标移到第一行...但是当我键入“ * yG ..cpu于* ..发出蜂鸣声时,这是正常现象还是vim出现问题?我在Ubuntu上..
Xinus 2009年

1
您是否启用了死键?(例如,当您按'a时,您会得到á)如果是,则需要在之后按空格"
Tordek

144
如果Vim在启用xterm_clipboard的情况下编译,则只能访问系统剪贴板。要确定您是否具有此功能,请:version在vim中运行,然后查找该+xterm_clipboard标志。如果它前面带有减号,则您将没有此功能。在这种情况下,您可能需要自己编译vim或运行通常启用了此功能的gvim。
纳尔斯特罗姆,

9
这种方法的问题在于它会移动光标并滚动窗口。两次。在其他的答案已经远远较少的按键缺点:)
sehe

696

采用:

:%y+

拉动所有行。

说明:

  • % 引用下一条命令在所有行上工作
  • y 拉那些线
  • + 复制到系统剪贴板

:在Windows中,+而且*是等效的看到这个答案


19
另外,它不会更改光标位置。
nperson325681 2010年

1
@guangnan:这些寄存器在vi中不存在;仅在vim中。尝试输入:help以确保您确实在vim中。
出色的编译器

6
我需要set clipboard=unnamed,但随后效果很好!
cdunn2001 2012年

234
Vim说E850: Invalid register name:(
lony

23
仅当使用剪贴板选项编译vim时,此解决方案才有效(在这种情况下,vim --version将显示+ clipboard)。如果不是这样,则Brian的解决方案(:%w!pbcopy)是Mac的解决方案。其他操作系统(例如xclip)也可以使用替代方法。
yaccob

90

在Mac上

  • 复制所选部分:直观地选择文本(键入vV在正常模式下)并键入:w !pbcopy

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

  • 从剪贴板过去 :r !pbpaste


6
工作顺利。命令的解释将非常好。
Vlad Manuel Mureșan

5
@Geo pbcopy是Mac实用程序。在Linux上,xsel也许可以代替,或者clip在Windows上。
David Lord

1
如果文件的长度超过终端的高度,则此方法将无效。
Sridhar Sarnobat

1
:%w !pbcopy如果文件比终端的高度长,@ SridharSarnobat 仍然可以工作。
阿德里安·施密特

哦,对不起,我的意思是在ssh上,客户端是Mac,服务器是Linux(我假设这是OP所寻找的,但是现在我考虑了一下,这是一个不相关的问题)。为了辩护,我避免使用vim复制和粘贴本地文件,但这是我的个人喜好。好提示。
Sridhar Sarnobat,

56

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

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

同样,要从剪贴板粘贴, "+p


4
只是添加了此内容(4年后...),这有一个小缺点,因为您的光标位置将跳到文件的顶部。为了避免这种情况(例如,如果您将其映射到vimrc中的某些快捷方式),则可以执行以下操作:mqgg“ + yG`q
Tom Lord

45

如果在使用VI时遇到问题,则复制整个文件的另一种简便方法是仅键入“ cat filename”。它将回显文件到屏幕,然后您可以上下滚动并复制/粘贴。


1
E603::catch不使用:try
Paul Chris Jones,

2
如果要在不离开vim的情况下执行此操作,则可以运行以下命令::!cat %。并以编程方式将文件的内容复制到Mac OS上的剪贴板::!cat % | pbcopy
TanguyP,

需要从Windows上的Ubuntu VM复制文件到在浏览器窗口中打开的GCP中的Debian ...:// vim yanking的变体不起作用,这可以粘贴到Windows,然后将文件上传到GCP。
frmbelz

31

这是我要提取整个文件的操作:

ggVGy

12
恐怕这不能解决问题,因为您要使用默认寄存器,而不是剪贴板。
出色的编译器,2010年

2
@ConspicuousCompiler,如果他有将clipboard复制的文本复制到其中的设置+
TankorSmash 2014年

@TankorSmash既不是最快的(:%y)也不是最快的(至少ggyG更好)方法。
pedroapero

@ConspicuousCompiler 默认寄存器剪贴板有什么区别?
尼龙

17

您可以使用“ cat”命令打开文件并使用鼠标进行复制


5
但这不会是“ vi”方式,如果文件很大,那也将是一个问题...这可能有用,但不是建议的方式...
Aditya '18

1
reset终端,然后全选并复制。这可以通过ssh会话进行。
Arcol

如果xterm_clipboard不可用,则是在不同的远程服务器中处理大文件(低于1万行)的最快方法
Matias Haeussler 19/12/14

10

(作为对@rshdev的回复,并避免在OP的注释中每个@nelstrom用+ xterm_clipboard重新编译vim)

在Ubuntu 11上有一个名为xclip的程序,其功能类似于putclip:

:%!xclip -sel clip
u

默认情况下未安装。安装,使用:

sudo apt-get install xclip

10

在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
unix.stackexchange.com/questions/25965/… 还有其他人知道的其他选择吗?
Sandip Pingle 2014年

6

如果在可视模式下使用Vim,则至少在Windows中也适用标准的剪切和粘贴键。

  • CTRLA 表示“标记整个文件。
  • CTRLC 表示“复制选择。
  • ESC 表示“取消选择,因此下一次按键不会替换整个文件:-)

至少在Ubuntu终端(Gnome)下,标准副本也可以使用(CTRLSHIFTC,尽管select allALTE后面没有)似乎没有标准的键盘快捷键A


6
但是,如果您不使用mswin.vim,则ctrl-a将增加当前行中的下一个数字。
Mark Rushakoff 09年

@Mark,此行为来自标准的Vim安装,因此我认为这是默认设置。如果环境配置不同,那么所有的赌注都不会成立,尽管如此,我怀疑OP会知道他们在做什么:-)在这两种情况下,OP都在评论中指出它们在Ubuntu上,因此Windows的一部分我的答案可能不适用。Gnome终端的东西会。
paxdiablo

5

您可以按gg键将光标定位到文件的开头,然后按yG键将所有内容从头到尾(位于G位置)复制到缓冲区。祝您好运!


4

我尝试了上面人们提到的一些命令。没有工作。然后我掌握了所有这些中最简单的一种。

步骤1:vi <filename>
步骤2:右键单击Putty窗口的标题栏
步骤3:选择“清除滚动”(以避免复制其余的SSH会话)
步骤4:再次右键单击并选择“全部复制到剪贴板”。


1
对于15000行文件,这并不能全部抓住。我需要将腻子的数量Window > Settings > lines of scrollback增加到40000(也可以通过右键单击标题栏获得)。它也有助于cat代替vi,因为它可以滚动浏览所有文本。
Noumenon

1
我最终总是以这种方式从文件的顶部和底部丢失行。我现在要做的是cat,然后在文件的开头和结尾处单击鼠标中键以扩展选择范围。
Noumenon

当我尝试此操作时,屏幕上只有111行,但是我的文件中只有174行,因此Noumenon的猫回答对我
有用

3

:%y a将所有内容提取到vim的缓冲区中,p在命令模式下按将粘贴的内容粘贴到光标当前所在的行之后。


3

gVim:

:set go=a

ggVG

:help go-a

'a' Autoselect:  If present, then whenever VISUAL mode is started,
 or the Visual area extended, Vim tries to become the owner of
 the windowing system's global selection.  This means that the
 Visually highlighted text is available for pasting into other
 applications as well as into Vim itself.  When the Visual mode
 ends, possibly due to an operation on the text, or when an
 application wants to paste the selection, the highlighted text
 is automatically yanked into the "* selection register.
 Thus the selection is still available for pasting into other
 applications after the VISUAL mode has ended.
     If not present, then Vim won't become the owner of the
 windowing system's global selection unless explicitly told to
 by a yank or delete operation for the "* register.
 The same applies to the modeless selection.

3

好吧,所有这些方法都很有趣,但是作为懒惰的程序员,我使用数字+的组合来全部抽出 y

例如,您的源代码文件共有78行,则可以执行以下操作:

  1. gg 在第一行获得光标
  2. 插入78 + y ->它会在您的光标和当前行下方拖动78行

2

Bill Joy的vi中没有“剪贴板”的概念,因此我认为没有内置的方法可以做到这一点。

gVim的自动将任何内容突出显示到剪贴板的功能是最简单的,或者通过:!使用外部程序!

对于Cygwin的vim,我使用

:%!putclip
u

也许Ubuntu有一个像putclip这样的CLI应用程序?


很好的建议,谢谢!有一个名为xclip的程序。有关详细信息,我发布了一个单独的答案(如果没有多余的换行符和代码格式,那么从注释中读取该内容将太令人困惑了)。
炖2012年

2

如果您的手指默认为CTRL-A CTRL-C,请尝试从进行映射$VIMRUNTIME/mswin.vim

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y

" CTRL-A is Select all
noremap <C-A> gggH<C-O>G
inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
cnoremap <C-A> <C-C>gggH<C-O>G
onoremap <C-A> <C-C>gggH<C-O>G
snoremap <C-A> <C-C>gggH<C-O>G
xnoremap <C-A> <C-C>ggVG

我将它们映射到<Leader><C-a><Leader><C-c>



2

我在.vimrc中添加了以下行

nnoremap <F5> :%y+<CR>

这使我可以通过按F5(在命令模式下)将Vim中的所有文本复制到剪贴板。


1

这是一个映射命令,可使用CTRL+ 选择全部到剪贴板a

"
" select all with control-a
"
nnoremap <C-a> ggmqvG"+y'q

将其添加到您的.vimrc中,您就可以开始了...


1

我知道十年应该解决,但是前两个答案对我没有用,所以我一直在研究。在Redhat(远程服务器)-Windows 10(本地计算机)上,如果无法用鼠标选择整个对象,则会卡住,因为通常的副本在远程和本地计算机剪贴板之间不起作用。

因此,要在远程Linux上复制并粘贴在本地Windows上,请使用 *并进行两次不错的操作

使用gg" * yy


0

我创建了一个函数来执行此操作,将其放在您的上~/.vimrc

fun! CopyBufferToClipboard()
    %y+
endfun
nnoremap <Leader>y :call CopyBufferToClipboard()<CR>
command! -nargs=0 CopyFile :call CopyBufferToClipboard()

OBS:如果您使用的是neovim,则还需要一些剪贴板管理器,例如xclip。有关更多信息,请输入neovim:h checkhealth

还要指出的是,并非总是简单地y将复制到剪贴板,以便使每个复制源+都设置为“剪贴板注册”,请尝试设置::set clipboard=unnamed,unnamedplus。有关更多信息,请参见::h unnamed

这里有更多关于vim wikia的信息。


-1

单击鼠标左键,在要复制和释放的部分上拖动。该代码会自动复制到剪贴板。


3
该文件可能很大,并且用鼠标拖动整个文本没有效果(也不vi可行)。
Beco博士

1
实际上,这是一个很好的答案,对我有用。在我的系统中,环境v受限制。我必须在屏幕上显示输出,然后使用鼠标拖动,选择和释放..然后将其复制到Windows Notepad ++ ..,效果很好。没有其他办法。
阿普尔瓦·辛格

-1

我无法使用上述答案复制文件,但腻子很浓,我在Quora上找到了解决方法。

  1. 更改您的PuTTY会话的设置,转到日志记录并将其更改为“可打印的字符”。设置日志文件
  2. 做相应文件的猫
  3. 转到您在步骤1中设置的文件,您的内容将在日志文件中。

注意:它将该会话的所有打印字符复制到日志文件,因此最终会变大。在这种情况下,请删除日志文件并删除目标文件,以便将特定文件的内容复制到计算机上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.