12
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vim 8.0 Advent Calendar 5 日目 タイマー

Posted at

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

12
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?