Как получить shift + стрелки и ctrl + стрелки, работающие в Vim в tmux?

45

Это все в iTerm2 на OS X.

Раньше, у меня был

export TERM='xterm-256color'

по моему .bashrc. Это означало, что Vim в tmux использовал 256 цветов.

И как только я добавил

set -g xterm-keys on

тогда сочетания клавиш с модификаторами работали нормально в Vim. А именно: shift+left/rightто, что я отображал для переключения вкладок Vim, ctrl+up/downто , что я отображал для перемещения («пузыри») линий, и shift+left/rightкоторое работало из коробки для перехода по слову в режиме командной строки (например, при вводе чего-то вроде :e foo bar baz).

Однако в этой настройке возникла проблема, заключающаяся в том, что цвет фона Vim отображается только за текстом, как упомянуто здесь .

Итак, я удалил

export TERM='xterm-256color'

из моего .bashrcи вместо этого положить в моем .tmux.conf:

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

Это исправило цвет фона Vim, но сломало сочетания клавиш - вместо этого они делают неожиданные вещи (перемещают курсор, удаляют текст).

Используя ctrl+vдля вставки дословного вывода из сочетаний клавиш (как описано здесь ), я смог обойти это:

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>

Это заставляет работать ярлыки, но не похоже на правильное решение. Может кто-нибудь сказать мне, что здесь происходит и как это исправить?

Хенрик Н
источник

Ответы:

69

Вам нужно установить опцию окна tmux,xterm-keys чтобы tmux передавал эти ключи на свои терминалы. Вы, вероятно, хотите добавить это в свой ~/.tmux.conf:

set-window-option -g xterm-keys on

Vim обычно автоматически настраивает обработку этих ключей, когда TERM - xtermчто-то, но пропускает это, поскольку TERM - что-то screen-256color. Вы можете вручную настроить эти ключи ~/.vimrcследующим образом:

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

По крайней мере, таким образом, вам не нужно отображать все различные комбинации.

Крис Джонсен
источник
Спасибо! Это выглядит лучше, чем у меня, и я ценю объяснение. Одна вещь, которая была исправлена ​​тем, что у меня было, но не вашими строками, заключалась в том, что стрелки вверх / вниз не работали в плагине Command-T, как описано здесь: superuser.com/questions/237751/… Я только что добавил map <Esc>[B <Down>из одного из ответов. Кажется, причина в том, что сам плагин сделал несколько неверных предположений.
Хенрик Н
Просто чтобы быть понятным, ваше решение плюс map <Esc>[B <Down>из этого другого потока означает, что все теперь работает нормально.
Хенрик Н
@HenrikN Не могли бы вы уточнить, что map <Esc>[B <Down>делает? Я не вижу никакой разницы, добавив его в мой файл .vimrc.
Франческо Боккардо
@Francesco Boccardo: Если вы перейдете по ссылке в моем предыдущем комментарии, а затем снова перейдете по ссылке оттуда, вы попадете на superuser.com/a/215181, который, кажется, объясняет это в мучительных деталях :)
Henrik N
@HenrikN Спасибо. Так что, возможно, это проблема, связанная с OSX, или, возможно, она была решена за эти 7 лет, потому что нажатие команды (control?) + R не портит мне клавиши со стрелками в vim в tmux (я в Linux).
Франческо Боккардо
8

Как объяснялось здесь , отключите фоновое стирание цвета (BCE), очистив параметр t_utтерминала (запустите :set t_ut=в Vim, а затем нажмите Control+, Lчтобы обновить дисплей терминала), чтобы цветовые схемы работали правильно, когда Vim используется внутри экранов tmux и GNU.

Таким образом, вы можете сохранить свое TERMзначение как xterm-256colorдля правильного определения ключа, так и для получения правильной цветовой схемы Vim! :-)

sunaku
источник
1
Прекрасный! Отличная детективная работа.
Хенрик Н
2
Именно это я и изменил: github.com/henrik/dotfiles/commit/… Кажется, что цвета и клавиши-модификаторы хорошо работают как снаружи, так и внутри tmux.
Хенрик N