この記事は Vim 8.0 Advent Calendarの 5 日目の記事です。
Vim 8.0 は新しくタイマー機能が追加されました。これにより、指定時間後に関数を呼び出すことができます。
タイマーを開始する
以下の例では 1 秒毎に関数を呼び出し、その度にカウントダウンを行い、最後に BOMB!
と表示して終了します。
letdict= {'count': 10}
function!dict.countdown(timer) abort
let self.count-=1if self.count
echo self.countelse
echo 'BOMB!'call timer_stop(a:timer)endifendfunctionlet 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()
を呼び出すことで、全てのタイマーを停止することができます。