自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()
使用带有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() | 停止所有定时器 |