この記事は Vim 8.0 Advent Calendar の 5 日目の記事です。
Vim 8.0 は新しくタイマー機能が追加されました。これにより、指定時間後に関数を呼び出すことができます。
タイマーを開始する
以下の例では 1 秒毎に関数を呼び出し、その度にカウントダウンを行い、最後に BOMB!
と表示して終了します。
let dict = {'count': 10}
function! dict.countdown(timer) abort
let self.count -= 1
if self.count
echo self.count
else
echo 'BOMB!'
call timer_stop(a:timer)
endif
endfunction
let timer = timer_start(1000, dict.countdown, {'repeat': -1})
タイマーが起動した後、タイマーによって関数が実行されている間以外は、ユーザーは編集を続けることができます。
例によって Vim はシングルスレッドですので、タイマーによって Vim script が実行されている間はユーザーは操作ができません。
関数の解説
timer_start({time}, {callback}, [, {options}])
タイマーを開始します。{time}
ミリ秒後に {callback}
関数を呼び出します。
関数はタイマー ID を返します。この ID を使ってタイマーの操作ができます。また、{callback}
関数も引数にこの ID を受け取ります。
{options}
には辞書でオプションを渡せます。今のところ有効なオプションは以下のものです。
- "repeat"
{callback}
を繰り返し呼び出す回数を指定します。
正数を指定すると、{time} ミリ秒毎に指定した回数だけ{callback}
が呼び出されます。
-1 を指定すると、制限なく呼び出され続けます。
指定しなかった場合は 1 回だけ呼び出されます。
timer_stop({timer})
指定したタイマーを停止します。{callback}
関数は呼び出されなくなります。
timer_pause({timer}, {paused})
タイマーを一時停止したり再開したりします。{paused}
が TRUE の場合は一時停止、FALSE の場合は再開になります。
timer_info([{timer}])
タイマーの情報を返します。{timer}
引数を渡すと指定したタイマーの情報を、引数を省略した場合は全てのタイマーの情報を配列で返します。
情報は辞書で、ID や残り時間、呼び出される関数など一通りの情報が得られます。
timer_stopall()
タイマーは一歩間違えると暴発し、一切の操作ができなくなるような事態も起き得ます。timer_stopall()
を呼び出すことで、全てのタイマーを停止することができます。