Как предотвратить <Esc> от ожидания ввода большего количества данных в режиме вставки

Когда я покидаю режим вставки, нажав Esc, произойдет пауза в полсекунды, прежде чем Vim действительно вернется в нормальный режим.

Обычно это не будет проблемой, так как нажатие команды нормального режима, например j после нажатия Esc, немедленно запускает команду нормального режима (без вышеупомянутого ожидания), но у меня есть отображение inoremap <Esc> <Esc>:w<CR>, так что каждый раз, когда я оставляю режим вставки, файл записывается. Я бы хотел, чтобы запись произошла сразу же, когда я нажимаю Esc, но вместо этого есть эта половина-секундная пауза.

Я предполагаю, что пауза связана с тем, что Vim ждет больше ввода, прежде чем он решит, что я просто хотел набрать один простой Esc. Это должно быть потому, что есть где-то, где первый символ <Esc>, но я посмотрел в моем .vimrc и такого сопоставления нет.

Кроме того, я даже запускал :map <Esc>, и он возвращал No such mapping. Итак, если такого сопоставления нет, почему Vim, похоже, ждет больше ввода и как я могу избежать этого поведения?


Дополнительная информация

Похоже, что это невозможно воспроизвести, так что вот еще несколько сведений, если кто-то действительно хочет понять это:

Я использую распространение Франка spf13 Vim, мой собственный .vimrc.local поверх него. Я также установил несколько дополнительных плагинов, используя Vundle.

Примечания: .vimrc.local используется последним в .vimrc.

Ответ 1

ОБНОВЛЕНИЕ (3/19/2014)

Я нашел гораздо лучшее решение, чем пытаться выследить все сопоставления, начинающиеся с <Esc>, любезно предоставленные Powerline, из Советы и рекомендации в документах. Поместите это где-нибудь в свой .vimrc:

 " leave insert mode quickly
  if ! has('gui_running')
    set ttimeoutlen=10
    augroup FastEscape
      autocmd!
      au InsertEnter * set timeoutlen=0
      au InsertLeave * set timeoutlen=1000
    augroup END
  endif

Обратите внимание, что это сделает невозможным использование сопоставлений, начинающихся с <Esc>, в то время как в режиме вставки, но в любом случае их не должно быть, из-за проблемы, которая решает.


Я нашел строки в spf13 .vimrc, которые вызывали проблему:

" Fix home and end keybindings for screen, particularly on mac
" - for some reason this fixes the arrow keys too. huh.
map ^[F $
imap ^[F $
map ^[H g0
imap ^[H g0

Я не мог найти их раньше, потому что они не были сопоставлены с помощью <Esc>, но ^[. Очень раздражает! Надеюсь, что это поможет некоторым одинаково недовольным пользователям spf13:)

UPDATE:

Если удаление этих сопоставлений не работает, возможно, это отображение из плагина.

Введите :verbose map <Esc>, чтобы получить список всех отображений с участием Esc. Часть verbose указывает Vim на печать, где было установлено сопоставление. Это должно помочь выяснить причину проблемы.

Кроме того, команда unmap <Esc> может быть полезна — она удаляет любые сопоставления для клавиши Esc.

Обратите внимание, что unmap не удаляет отображения во всех режимах; введите :h unmap для получения дополнительной информации.

Ответ 2

Я не совсем уверен, что проблема с отображаемым вами сопоставлением, на мой взгляд, это должно быть хорошо. Однако я думаю, что то, что вы хотите достичь, может быть достигнуто лучше. Ваше сопоставление в основном является попыткой создания события InsertLeave, которое Vim фактически уже встроил!

Попробуйте добавить что-то вроде этого к вашему .vimrc:

au InsertLeave * if &mod && expand('%')!=''|write|endif

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

Ответ 3

В моем случае это было tmux, вводящее эту задержку (это стало для меня полным сюрпризом!).

Я исправил его, добавив set -g escape-time 0 к моему tmux.conf.


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


Источник: первый комментарий от здесь.