Tmux and Vim: Copy and Paste on macOS Sierra

22 March 2017

As a developer, more than anything, you copy and paste things. Making copy and paste work in properly with Vim and Tmux is, unfortunately, not trivial.

There’s a lot of information to be found on the internet about setting up copy and paste with Tmux. There’s also lots of information on how to setup Vim. But then you run Vim 8. On macOS Sierra. And things break down quickly.

This short guide helps you setup Tmux and Vim on macOS Sierra for proper copy pasting glory!

Dependencies

First, you’ll have to install one dependency. I also recommend you install the latest and greatest Vim instead of using the (old) version bundled with macOS, and of course, tmux.

brew install reattach-to-user-namespace
brew install vim tmux 

Configure Tmux

Tmux is a weird beast. Copy and pasting can be done in different ways, but I prefer the Vim style navigation.

# Configure your default shell, Zsh in my case.
set -g default-shell $SHELL 

# Override the default command to use `reattach-to-user-namespace` for everything.
set -g default-command "reattach-to-user-namespace -l ${SHELL}"

# Remap prefix to ctrl-a (or caps-a for my mac)
set -g prefix C-a

# Vim style navigation in copy mode
setw -g mode-keys vi

# Setup 'v' to begin selection, just like Vim
bind-key -t vi-copy v begin-selection

# Setup 'y' to yank (copy), just like Vim
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

# Update default binding of `Enter` to also use copy-pipe
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"

# Bind ']' to use pbbaste
bind ] run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

This is how copy pasting will working after you’ve made the proper changes to your .tmux.conf. Note that I have remapped ctrl + b to ctrl + a, because that works pretty fast when you’ve already remapped Caps-Lock to Control.

Pasting works just as before:

Congratulation, you can now copy and paste with Tmux.

Configure Vim

The changes needed for Vim are minimal. All you need to do is unset the name of the default clipboard, so it will pass through to Tmux. In ~/.vimrc:

" Clipboard 
set clipboard=unnamed

Bonus features

So, copy and paste is now working from Vim, Tmux and Vim-in-Tmux. Pasting is also working as expected.

As a bonus, when you have two tmux panes or windows with different instances of Vim running, you can now easily copy and paste between them by using normal Vim commands!

Conclusion

Copy and paste with Vim and Tmux does not work out of the box, but once setup works like a charm.

Here are links to my ~/.vimrc and ~/.tmux.conf for your perusal.

I highly recommend tmux 2: Productive Mouse-Free Development, but feel free to check all my book recommendations.