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

21486
Henrik N

Это все в 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> 

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

38

2 ответа на вопрос

62
Chris Johnsen

Вам нужно установить опцию окна 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, как описано здесь: http://superuser.com/questions/237751/messed- up-keys-in-vim-when-running-inside-tmux Я только что добавил `map[B `из одного из ответов. Кажется, причина в том, что сам плагин сделал несколько неверных предположений. Henrik N 12 лет назад 0
Просто чтобы быть ясно, ваше решение плюс карта [B `из этого другого потока означает, что теперь все работает нормально. Henrik N 12 лет назад 0
7
sunaku

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

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

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