How to get shift+arrows and ctrl+arrows working in Vim in tmux?

48

29

This is all in iTerm2 on OS X.

I used to have

export TERM='xterm-256color'

in my .bashrc. This meant Vim in tmux did use 256 colors.

And once I added

set -g xterm-keys on

then keyboard shortcuts with modifiers worked fine in Vim. Namely: shift+left/right that I mapped to switch Vim tabs, ctrl+up/down that I mapped to move ("bubble") lines, and shift+left/right which worked out of the box to jump by word in the command-line mode (e.g. when typing something like :e foo bar baz).

However, this setup had the problem that the Vim background color only shows behind text, as mentioned here.

So I removed

export TERM='xterm-256color'

from my .bashrc and instead put this in my .tmux.conf:

set -g default-terminal "screen-256color"

That fixed the Vim background color, but broke the keyboard shortcuts - they do unexpected things (move the cursor, delete text) instead.

By using ctrl+v to insert the verbatim output from the key combinations (as described here), I was able to work around it:

map [1;5A <C-Up>
map [1;5B <C-Down>
map [1;2D <S-Left>
map [1;2C <S-Right>
cmap [1;2D <S-Left>
cmap [1;2C <S-Right>

This makes the shortcuts work, but it doesn't feel like the right solution. Could anyone tell me what's happening here and how to fix it?

Henrik N

Posted 2012-03-17T22:13:45.947

Reputation: 1 276

Answers

73

You need to set the tmux window option xterm-keys so that tmux will pass these keys through to its terminals. You probably want to put this in your ~/.tmux.conf:

set-window-option -g xterm-keys on

Vim will usually automatically set up its handling of these keys when TERM is xterm-something, but it skips this since TERM is screen-256color. You can manually configure these keys in your ~/.vimrc like this:

if &term =~ '^screen'
    " tmux will send xterm-style keys when its xterm-keys option is on
    execute "set <xUp>=\e[1;*A"
    execute "set <xDown>=\e[1;*B"
    execute "set <xRight>=\e[1;*C"
    execute "set <xLeft>=\e[1;*D"
endif

At least that way you do not have to map all the various combinations.

Chris Johnsen

Posted 2012-03-17T22:13:45.947

Reputation: 31 786

@HenrikN Could you please clarify what map <Esc>[B <Down> does? I don't see any difference by adding it to my .vimrc file. – Tropilio – 2019-04-10T12:01:11.717

@Francesco Boccardo: If you follow the link in my previous comment, and then follow the link again from there, you get to https://superuser.com/a/215181 which seems to explain it in excruciating detail :)

– Henrik N – 2019-04-10T18:54:32.683

@HenrikN Thanks. So it is probably an OSX related issue, or maybe it's been resolved in these 7 years, because pressing command (control?) + r doesn't mess up the arrow keys in vim in tmux for me (I am on Linux). – Tropilio – 2019-04-11T07:39:32.850

Thank you! That looks better than what I had, and I appreciate the explanation. One thing that was fixed by what I had, but not by your lines, was that up/down arrows didn't work in the Command-T plugin as described here: http://superuser.com/questions/237751/messed-up-keys-in-vim-when-running-inside-tmux I just added map <Esc>[B <Down> from one of the answers. Seems the reason there is some bad assumptions made by the plugin itself.

– Henrik N – 2012-03-18T20:51:45.380

Just to be clear, your solution plus map <Esc>[B <Down>from that other thread means everything now works fine. – Henrik N – 2012-03-18T21:02:43.717

8

As explained here, disable Background Color Erase (BCE) by clearing the t_ut terminal option (run :set t_ut= in Vim and then press Control+L to refresh the terminal's display) so that color schemes work properly when Vim is used inside tmux and GNU screen.

This way, you can keep your TERM value as xterm-256color for proper key detection while also getting proper Vim color scheme rendering too! :-)

sunaku

Posted 2012-03-17T22:13:45.947

Reputation: 1 086

1Beautiful! Great detective work. – Henrik N – 2013-03-08T19:58:22.217

2

This is what I changed exactly: https://github.com/henrik/dotfiles/commit/f8347e465fe9c4b9ff7ea211e2263d6e34ace9dd Colors and modifier keys seem to work well both outside and inside tmux.

– Henrik N – 2013-03-08T19:59:40.063