Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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?

share|improve this question

2 Answers 2

up vote 32 down vote accepted

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.

share|improve this answer
    
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: superuser.com/questions/237751/… 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 Mar 18 '12 at 20:51
    
Just to be clear, your solution plus map <Esc>[B <Down>from that other thread means everything now works fine. –  Henrik N Mar 18 '12 at 21:02

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! :-)

share|improve this answer
1  
Beautiful! Great detective work. –  Henrik N Mar 8 '13 at 19:58
1  
This is what I changed exactly: github.com/henrik/dotfiles/commit/… Colors and modifier keys seem to work well both outside and inside tmux. –  Henrik N Mar 8 '13 at 19:59

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.