Небольшая задержка при переключении режимов в vim с использованием tmux или screen

68

Переключение в режим вставки в Vim и из него больше не происходит мгновенно, так как я использую tmux. После нажатия Escв режиме вставки, для выхода из режима вставки требуется заметное время. После нажатия Escи любой другой клавиши после этого переключатель переключается немедленно, и команда для клавиши, нажатой после Esc, выполняется. Есть идеи, что может вызвать это?

Конфигурация Vim не является проблемой, поскольку задержка не возникает, когда я запускаю Vim вне tmux, так что это, вероятно, как-то связано с tmux. Я использую Gnome-терминал, кстати.

Также стоит отметить, что, похоже, я не могу определить привязки клавиш в tmux Esc, мой план был привязать Escк:

bind Escape send-keys ^[

Увы, похоже, что привязка к Esctmux не работает. Та же проблема возникает и на экране.

Тон ван ден Хеувел
источник

Ответы:

122

После просмотра справочных страниц оказывается, что у tmux есть возможность для этого. Следующее в ~/.tmux.confустраняет проблему задержки:

 set -sg escape-time 0

Вы должны перезапустить сервер tmux или перезагрузить конфигурацию, чтобы это вступило в силу. Для этого выполните source-file ~/.tmux.confзапрос из командной строки tmux.

Тон ван ден Хеувел
источник
2
Где ты нашел это? Я нигде не могу найти время побега man tmux, и команда не работает для меня.
djeikyb
Я подозреваю, что это доступно только в версии для разработчиков. Вы можете получить его здесь: github.com/ThomasAdam/tmux
Тон ван ден Хеувел
5
Мне пришлось использовать kill-server tmux, прежде чем эта настройка сработала для меня. Спасибо!
Сэм
1
Это заставляет меня желать, чтобы я мог дать вам 10 голосов. Нашел это после часа сражений таймаутов в vim. Спасибо!
Мальвим
1
@MichaelBrown, я тоже так делаю и до сих пор сталкиваюсь с этой проблемой. На самом деле это не должно иметь значения, потому что один и тот же код ключа отправляется на эмулятор терминала независимо от того, нажимаете ли вы клавишу escape или ^ [.
Тон ван ден Хеувел
4

У меня была другая, но похожая проблема, которую я пытался решить, когда нашел эту страницу, поэтому я опубликую ее здесь на случай, если она будет полезна всем, кто ищет этот ответ и находит эту страницу таким же образом.

Проблема: режим vi в bash имеет задержку при переключении из режима вставки в командный режим

Решение: в вашем ~/.inputrcфайле добавьте set keyseq-timeout nгде nминимальное значение больше 0. по nумолчанию 500 мс, что и является причиной задержки. Смотрите документацию здесь .

Кроме того, если вы хотите узнать, в каком режиме вы находитесь, посмотрите на форк Баш Дилана Кали .

Квас
источник
это очень полезно, я установил его, 0.01и теперь он гораздо приятнее и быстрее. Спасибо!
Его также можно добавить, /etc/inputrcчтобы сделать его доступным для всех пользователей.
1

Похоже, вы используете отображение, которое начинается с ESC. Когда вы нажимаете клавишу ESC, vim должен подождать, чтобы увидеть, является ли следующая клавиша той, которая находится в отображении. Если это не так, он может немедленно продолжить.

Конфигурация vim может зависеть от терминала, поэтому тот факт, что это не происходит вне tmux, не имеет большого значения. Vim может запросить $TERMпеременную среды и выбрать другую конфигурацию в зависимости от ее значения.

Поскольку gnome-терминал использует AFAIK xtermв качестве значения $TERMпеременной, а tmux использует screen, я бы просмотрел все ваши файлы конфигурации vim на предмет настроек, которые используются только при $TERMусловии, что переменная равна screen. Я предполагаю, что какой-то конфигурационный файл vim в вашей системе устанавливает сопоставления для обработки клавиш со стрелками (те, которые начинаются с ESCсимвола), когда терминал находится screen.

Вы можете проверить это, временно изменив $TERMпеременную в tmux перед запуском vim. Если ваша оболочка bash, вызовите vim как

TERM=xterm vim

в tmux и посмотрите, не исчезнет ли проблема. Вы не должны использовать это как исправление, так как могут быть различия между терминальными возможностями tmux и xterm, и вы можете столкнуться с некоторыми проблемами.

Ян Хлавачек
источник
Несколько хороших указателей здесь. Я использую Bash, но, к сожалению TERM=xterm vim, не решил проблему. Мне придется копать немного глубже.
Тон ван ден Хеувел
1

Как видно из заголовка Screen, здесь есть решение для исправления поведения клавиши Escape в GNU Screen. (Взято отсюда .)

Добавлять

maptimeout 5

в .screenrcконфигурационный файл.

Twonky
источник