vim メッセージの表示時間を制御する方法

vim メッセージの表示時間を制御する方法

vim でメッセージの表示時間を制御する方法はありますか?

たとえば、vim で検索して一番下まで到達すると、次のように表示されます。

  search hit BOTTOM, continuing at TOP

数秒経過してカーソルが移動したとしても、メッセージは消えません。

このようなメッセージを消す唯一の方法は、

:redraw

ただし、一定時間後、たとえば 2 秒後に、このようなすべてのメッセージを手動で実行する方法を見つけたいと思っています。

答え1

Vim では、ユーザーの操作を妨げずに正確な遅延を設定する便利な方法は提供されていません。おそらく期待できる最善の策は次のようになります。

:autocmd CursorHold * :echo

:echo視覚的に邪魔にならないことと:redraw、コマンド領域のメッセージをクリアできることから、これを選択しました。

これは通常モードの場合にのみ機能し、しないでくださいキーを一定時間(通常は 4 秒間)押します。理由については、以下を参照してください。

:help CursorHold
:help 'updatetime'

言い換えれば、これはあまり効果的ではありません。 Vim でフックできる真のイベント ループを作成するという議論がありましたが、それが実現しない限り、必要なものは利用できません。

答え2

updatetime値が小さい場合、echoコマンドラインのメッセージがすぐにクリアされてしまいます。timer_start()[^1]関数を使用して遅れecho の実行。私の場合は次のようにするとうまくいきます:

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 以降でのみ使用できるようです。

関連情報