Is it possible to copy to clipboard directly from Vim? yy only copies stuff to Vim's internal buffer. I want to copy to the OS's clipboard. Is there any such command in Vim or you can only yank stuff within Vim?
Is it possible to copy to clipboard directly from Vim? yy only copies stuff to Vim's internal buffer. I want to copy to the OS's clipboard. Is there any such command in Vim or you can only yank stuff within Vim?
For Ubuntu - July 2018
Use the register "+ to copy to the system clipboard (i.e. "+y instead of y).
Likewise you can paste from "+ to get text from the system clipboard (i.e. "+p instead of p).
You have to also make sure that vim is compiled with support for the clipboard. Try:
vim --version | grep .xterm_clipboard -o
and if it's -xterm_clipboard (a minus prefix) then you do not have support.
Here are some instructions for swapping out with a working version of vim that has clipboard support.
$ sudo apt-get purge vim
$ sudo apt-get autoremove (removes any extraneous vim dependency packages from system)
$ sudo apt-get install vim-gnome (or `sudo apt-get install vim-gtk3` for newer Ubuntu versions)
Check again with vim --version | grep .xterm_clipboard -o and you can confirm the clipboard is now available (ie. +xterm_clipboard)
I wasn't able to copy to my clipboard's system because I had this in my ~/.vimrc file:
if has('mouse')
set mouse=a
endif
But if you add this line next, it will allow you to simply Ctrl+c to get whatever you have selected into your clipboard.
vmap <C-c> "+y
Original discussion and more details: Copy text out of vim with set mouse=a enabled
This answer contains details specific to macOS users.
Append the following line to ~/.vimrc:
set clipboard=unnamed
If this does not work, check if your installed version maybe has the clipboard feature not enabled. When this answer was written (2019), the default vim shipped with macOS did not come with clipboard option enabled. You need that option to access the system clipboard.
To check if your vim has that option enabled use the below command
vim --version | grep clipboard
In the result, you should have +clipboard. If it is -clipboard, then your VIM does NOT have the option to access the system clipboard.
You need to MAKE and install your VIM with the option you need. Following are the commands.
# Create the directories you need
$ sudo mkdir -p /opt/local/bin
# Download, compile, and install the latest Vim
$ cd ~
$ git clone https://github.com/vim/vim.git
$ cd vim
$ ./configure --prefix=/opt/local
$ make
$ sudo make install
# Add the binary to your path, ahead of /usr/bin
$ echo 'PATH=/opt/local/bin:$PATH' >> ~/.bash_profile
# Reload bash_profile so the changes take effect in this window
$ source ~/.bash_profile"
The above will install the latest VIM with the option +clipboard enabled.
Now you can yank text to system clipboard. Below steps explains how to yank.
press v, this will switch you to VISUAL mode.Press y, this will copy the selected text to clipboard.CMD + v to paste.I use MACBook Pro with macOS Mojave and the above works in it.
This question already has a lot of answers. I am adding my way which I think is quick.
Quickly, you can press V (Shift + v) to active visual mode. In visible mode, you can use j and k to select the text you want to copy. After selection, use
"*y
Now, selected text is copied to clipboard.
You can find the answers here Arch Wiki
For Linux:
First of all you have to enable Clipboard in your vim version by installing
gvim.
Next you have to put this line on your .vimrc file.
set clipboard=unnamedplus
I have been using these for many years now:
nnoremap Y "+y
vnoremap Y "+y
nnoremap yY ^"+y$
You can now just use upper case Y to copy to clipboard, and lowercase y won't be affected e.g. as by set clipboard=unnamed so you can still choose if the copy will go to the clipboard or not.
Tested on ubuntu 21.04, vim 8.2.
If you have xclip an easy way of copying text to the clipboard is as follows:
y command in vanilla vim):call system("xclip -selection clipboard", @"):call system() runs a terminal command. It takes two arguments, the first the command, the second what to pipe to that command. For example :echom system("head -1", "Hello\nWorld") returns Hello (With some padding). echom returns the output of a command, call doesn't.
xclip -selection clipboard just copies text into the system clipboard as opposed to the default X clipboard, (Accessed by the middle moue button).
@" returns the last yanked text. " is the default register, but you could use any register. To see the contents of all registers, type :registers.
I've been struggling with this for months till now on MacOsX using keyboard shortcuts. I know question isn't about using keyboard shorts. But this might help someone with the same concern.
I found that if you uncheck:
View -> Allow Mouse Reporting
from Terminal menu, you'll be able to copy to clipboard using
command + c
again.
I'm a Vim newby but, to copy all the text to system clipboard (e.g if you want to paste it to a word processor or another text editor like gedit, mousepad etc...), in normal mode:
ggVGy
or, more simply:
:%y
As suggested, I also installed vim-gtk and put
set clipboard=unnamedplus
in my .vimrc
and everything works fine
If you want to copy only a portion of text, use visual mode (v), select the text you want to copy and press y.
Finally, I suggest a clipboard program like Clipman (my favorite), Clipit, Parcellite or similar.
(I'm using vim 8.0 in Debian Stretch Xfce)
FORGIVE ME FOR MY ENGLISH! :-)
My solution was putting the following line to .vimrc:
map <C-y> :w !xclip -sel c <CR><CR>
The script copies the selected line (trough visual mode) or the file content (if none is selected) to the clipboard using Ctrl + y. I'm using Manjaro Linux if that matters.
I had issue because my vim was not supporting clipboard:
vim --version | grep clip
-clipboard +insert_expand +path_extra +user_commands
+emacs_tags -mouseshape +startuptime -xterm_clipboard
I installed vim-gnome (which support clipboard) and then checked again:
vim --version | grep clipboard
+clipboard +insert_expand +path_extra +user_commands
+emacs_tags +mouseshape +startuptime +xterm_clipboard
Now I am able to copy and paste using "+y and "+p respectively.
I'm on mac osx (10.15.3) and new to vim. I found this so frustrating and all the answers on here too complicated and/or didn't apply to my situation. I ended up getting this working in 2 ways:
key mapping that uses pbcopy: works on the old version of vim that ships with mac.
Add
vmap '' :w !pbcopy<CR><CR>to your ~/.vimrc
Now you can visually select and hit''(two apostrophes) to copy to clipboard
Install newer version of vim so I can access the solution most recommended in other answers:
brew install vim
alias vim=/usr/local/bin/vim(should add this to your ~/.bashrc or equivalent)
Now you can visually select and hit"+yyto copy to clipboard
for OSX, like the 10342 answers above made clear, you need to make sure that vim supports the clipboard feature, said the the one that comes pre-shipped with OSX does NOT support clipboard, and that if you run
brew install vim it would work.
Except that running vi will still make you run the preshipped OSX version, not the one you installed from brew.
to get over this, I simply aliased my vim command to the brew version, not the OSX default one:
alias vim="/usr/local/Cellar/vim/8.0.1100_1/bin/vim"
and now i'm golden
In my instance selecting text by highlighting (clicking and dragging) with my mouse was causing vim to enter into visual mode.
On a mac anyway, the easiest solution is to use fn + mouse click and drag to avoid entering into visual mode.
If you wish to avoid this behavior by default you can edit your vimrc
I have struggled a lot in copying to clipboard. Inside Vim it is quite simple using visual mode but if you want to copy to the clipboard things are quite messsed. I have simple method of copying using xclip utility. For this you must have to install xclip first.
for the whole file it is very simple
xclip -sel clip filename
but if you want to copy only a particular range of line numbers
tail -n +[n1] filename | head -n [n2] | xclip -sel clip
you can make use of ~/.bashrc to simplify this
#rangecp copy lines from n1 to n2 from a given file to clipboard
function rangecp()
{
if [ -f $1 ]
then
if [ ! -z $3 ]
then
diff=$(($3 - $2 + 1))
#diff=`expr $3 - $2 + 1`
tail -n +$2 $1 | head -n $diff | xclip -sel clip
elif [ ! -z $2 ]
then
tail -n +$2 $1 | xclip -sel clip
else
echo "Provide a range from [n1] lines to [n2] lines"
fi
else
echo "[ $1 ] file doesn't exist"
fi
}
then
source ~/.bashrc
How to use
rangecp filename.txt 50 89
rangecp filename.txt 50
I saw many answers on this question and the way to make this work was a combination of many.
The steps I followed to make vim copy to system clipboard are
sudo apt remove vim. (I was too lazy to find how to re-compile it with the +clipboard support.sudo apt install vim-athena that ships with +clipboard.~/.vimrc the following line: set clipboard=unnamedplus.source %.Note: I am using Ubuntu 20.04.
Besides vim-gnome, "+y is also supported by default in neovim on Ubuntu 20.04.
If you don't want to install a new program, you could always do the lazy method of cat file.txt or gedit file.txt and copy from there.
Nothing above worked for me on my windows laptop.
Ctrl+C was fine for copying.. but I needed Shift+Insert to Paste !
(A good reason to always get a laptop where Insert can always be accessed without pressing a secondary key)
Shift+Ctrl+C if you are in graphical mode of Linux, but first you need to select what you need to copy.
In linux with gnome (ubuntu, xubuntu etc) install vim-gnome and you will be able to use VISUAL to select and then Ctrl + C normally and paste in other applications with Ctrl + V
sudo apt install vim-gnome
For Mac OS X, in the terminal:
vim --version | grep clipboard to check if the clipboard is enabled(with +)if has("clipboard")
set clipboard=unnamed " copy to the system clipboard
if has("unnamedplus") " X11 support
set clipboard+=unnamedplus
endif
endif
I want to supplement a way to copy the line to the clipboard and use it on the function.
here is an example that you open the URL in the browser
let g:chrome_exe = 'C:/.../Google/Chrome/Application/chrome.exe'
function OpenURL()
" copy the line and put it in the register *
normal "*yy
:execute "silent !start ".g:chrome_exe." ".getreg("*")
endfunction
map ,url :call OpenURL()<CR>