VIM学习笔记 定时器(timer)

自8.0版本起,包含+timers特性的Vim提供了定时器功能。利用定时器,可以在指定延时之后触发指定操作,也可以按照固定的时间间隔来重复执行任务。

启动定时器

使用timer_start()函数,可以启动定时器并返回定时器ID:

timer_start({time}, {callback} [, {options}])

其中:

定时器选项

使用"repeat"选项,可以控制执行回调函数的次数。缺省为执行"1"次。如果希望无限循环执行,那么可以将此值设置为"-1"。

使用以下命令,设置在状态行中显示时间:

set laststatus=2
if has("win32")
    set statusline=%{strftime(\"%I:%M:%S\ \%p,\ %a\ %b\ %d,\ %Y\")}
else
    set statusline=%{strftime(\"%l:%M:%S\ \%p,\ %a\ %b\ %d,\ %Y\")}
endif

自定义以下函数,用于更新状态行:

function! UpdateStatusBar(timer)
    execute 'let &ro = &ro'
endfunction

使用以下命令启动定时器,回调函数将持续更新状态行的时间显示:

:let timer = timer_start(3000, 'UpdateStatusBar',{'repeat':-1})

定时器信息

使用不带参数的timer_info()函数,可以获取所有定时器的信息:

:echo timer_info()

timer_info_all

使用带有ID参数的timer_info()函数,可以获取指定定时器的信息:

:echo timer_info(timer)

函数返回包含详细信息的字典:

项目描述
id该定时器的 ID
repeat定时器还需要重复执行的次数,无限执行则返回 -1
remaining距定时器启动还剩余的毫秒数
time计时器时间间隔(毫秒数)
paused暂停状态时返回 1,否则返回 0
callback回调函数

暂停定时器

使用timer_pause()函数,并指定第二个参数为非0数值或非空字符串,可以暂停定时器:

:call timer_pause(timer,1)

使用timer_pause()函数,并指定第二个参数为数值0或空字符串,可以对定时器取消暂停:

:call timer_pause(timer,0)

取消定时器

假设启动以下定时器,将在指定延时之后强制退出Vim:

:let timer_id = timer_start(10000, {id -> execute('quit!')})

使用timer_stop()函数,可以取消指定定时器:

:call timer_stop(timer_id)

使用timer_stopall()函数,可以取消所有定时器:

:call timer_stopall()

定时器实例

假设当前脚本文件中包含以下代码:

let s:timeouts = [5000, 10000, 30000, 1000, 1000, 3200, 500, 700]

function! s:noop(timer_id)
    let s:timeouts = insert(s:timeouts, remove(s:timeouts, len(s:timeouts) - 1))
    normal dd
   call timer_start(s:timeouts[0], function('<SID>noop'))
endfunction

call s:noop(0)

使用以下命令执行当前脚本,将从当前行开始,按照设定的时间间隔逐行删除文本:

:so %

使用以下命令,可以查看关于定时器的帮助信息:

:help timer

函数小结
timer_start()新建定时器
timer_info()定时器信息
timer_pause()暂停或继续定时器
timer_stop()停止定时器
timer_stopall()停止所有定时器

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>