ChatGPT解决这个技术问题 Extra ChatGPT

Copy all the lines to clipboard

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?

If you're on Windows and yank doesn't work, see the 17th answer from the top: stackoverflow.com/questions/1620018/…

J
Jarvis

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.


Plus it won't change cursor location.
I needed to set clipboard=unnamed, but then this worked great!
Vim says E850: Invalid register name:(
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).
If anyone getting E850: Invalid register name try :%y"+ to copy all content to the clipboard and "+p to paste it
N
NearHuscarl

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


How do you mark up the text so it looks like keys? I haven't seen that yet on SO.
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..
Do you have Deadkeys enabled? (e.g., when you hit 'a you get á) If so, you need to press space after ".
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.
The problem with this approach is that it moves the cursor and scrolls the window around. Twice. The other answer has far fewer keystrokes and drawbacks :)
B
Brian

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


Works smoothly. An explanation of the commands would be really nice.
@Geo pbcopy is a Mac utility. On Linux, xsel might work instead, or clip on Windows.
This won't work if the file is longer than the height of your terminal.
@SridharSarnobat :%w !pbcopy still works if the file is longer than the height of the terminal.
Oh sorry, I meant over ssh where the client is a Mac and the server is Linux (which I assumed was what the OP was looking for but now that I think about it, that's an unrelated problem). In my defense, I'd avoid vim for copying and pasting for local files, but that's my personal taste. Good tips.
Z
Zack

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.


E603: :catch without :try
And if you want to do that without leaving vim, you can run the following command: :!cat %. And to copy the file's contents programmatically to the clipboard on Mac OS: :!cat % | pbcopy
Needed to copy file from Ubuntu VM on Windows to Debian in GCP opened in browser window... :/ Variations of vim yanking did not work, this worked to paste to Windows then upload file to GCP.
This is straight forward approach, I like it.
"just" scroll up and down a thousand lines.
O
Owen Blacker

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


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
C
Conner

This is what I do to yank the whole file:

ggVGy

I'm afraid this does not answer the question, as you are yanking to the default register, not to the clipboard.
@ConspicuousCompiler it would if he had the clipboard set to copy the yanked text into + though.
@TankorSmash not the quickest (:%y) nor neatest (at least ggyG is better) method though.
@ConspicuousCompiler what is the difference between default register and clipboard?
P
Pham Luan

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


But that wont be the "vi" way, if file is huge then also it will be a problem... This might work but not a suggested way...
reset the terminal beforehand, then select all and copy. This works through ssh session.
Fastest way for large files (under 10 thousand lines) in different remote servers if xterm_clipboard is unavailable
easy and simple solution
S
Stew

(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

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.
To avoid having to type u after the command, just insert a w after the % like so :%w !xclip -sel clip
M
Marcus Mönius

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)


unix.stackexchange.com/questions/25965/… is there any other option anybody knows?
g
gameboy90

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!


p
paxdiablo

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).


But if you aren't using mswin.vim, then ctrl-a increments the next number on the current line.
@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.
A
Abdul Basit

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

M
Ma'moon

:%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.


C
Conner

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.

N
Noumenon

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".


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.
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.
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
r
rshdev

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??


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).
a
arfo

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:

gg to get cursor at first line insert 78 + y --> it yanks 78 lines below your cursor and current line


a
aks

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).


E850: Invalid register name on Ubuntu 18.04 and Vim 7.4
g
go2null

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>.


j
jahroy

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...


L
Lefty G Balogh

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.


Ubuntu Vim 7.4 doesn't work, it only yanks the very first line, but doesn't put all lines into clipboard
Ubuntu Vim 7.4 doesn't work, it only yanks the very first line, but doesn't put all lines into clipboard in :version I have "-xterm_clipboard". After installed vim-gnome Vim 8.0 with :version +xterm_clipboard also doesn't work
N
Nicolas Pardo

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.


P
Pearson

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.


S
SergioAraujo

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.


s
smeric

I use Vim in PowerShell and when I needed to copy a short block of code to windows clipboard;

I use :set nonumber to remove line numbers, then select the code visually with cursor and right click. Then I paste it to where ever I want with Ctrl + V.


t
thewhitetulip

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

Change settings of your PuTTY session, go to logging and change it to "printable characters". Set the log file Do a cat of the respective file 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.


K
Kapeel Kokane

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


The file could be huge, and dragging the whole text with a mouse is not productive (nor a vi way).
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.
It is not copied to clipboard but rather to primary selection, which is not the same.