I like the idea of unifying navigation between tmux panes and vim
windows. @mislav did a great job in this gist but it depends on
using C-{h,j,k,l}
for navigation instead of vim's default C-W {h,j,k,l}
.
Tmux's bind-key
doesn't support multiple keys: just a single key with a
modifier, so if we want to keep using C-w
we have to be a bit tricky.
This approach binds C-w
to set up keybindings that a) navigate and b) unset
themselves. It turns out you can't have a bind-key
statement in your
.tmux.conf
that's too long or tmux
will segfault, which is one of the
reasons a lot of the work is done in bash scripts.
Install vim-tmux-navigator
Here's what you'd put in .tmux.conf
bind -n C-W \
bind -n h run "tmux-vim-select-pane -L; tmux-unbind" \; \
bind -n c-h run "tmux-vim-select-pane -L; tmux-unbind" \; \
bind -n j run "tmux-vim-select-pane -D; tmux-unbind" \; \
bind -n c-j run "tmux-vim-select-pane -D; tmux-unbind" \; \
bind -n k run "tmux-vim-select-pane -U; tmux-unbind" \; \
bind -n c-k run "tmux-vim-select-pane -U; tmux-unbind" \; \
bind -n l run "tmux-vim-select-pane -R; tmux-unbind" \; \
bind -n c-l run "tmux-vim-select-pane -R; tmux-unbind" \; \
bind -n v send-keys c-w v\\; run "tmux-unbind" \; \
bind -n c-v send-keys c-w v\\; run "tmux-unbind" \; \
bind -n o send-keys c-w o\\; run "tmux-unbind" \; \
bind -n c-o send-keys c-w o\\; run "tmux-unbind" \; \
bind -n c send-keys c-w c\\; run "tmux-unbind" \; \
bind -n c-c send-keys c-w c\\; run "tmux-unbind" \; \
bind -n r send-keys c-w r\\; run "tmux-unbind" \; \
bind -n c-r send-keys c-w r\\; run "tmux-unbind" \; \
bind -n n send-keys c-w n\\; run "tmux-unbind" \; \
bind -n c-n send-keys c-w n\\; run "tmux-unbind" \; \
tmux-vim-select-pane
is exactly the same as the one @mislav uses, and
tmux-unbind
is pretty straightforward:
#!/usr/bin/env bash
tmux unbind -n h
tmux unbind -n c-h
tmux unbind -n j
tmux unbind -n c-j
tmux unbind -n k
tmux unbind -n c-k
tmux unbind -n l
tmux unbind -n c-l
tmux unbind -n v
tmux unbind -n c-v
tmux unbind -n o
tmux unbind -n c-o
tmux unbind -n c
tmux unbind -n c-c
tmux unbind -n r
tmux unbind -n c-r
tmux unbind -n n
tmux unbind -n c-n
Note that we want to passthrough some C-w
combinations, like C-w n
(for new
window in vim).
I've included a simple Rakefile
and templates that you can use to generate
.tmux.conf
and tmux-unbind
.
One final note is that this doesn't work in tmate, although I'm not sure why yet.
Found a hack that seems to work: this tmux.conf change and this script.