Лаг в InsertLeave of Vim

У меня есть эти строки в моем .vimrc изменить цвет Statusline для режима вставки Vim. StatusLine быстро реагирует на InsertEnter, Однако для InsertLeaveесть ок. 1 секунда задержки между исчезновением --INSERT-- и изменение цвета в StatusLine. Могу ли я получить помощь с этим?

set laststatus=2
if version >= 700
  au InsertEnter * hi StatusLine term=reverse ctermbg=15 ctermfg=22
  au InsertLeave * hi StatusLine term=reverse ctermbg=16 ctermfg=0
endif

Я старался :au Insertleave и показывает только одну команду:

--- Auto-Commands ---
InsertLeave
    *         hi StatusLine term=reverse ctermbg=16 ctermfg=0

Любая помощь приветствуется.

Спасибо

1 ответ

Vim не может сказать, что вы выходите из режима вставки, потому что все, что он видел, - это выход. Клавиши со стрелками, как правило, устанавливаются на терминал Vim как <ESC>OA, <ESC>OB, <ESC>OC, а также <ESC>OD, Так что vim ждет следующего ключа в последовательности, прежде чем что-то делать. Это также причина, если вы печатаете <ESC>O O просто сидит на экране на секунду вместо того, чтобы открывать новую строку выше текущей.

Vim использует timeoutlen определить, как долго ждать между нажатиями клавиш. По умолчанию это 1000 миллисекунд. Вы можете уменьшить это, если хотите, однако это затруднит печатание.

Autocmd также будет запущен быстрее, если вы напишите что-то сразу после слов, которые не являются частью какого-либо отображения.

Соответствующие варианты, чтобы посмотреть на это :h timeout, :h ttimeout, :h timeoutlen, а также :h ttimeoutlen,

Вы можете использовать функцию timer_start с проверкой текущего режима vim для выполнения вашей команды только при нажатии клавиши Escape, а не внутри последовательностей (движения стрелок, привязки клавиш и т. Д.).

function <SID>condInsertLeave()
    if mode() == "n"
        hi StatusLine term=reverse ctermbg=16 ctermfg=0
    endif
endfunction

autocmd InsertLeave * call timer_start(200, { tid -> <SID>condInsertLeave()})
Другие вопросы по тегам