641

Is there any way to copy all lines from open file to clipboard in VI editor. I tried yG but it's not using clipboard to store those lines.

So is it possible?

Vadim Kotov
  • 7,103
  • 8
  • 44
  • 57
Xinus
  • 26,861
  • 26
  • 111
  • 160
  • 1
    Similar questions - http://stackoverflow.com/questions/829935/vim-yank-entire-file & http://stackoverflow.com/questions/3997078/how-to-paste-text-into-vim-command-line#3997110 – user66001 May 11 '14 at 05:38
  • 1
    If you're on Windows and yank doesn't work, see the 17th answer from the top: http://stackoverflow.com/questions/1620018/copy-all-the-lines-to-clipboard/38008065#38008065 – Noumenon Oct 14 '16 at 19:31

26 Answers26

764

Use:

:%y+

to yank all lines.

Explanation:

  • % to refer the next command to work on all the lines
  • y to yank those lines
  • + to copy to the system clipboard

NB: In Windows, + and * are equivalent see this answer.

Jarvis
  • 8,020
  • 3
  • 23
  • 51
Rook
  • 54,867
  • 44
  • 156
  • 233
  • 26
    Plus it won't change cursor location. – mike3996 Dec 03 '10 at 10:56
  • 2
    @guangnan: These registers don't exist in vi; only in vim. Try typing `:help` to ensure you're actually in vim. – Conspicuous Compiler Feb 07 '12 at 21:04
  • 6
    I needed to `set clipboard=unnamed`, but then this worked great! – cdunn2001 Mar 05 '12 at 19:20
  • @ConspicuousCompiler I have the error as Guagnan, and confirmed as VIM, not sure what to do :( – Zach Lysobey Sep 28 '12 at 15:55
  • 1
    @ZachL You are likely running a version of vim without xterm clipboard support or connected via a session without clipboard support. You can see the options that were used when compiling vim by typing `:version`. Odds are, you'll need to install a different package with vim compiled with X support. – Conspicuous Compiler Sep 28 '12 at 22:13
  • 1
    I'm going to use this solution... but I'm going to make a keyboard shortcut to it. This is a better solution, but it's not easier to type. I've been ``gg"+yG`` ing for years now and never been a great solution for me. I'm going to add ``nmap `` to my vimrc. – Goody Apr 17 '14 at 07:53
  • 1
    This worked after I installed the `vim-gnome` package as described in [this answer](http://stackoverflow.com/a/15610365/1727263) – Seth Sep 16 '14 at 02:51
  • 290
    Vim says `E850: Invalid register name`:( – lony Feb 24 '16 at 10:35
  • Works fine for me on mac with VIM 7.3 – James McCormac Jul 07 '16 at 11:17
  • 26
    This solution only works if vim was compiled with the clipboard option (vim --version will show +clipboard in that case). If it wasn't, Brian's solution (:%w !pbcopy) is a solution for Mac. Alternatives are available for other operating systems (e.g. xclip). – yaccob Oct 27 '16 at 09:10
  • This answer worked for me - the accepted answer didn't. On OSX, vim 8.0.46 – Mike W Nov 03 '16 at 10:08
  • Can anyone kindly explain that when to use `"+` and when to use `+` (as in this case) to refer to a register? – minion Jun 12 '17 at 02:07
  • @minion `"+` is a specific register, which means "the system clipboard register", so use `"+` when you want to copy something to paste it outside of vim. – gib Oct 21 '17 at 17:45
  • 1
    For easy copying, for your vimrc you can just do: `nnoremap Y :%y+` (uses Space + Y as that's what I set my leader to, change shortcut as you want). – gib Oct 21 '17 at 17:49
  • 2
    Didn't work on CentOS 7 VPS from Vultr. I get `E850: Invalid register name`. `vi --version` shows me `-clipboard` but I don't know how to enable it and turn it to `+clipboard` – J86 Apr 28 '18 at 13:26
  • If anyone gets `E850` install `sudo apt-get install vim-gnome` – Dragon Ball Jun 03 '19 at 06:30
  • This gets me the same 363 lines yanked and it will only paste line 358... WHY!?! – Nathan McKaskle Aug 18 '20 at 19:00
  • 1
    If anyone getting `E850: Invalid register name` try **:%y"+** to copy all content to the clipboard and **"+p** to paste it – deadLock Nov 02 '20 at 12:26
722

You should yank the text to the * or + registers:

gg"*yG

Explanation:

  • gg to get the cursor to the first character of the file
  • "*y to start a yank command to the register * from the first line, until...
  • G to go the end of the file
NearHuscarl
  • 12,341
  • 5
  • 39
  • 69
Christian C. Salvadó
  • 723,813
  • 173
  • 899
  • 828
  • 9
    How do you mark up the text so it looks like keys? I haven't seen that yet on SO. – jergason Oct 25 '09 at 04:44
  • 14
    Hello... its not working?clipboard data remains unaltered. when I type gg cursor goes to first line... but when I type "*yG ..cpu beeps at * ..so is it normal or some problem with my vim? I am on Ubuntu.. – Xinus Oct 25 '09 at 05:46
  • 2
    Do you have Deadkeys enabled? (e.g., when you hit 'a you get á) If so, you need to press space after `"`. – Tordek Oct 25 '09 at 22:11
  • 152
    Vim can only access the system clipboard if it is compiled with xterm_clipboard enabled. To find out whether you have this feature, run `:version` in vim, and look for the `+xterm_clipboard` flag. If it is preceded by a minus sign, then you won't have this functionality. If this is the case, you might want to compile vim yourself, or run gvim which usually has this feature enabled. – nelstrom Oct 26 '09 at 15:12
  • 1
    @nelstrom: you are right its not installed .. I cannot recompile vim now... I will give it a try.. maybe later .. thanks everyone :) – Xinus Nov 06 '09 at 15:56
  • 10
    The problem with this approach is that it moves the cursor and scrolls the window around. Twice. The [other answer](http://stackoverflow.com/questions/1620018/vi-editor-copy-all-the-lines-to-clipboard/1620030#1620030) has far fewer keystrokes _and_ drawbacks :) – sehe Sep 13 '11 at 07:50
  • 2
    On Ubuntu, if your vim is compiled without the +xterm_clipboard flag, you can install vim-gnome which is compiled with this flag. (https://bugs.launchpad.net/ubuntu/+source/vim/+bug/837882) – Yoav Weiss Jul 12 '12 at 14:41
  • 1
    @AntonyThomas, for OS X you need to compile Vim with clipboard support, the easiest method I could find, is to use homebrew, with the following formula: `brew install https://raw.github.com/Homebrew/homebrew-dupes/master/vim.rb` – Christian C. Salvadó Jul 26 '12 at 15:06
  • 1
    To enable xterm_clipboard flag in Ubuntu, install vim-gnome package – mac Jan 10 '14 at 10:58
  • 1
    To copy selected lines, select the lines with Shift+V and then do "*y – mac Jan 10 '14 at 11:05
  • [CMS](http://stackoverflow.com/users/5445) - Your answer has "accumulated" a few caveats. Can I suggest these be edited into your answer? Also, does your answer apply to both `vi` & `vim` or just `vim`, as the commentor [conspicuous-compiler](http://stackoverflow.com/users/106769) [suggested](http://stackoverflow.com/questions/1620018/1620030#comment11555420_1620030) on [ldigas](http://stackoverflow.com/users/62699) [answer](http://stackoverflow.com/questions/1620018/#1620030) (currently) below. – user66001 May 11 '14 at 05:16
  • This answer works for Putty, whereas @Rook's answer doesn't – Molten Ice Nov 25 '16 at 10:55
  • @sehe the :y+ doesn't work in other scenarios like Vintageous in Sublime Text. gg"*yG works for me in that case. – Aaron Apr 17 '17 at 18:47
  • @BentOnCoding,what's the replacement of VIM? – kittygirl Jan 03 '19 at 02:16
  • As for Mac(High Sierra 10.13.6 (17G65)), I have vim without clipboard support, the '+' register working for me, so the code is `gg"+yG` – zqcolor Aug 02 '19 at 18:29
  • Everytime I use VIM I feel I am entering secret cheat codes <= <= X O => => – Mehdi LAMRANI Dec 27 '19 at 18:06
  • This only seems to get me a single line of text to the clipboard, not all text. I have +xterm_clipboard enabled in vim on Ubuntu 18.04. Why is this not working ever? It only copies and pastes line 358 of 363 lines... why that line? – Nathan McKaskle Aug 18 '20 at 18:54
  • Without vim, c-a,c-c will work. Whats the point of vim, if I have to press this many keys. – R Nanthak Apr 14 '21 at 06:21
  • thanks a lot, I found a lot of approaches but this is the best, simple and easy!!! – Nguyen DN Apr 19 '21 at 01:22
94

on Mac

  • copy selected part: visually select text(type v or V in normal mode) and type :w !pbcopy

  • copy the whole file :%w !pbcopy

  • past from the clipboard :r !pbpaste

Brian
  • 26,298
  • 13
  • 78
  • 84
61

The clipboard is buffer +. To copy to clipboard, do "+y and [movement].

So, gg"+yG will copy the whole file.

Similarly, to paste from clipboard, "+p

Owen Blacker
  • 3,889
  • 2
  • 33
  • 68
Tordek
  • 10,075
  • 3
  • 31
  • 63
  • 4
    Just to add to this (4 years later...), this has a slight drawback in that your cursor position will jump to the top of the file. To avoid this (e.g. if you are mapping this to some shortcut in your vimrc), you can do something like: mqgg"+yG`q – Tom Lord Jul 16 '13 at 15:08
55

Another easy way to copy the entire file if you're having problems using VI, is just by typing "cat filename". It will echo the file to screen and then you can just scroll up and down and copy/paste.

Zack
  • 719
  • 7
  • 8
37

This is what I do to yank the whole file:

ggVGy
Conner
  • 27,462
  • 8
  • 47
  • 72
EmilianoGNFNR
  • 435
  • 4
  • 2
26

You can use "cat" command to open file and use mouse to copy

Pham Luan
  • 343
  • 3
  • 11
12

(in reply to @rshdev, and to avoid having to recompile vim with +xterm_clipboard per @nelstrom in comments on OP)

there's a program called xclip that works like putclip on Ubuntu 11:

:%!xclip -sel clip
u

it's not installed by default. to install, use:

sudo apt-get install xclip
Stew
  • 3,847
  • 5
  • 25
  • 40
  • This works with vi as well, and not just vim. ESC :version On Linux you are probably not running "vi" even if that is what you typed. – Kajukenbo Mar 25 '21 at 02:57
11

On Ubuntu 12

you might try to install the vim-gnome package:

sudo apt-get install vim-gnome

I tried it, because vim --version told me that it would have the flag xterm_clipboard disabled (indicated by - ), which is needed in order to use the clipboard functionality.

-> installing the vim-gnome package on Ubuntu 12 also installed a console based version of vim, that has this option enabled (indicated by a + before the xterm_clipboard flag)

On Arch Linux

you may install vim-clipboard for the same reason.

If you run neovim then you should install xclip (as explained by help clipboard-tool)

ArchLinuxTux
  • 720
  • 1
  • 9
  • 25
  • 1
    http://unix.stackexchange.com/questions/25965/vim-unnamed-register-or?newreg=fe29fa5801a44294aa720c35a6c73d99 is there any other option anybody knows? – Sandip Pingle Feb 06 '14 at 10:51
6

you can press gg to locate your curser to the start of the file,then press yG to copy all the content from the start to end(G located) to buffer.good luck!

gameboy90
  • 173
  • 2
  • 9
5

If you're using Vim in visual mode, the standard cut and paste keys also apply, at least with Windows.

  • CTRLA means "Mark the entire file.
  • CTRLC means "Copy the selection.
  • ESC means "De-select, so your next key press doesn't replace the entire file :-)

Under Ubuntu terminal (Gnome) at least, the standard copy also works (CTRLSHIFTC, although there doesn't appear to be a standard keyboard shortcut for select all (other than ALTE followed by A).

paxdiablo
  • 772,407
  • 210
  • 1,477
  • 1,841
  • 6
    But if you aren't using mswin.vim, then ctrl-a increments the next number on the current line. – Mark Rushakoff Oct 25 '09 at 05:41
  • @Mark, this behavior is from a standard Vim install so I assume that's the default. All bets are off if the environment is configured differently, though if that were the case, I suspect the OP would know what they're doing :-) In either case, OP stated in a comment they were on Ubuntu so the Windows part of my answer probably doesn't apply. The Gnome terminal stuff would. – paxdiablo Oct 25 '09 at 05:47
5

I tried a few of the commands that people have mentioned above. None worked. Then I got hold of the simplest of them all.

Step 1: vi <filename>
Step 2: Right click on the title bar of the Putty window
Step 3: Select "Clear scrollback" (to avoid copying the rest of your SSH session)
Step 4: Right click again and select "Copy all to clipboard".

Noumenon
  • 3,184
  • 4
  • 39
  • 57
Abhinav Deshpande
  • 471
  • 1
  • 6
  • 5
  • 1
    For 15000 line file, this didn't grab it all. I needed to increase my Putty's `Window > Settings > lines of scrollback` to 40000 (also available by right-clicking the title bar). It also helps to use `cat` instead of vi since that scrolls through all the text. – Noumenon Oct 14 '16 at 19:30
  • 1
    I ended up always losing lines from the top and bottom of the file this way. What I do now is cat, then middle-click at the start and end of the file to extend selection. – Noumenon Oct 22 '16 at 22:57
  • When I tried this I only got the 111 lines on the screen but there are 174 lines in my file, so Noumenon's cat answer worked for me – seizethecarp Jan 05 '18 at 17:03
4

:%y a Yanks all the content into vim's buffer, Pressing p in command mode will paste the yanked content after the line that your cursor is currently standing at.

Ma'moon
  • 41
  • 1
4

Do copy the whole file inside the vim or its tabs

y G 

then move to a tab and paste by

p

and to cut the whole file use

d G
4

gVim:

:set go=a

ggVG

See :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.
Conner
  • 27,462
  • 8
  • 47
  • 72
kev
  • 137,128
  • 36
  • 241
  • 259
3

There wasn't a concept of "clipboard" in Bill Joy's vi so I don't think there is a built-in way to do it.

gVim's automatic copy-anything-highlighted-to-the-clipboard feature is easiest or use an external program via :!

For Cygwin's vim I use

:%!putclip
u

Maybe Ubuntu has a CLI app like putclip??

rshdev
  • 351
  • 2
  • 6
  • great suggestion, thanks! there is such a program, called xclip. for details, I posted a separate answer (it would have been too confusing to read from a comment, without the extra newlines and code formatting). – Stew Mar 02 '12 at 15:39
3

Well, all of these approaches are interesting, however as lazy programmer I use yank all line by using combination of number + y

for example you have source code file with total of 78 lines, you can do as below:

  1. gg to get cursor at first line
  2. insert 78 + y --> it yanks 78 lines below your cursor and current line
arfo
  • 211
  • 2
  • 10
3

I have added the following line to my .vimrc

nnoremap <F5> :%y+<CR>

This allows me to copy all text in Vim to the clipboard by pressing F5 (in command mode).

aks
  • 352
  • 4
  • 14
2

If your fingers default to CTRL-A CTRL-C, then try the mappings from $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

I have them mapped to <Leader><C-a> and <Leader><C-c>.

go2null
  • 1,468
  • 1
  • 15
  • 17
2

I know ten years on this should be settled but the first two answers did not work for me so I kept digging. On a Redhat (remote server) - Windows 10 (local machine), if you cannot select the whole thing with a mouse, you are stuck because the usual copies do not work between the remote and the local machine clipboards.

So, to copy on the remote Linux and to paste on the local Windows, specify the primary buffer with the * and do a nice double yank

Use gg" * yy.

Lefty G Balogh
  • 1,447
  • 3
  • 20
  • 35
1

Here's a map command to select all to the clipboard using CTRL+a:

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

Add it to your .vimrc and you're good to go...

jahroy
  • 20,588
  • 9
  • 52
  • 104
1

You can use a shortcur, like this one:

noremap <F6> :%y+<CR>

It means, when you push F6 in normald mode, it will copy the whole file, and add it to the clipboard. Or you just can type in normal mode :%y+ and then push Enter.

1

While many of the above answers are excellent, none of those solutions worked for me because I'm using the default VIM installation which came with Ubuntu 16.04, and it didn't have the clipboard option installed by default. I also wanted to paste the text into an external program.

Solution that worked: Ubuntu's default terminal allows you to highlight the entire contents by pressing Edit then Select All.

user1271772
  • 772
  • 1
  • 12
  • 32
0

I have created a function to perform this action, place it on your ~/.vimrc.

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

OBS: If you are using neovim you also need some clipboard manager like xclip. for more information type in neovim :h checkhealth

It is also important to mention that not always a simple y will copy to the clipboard, in order to make every copy feed + wich is "Clipboard Register" try to set: :set clipboard=unnamed,unnamedplus. For mor information see: :h unnamed.

Here more information on vim wikia.

SergioAraujo
  • 8,735
  • 1
  • 46
  • 37
-1

I couldn't copy files using the answers above but I have putty and I found a workaround on Quora.

  1. Change settings of your PuTTY session, go to logging and change it to "printable characters". Set the log file
  2. Do a cat of the respective file
  3. Go to the file you set in step #1 and you will have your content in the log file.

Note: it copies all the printed characters of that session to the log file, so it will get big eventually. In that case, delete the log file and cat the target file so you get that particular file's content copied on your machine.

thewhitetulip
  • 3,001
  • 3
  • 19
  • 25
-3

Click the left mouse button, drag across the section you want to copy and release. The code automatically gets copied to clipboard.

  • 5
    The file could be huge, and dragging the whole text with a mouse is not productive (nor a `vi` way). – DrBeco Aug 27 '14 at 03:39
  • 2
    Actually this is a good answer and works for me. In my system, environment is v restrictive. I have to cat the output on the screen, and then use mouse to drag, select and release.. then I copy to Windows Notepad++.. and works great. Nothing else works. – Apurva Singh Mar 11 '16 at 17:31
  • It is not copied to clipboard but rather to primary selection, which is not the same. – rubick Oct 29 '20 at 15:08