Как контролировать время отображения сообщений vim

Как контролировать время отображения сообщений vim

Есть ли способ контролировать время отображения сообщений в vim?

Например, при поиске в vim и нажатии на нижнюю часть будет отображено:

  search hit BOTTOM, continuing at TOP

Даже если прошло несколько секунд и курсор уже ушел, сообщение все равно не исчезнет.

Единственный способ, который я могу придумать, чтобы такие сообщения исчезли, это сделать

:redraw

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

решение1

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

:autocmd CursorHold * :echo

Я выбрал его, :echoпотому что он визуально менее отвлекает, :redrawи он должен очистить командную область от сообщений.

Обратите внимание, что это будет работать только в обычном режиме иненажмите клавишу на некоторое время (обычно четыре секунды). Почему, смотрите:

:help CursorHold
:help 'updatetime'

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

решение2

Если updatetimeзначение мало, то echoслишком быстро очистит строку cmd msg. Мы можем использовать timer_start()функцию [^1] длязадерживатьвыполнение эха. Вот что хорошо работает для меня:

function! s:empty_message(timer)
  if mode() ==# 'n'
    echon ''
  endif
endfunction

augroup cmd_msg_cls
    autocmd!
    autocmd CursorHold * call timer_start(25000, funcref('s:empty_message'))
augroup END

Значение 25000измеряется в миллисекундах, то есть это примерно 25 секунд после удержания курсора. Вы можете настроить это значение так, как вам удобно.

[^1]: похоже, что timer_start()доступно только для Vim 8.0+.

Связанный контент