Vim
Vim 8.0Day 5

Vim 8.0 Advent Calendar 5 日目 タイマー

More than 1 year has passed since last update.

この記事は 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() を呼び出すことで、全てのタイマーを停止することができます。