Add post: tmux vim copy and paste

This commit is contained in:
Ariejan de Vroom 2017-03-22 21:57:03 +01:00
parent e44e08c8f5
commit 6242650096

View File

@ -0,0 +1,91 @@
+++
date = "2017-03-22"
title = "Tmux and Vim: Copy and Paste on macOS Sierra"
tags = ["vim", "tmux", "terminal", "macos"]
description = "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."
+++
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.
``` shell
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.
``` text
# 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 <kbd>ctrl</kbd> + <kbd>b</kbd> to <kbd>ctrl</kbd> + <kbd>a</kbd>, because that works pretty
fast when you've already remapped Caps-Lock to Control.
* <kbd>ctrl</kbd> + <kbd>a</kbd>, <kbd>[</kbd> to enter copy mode. This allows you to use normal Vim
motion keys to move around.
* <kbd>v</kbd> to start selection, again use vim motion keys to move around.
+ <kbd>y</kbd> to yank the selection. <kbd>enter</kbd> also works.
Pasting works just as before:
* <kbd>ctrl</kbd> + <kbd>a</kbd>, <kbd>]</kbd>
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`:
``` vim
" 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.