Как предотвратить <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
.
Это не может строго помочь автору, но этот вопрос возникает при поиске этой проблемы со многими различными комбинациями ключевых слов, поэтому я надеюсь, что это поможет кому-то.
Источник: первый комментарий от здесь.