Vim operations like copying (y), deleting (x, X, D, dd), pasting
(p, P) by default use an inner register which is not related to the
clipboard, so these operations cannot interwork neither with the system’s other
applications nor with Vim’s other instances. Though, it is possible to relate
this two to each other, doing so might not be straightforward and obvious.
The key concept here is to make Vim to use the X11-clipboard as the unnamed register to which it saves what has been yanked (copied), deleted or changed, so another program even other Vim instance can access it to be pasted.
This can only be done, if Vim has support for +clipboard feature which can be
checked with
vim --version | grep clipboard
If there is a -clipboard (with the minus sign), then the feature is not supported.
On Linux, packages like vim-gnome and vim-gtk have this feature
included, so installing any of them should solve this issue e.g.,
sudo apt-get install vim-gnome
On MacOS, there are two ways to make the option available and working.
Brewing Vim with --with-client-server option will let the feature fairly work, but
requires XQuartz running because it needs the X11 forwarding protocol to access the
clipboard. If it is not running when opening Vim for the first time, it will be
started automatically but it takes a while. Moreover, the solution is not complete.
Though, the copy-paste between instances of Vim works fine, interaction with OS-X’s
native applications will work only after starting an XQuartz application, like a
terminal.
# install Vim with +clipboard support
brew install vim --with-client-server
After installing, remember to check if the new version is executed:
which vi, which vim. If not, set PATH or add alias in profile accordingly.
Brewing MacVim in a way to override system Vim will give a better result. This
will not require XQuartz for any reason, and is able to access the system
clipboard in a native way, without X11 (which is not used by default in MacOS).
# install MacVim to support clipboard in a native way
brew install macvim --with-override-system-vim
Installing MacVim this way is intended to substitute the system Vim, so probably
this will be the default for vi or vim after it’s done.
If the clipboard is available, assign the unnamed and unnamedplus registers
to it as seen below. Ddepending on the system, it varies which is the better,
so having both set is a good approach. Adding autoselect also to the
clipboard makes visual Vim selections automatically be available to paste,
without the need to e.g., copy them. See :help clipboard for more
information.
if has('clipboard')
set clipboard=unnamed,unnamedplus,autoselect
endif
Since the clipboard belongs to the windowing system, in case of remote sessions it requires X11 forwarding, even for pure terminal use. Using ssh with option -Y will do it. For example connecting to a Linux running in the virtual machine would look like below.
ssh -Y -p 2222 ubuntu@localhost
In order to make this kind of connection acceptable for a Vagrant virtual
machine, add the following to the Vagrantfile.
# If true, X11 forwarding over SSH connections is enabled. Defaults to false.
config.ssh.forward_x11 = true
If MacOS is the host machine, so it runs the X server (XQuartz), then it
should have all options enabled under Preferences > Pasteboard to have the
feature surely work.
Even without assigning the unnamed register to the X11-clipboard, when X11 forwarding is active, Vim connects to it (except for MacVim). A slow remote connection might cause Vim to connect to the clipboard very slowly, so it results noticable delay in starting. In such annoying cases it might be better to make Vim not to connect to the clipboard.
set clipboard=exclude:.*