Клавиша ESC вызывает небольшую задержку в терминале из-за его поведения Alt +

68

Моя настройка терминала - gnome-terminal + tmux + zsh с привязками vi.

В таких приложениях, как vim или даже в режиме редактирования vi в командной строке zsh, мне часто приходится нажимать ESCклавишу, но перед тем, как действие этой клавиши проявится, возникает небольшая задержка. См. Экран GNU замедляет работу клавиши Vim ESC

После некоторых экспериментов я обнаружил, что нажатие ESCклавиши и сразу другой клавиши (скажем b) имеет тот же эффект, что и нажатие Alt+b. Я не знаю, почему это так (вероятно, по наследству, когда не было Alt? Я не знаю). В любом случае, у меня есть два Altключа, и я не хочу такого поведения с моим ESCключом. Я пытался с, C+[и его та же проблема с этим тоже.

Я не уверен, кто за это отвечает, gnome-терминал или tmux или сама моя ОС (Ubuntu Natty). Любые идеи о том, как решить эту проблему, были бы великолепны.

Обновление : я проверил без tmux на другом терминале (LXTerminal) и там тоже присутствует задержка.

Шрикант Шарат
источник
1
Я не мог понять, почему мой vim ведет себя странно. Этот вопрос заставил меня вспомнить, что я только начал использовать его на экране. Вы сохранили мое здравомыслие.
Пабо

Ответы:

112

Вот реальное исправление. Добавьте следующее к .tmux.conf:

set -s escape-time 0
Висент Марти
источник
4
Отлично, спасибо! Задержка выхода из режима вставки в vim и не думал, что это могло бы помешать tmux. Это сделало трюк
Actionshrimp
7
Как упоминалось в superuser.com/questions/252214/… я должен был сделать, tmux kill-serverчтобы это вступило в силу.
PhilT
Для тех, кто пришел на эту страницу, пытаясь понять, почему происходит задержка при переключении из режима вставки в командный режим при использовании режима vi в bash, см. Superuser.com/a/1161871/236677
квас
3
Вы можете перезагрузить файл конфигурации, открыв командную строку внутри tmux, указав tmux-prefix(по умолчанию Ctrl+b) :и введя source-file $HOME/.tmux.conf.
Folfy
7

Задержка вызвана процедурой ввода, которая может решить, была ли нажата функциональная клавиша или нет. Для этого подпрограмма ввода запускает таймер всякий раз, когда она читает символ ESC. Символы, которые считываются с ввода перед тем, как закончится таймер (скажем, десятая часть секунды), затем интерпретируются как последовательность ESC функциональной клавиши, и эта последовательность ESC будет сравниваться с известными строками последовательностей ESC из terminfo или база данных termcap (зависит от того, какие подпрограммы низкого уровня используются).

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

Относительно вашего вопроса с поведением ESC a= Meta a:

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

КТФ
источник
Спасибо за объяснение ktf. Задержка отсутствует в gvim, только в терминале (я проверил без tmux, и задержка все еще есть).
Шрикант Шарат
gvim не страдает от этой проблемы, потому что он получает информацию о том, какая клавиша была нажата с сервера X11 (поэтому он не должен анализировать последовательности ESC).
Ktf
Итак, мне нужно, чтобы мой gnome-терминал вел себя так же.
Шрикант Шарат
gnome-терминал не является проблемой - описанная проблема касается только программ, работающих на терминале (или в эмуляции терминала), и должна анализировать функциональные клавиши. Вы будете испытывать то же поведение, если, например, попробуете xterm или KDE-Terminal.
Ktf
2
«Мета-клавиши были доступны не со всеми клавиатурами. В качестве обходного пути часто разрешалось использовать клавишу ESC, которую нужно нажимать перед другой клавишей». Возможно, даже до того, что у ttys часто были только семибитовые интерфейсы данных; восьмого «мета-бита» не было, поэтому вам пришлось отправить ESC для Meta. И в настоящее время UTF-8 широко распространен, поэтому даже при восьмибитных соединениях вы не можете использовать старший бит для Meta.
Крис Пейдж
3

Хотя это не может напрямую решить вашу проблему, я обнаружил, что могу использовать <Ctrl> cдля выхода из режима вставки. Это также можно использовать для выхода из экранной прокрутки tmux (которую можно вызвать с помощью <leader> PgUP)

dtyler
источник
3
Я бы не рекомендовал использовать <C-c>для выхода из режима вставки при регулярном использовании, так как он не запускает InsertLeaveавтокоманду, которую могут наблюдать некоторые плагины. См :h i_CTRL-C.
Шрикант Шарат