Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Clipboard sharing on Mac OS X is easy

Clipboard sharing on Mac OS X is easy

On the Mac

  1. Make sure you have a clipboard-aware Vim build. I recommend MacVim.

  2. Install or update and start it.

  3. In the Preferences window, activate clipboard synchronization.

  4. Quit

  5. In or, connect to your remote machine with:

     $ ssh -X username@host

    and see the icon pop-up in your Dock.

From now on, will start automatically in the background when you use the -X flag, taking care of the clipboard synchronization for you.

On the remote machine

  1. If you don't already have it, install GVim. On Debian-based systems, use:

     $ sudo apt-get install vim-gtk

    The idea is not to use Gvim but installing it gets you everything you need to get clipboard sharing to work:

    • a minimal X
    • a Vim built with clipboard support
  2. In Vim, synchronize the unnamed and clipboard registers by adding this line to ~/.vimrc:

     set clipboard^=unnamed

My Vim-related gists.

Copy link

MagnusBrzenk commented Aug 13, 2020

This did not work for me. Here were my steps:

brew install macvim
brew cask install xquartz
sudo /opt/X11/bin/Xquartz

Screen Shot 2020-08-12 at 1 17 29 PM

ssh -X username@host # To Ubuntu Server 18.04
sudo apt-get install vim-gtk
echo "set clipboard^=unnamed" >> .vimrc
vim .vimrc # Yank some random text and try to paste in Mac textedit file to no avail

I've tried restarting everything, but it just doesn't work. Any suggestions?

System: OSX Catalina
vim --version:
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Mar 18 2020 18:29:15)
Included patches: 1-1453
Modified by
Compiled by
Huge version with GTK3 GUI. Features included (+) or not (-):

Copy link

romainl commented Aug 13, 2020

Hmm… it worked much better when I wrote that gist.

I just tried on a fresh install of Ubuntu Server 20.04 and…

  • I can paste text from remote Vim into any local app (Vim, TextEdit, Chrome, etc.) via "* (CLIPBOARD),
  • I can paste text from remote Vim into any local app via "+ (PRIMARY),
  • I can't paste text from local pasteboard to remote Vim at all, either via "+ or "*.

This unidirectionality is troubling.

For some reason that I have yet to investigate, installing the package x11-apps on the remote seems to have fixed sharing via CLIPBOARD, which is now fully bidirectional.

I will see if I can manage to have full bidirectionality for CLIPBOARD and PRIMARY.

Copy link

MagnusBrzenk commented Aug 13, 2020

After a TON of trial and error, I got it to work on both Ubuntu Server 18.04 and 20.04. I tried so many things that I eventually lost track of what the winning combo was :( One thing to note is that it worked after I uninstalled XQuartz via homebrew and reinstalled from the downloaded disk image though I'd be surprised if that was the key. I also restarted my computer at some point after that. For reference, here are the salient versions/packages that I had installed when remote-to-local copy/paste started working though, again, I don't know what the winning combo was:

cat /etc/os-release

VERSION="18.04.5 LTS (Bionic Beaver)"
PRETTY_NAME="Ubuntu 18.04.5 LTS"

apt list --installed | grep vim

vim/bionic-updates,bionic-security,now 2:8.0.1453-1ubuntu1.3 amd64 [installed]
vim-common/bionic-updates,bionic-security,now 2:8.0.1453-1ubuntu1.3 all [installed]
vim-gnome/bionic-updates,bionic-security,now 2:8.0.1453-1ubuntu1.3 all [installed]
vim-gtk/bionic-updates,bionic-security,now 2:8.0.1453-1ubuntu1.3 amd64 [installed]
vim-gtk3/bionic-updates,bionic-security,now 2:8.0.1453-1ubuntu1.3 amd64 [installed]
vim-gui-common/bionic-updates,bionic-security,now 2:8.0.1453-1ubuntu1.3 all [installed,automatic]
vim-runtime/bionic-updates,bionic-security,now 2:8.0.1453-1ubuntu1.3 all [installed]
vim-tiny/bionic-updates,bionic-security,now 2:8.0.1453-1ubuntu1.3 amd64 [installed]

apt list --installed | grep x11

libx11-6/bionic-updates,now 2:1.6.4-3ubuntu0.2 amd64 [installed]
libx11-data/bionic-updates,now 2:1.6.4-3ubuntu0.2 all [installed]
libx11-dev/bionic-updates,now 2:1.6.4-3ubuntu0.2 amd64 [installed]
libx11-doc/bionic-updates,now 2:1.6.4-3ubuntu0.2 all [installed,automatic]
libx11-xcb1/bionic-updates,now 2:1.6.4-3ubuntu0.2 amd64 [installed,automatic]
x11-apps/bionic,now 7.7+6ubuntu1 amd64 [installed]
x11-common/bionic-updates,now 1:7.7+19ubuntu7.1 all [installed]
x11-utils/bionic,now 7.7+3build1 amd64 [installed]
x11proto-core-dev/bionic,now 2018.4-4 all [installed,automatic]
x11proto-dev/bionic,now 2018.4-4 all [installed,automatic]
x11proto-fixes-dev/bionic,now 1:2018.4-4 all [installed,automatic]
x11proto-input-dev/bionic,now 2018.4-4 all [installed,automatic]
x11proto-record-dev/bionic,now 2018.4-4 all [installed,automatic]
x11proto-xext-dev/bionic,now 2018.4-4 all [installed,automatic]

/usr/bin/vim --version 

VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Mar 18 2020 18:29:15)
Included patches: 1-1453
Modified by
Compiled by
Huge version with GTK3 GUI.  Features included (+) or not (-):
+acl               +farsi             +mouse_sgr         -tag_any_white
+arabic            +file_in_path      -mouse_sysmouse    +tcl
+autocmd           +find_in_path      +mouse_urxvt       +termguicolors
-autoservername    +float             +mouse_xterm       +terminal
+balloon_eval      +folding           +multi_byte        +terminfo
+balloon_eval_term -footer            +multi_lang        +termresponse
+browse            +fork()            -mzscheme          +textobjects
++builtin_terms    +gettext           +netbeans_intg     +timers
+byte_offset       -hangul_input      +num64             +title
+channel           +iconv             +packages          +toolbar
+cindent           +insert_expand     +path_extra        +user_commands
+clientserver      +job               +perl              +vertsplit
+clipboard         +jumplist          +persistent_undo   +virtualedit
+cmdline_compl     +keymap            +postscript        +visual
+cmdline_hist      +lambda            +printer           +visualextra
+cmdline_info      +langmap           +profile           +viminfo
+comments          +libcall           -python            +vreplace
+conceal           +linebreak         +python3           +wildignore
+cryptv            +lispindent        +quickfix          +wildmenu
+cscope            +listcmds          +reltime           +windows
+cursorbind        +localmap          +rightleft         +writebackup
+cursorshape       +lua               -ruby              +X11
+dialog_con_gui    +menu              +scrollbind        -xfontset
+diff              +mksession         +signs             +xim
+digraphs          +modify_fname      +smartindent       +xpm
+dnd               +mouse             +startuptime       +xsmp_interact
-ebcdic            +mouseshape        +statusline        +xterm_clipboard
+emacs_tags        +mouse_dec         -sun_workshop      -xterm_save
+eval              +mouse_gpm         +syntax
+ex_extra          -mouse_jsbterm     +tag_binary
+extra_search      +mouse_netterm     +tag_old_static
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/usr/share/vim"

... and I use the following in the .vimrc file:

    noremap y "*y:let @+=@*<CR>
    noremap yw "*yw:let @+=@*<CR>
    noremap yiw "*yiw:let @+=@*<CR>
    noremap yy "*yy:let @+=@*<CR>

I'll try and narrow down the exact combo of requirements in the future.

@romainl I find I can paste stuff copied from local into the remote vim by just going into insert mode and using cmd+v.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment