我想调用一个函数,该函数在调用后的固定时间(比如 30 秒)执行某些操作。该函数可以在初始化时或在使用期间的某个时候调用。在我等待的时候,我会像往常一样继续使用 vim。这可能吗?
如果它有帮助,我正在使用用 perl 和 python 编译的 vim,并且我有插件 vimproc。
我想调用一个函数,该函数在调用后的固定时间(比如 30 秒)执行某些操作。该函数可以在初始化时或在使用期间的某个时候调用。在我等待的时候,我会像往常一样继续使用 vim。这可能吗?
如果它有帮助,我正在使用用 perl 和 python 编译的 vim,并且我有插件 vimproc。
你最好的候选人是CursorHold,CursorHoldI
事件。当用户暂停 4 秒时它们会触发,因此它经常发生,但他也很可能不会注意到随后触发的缓慢操作。
你无法避免 Vim 阻塞;特别是不适合加载慢速插件。Vim(script) 是单线程的;无法进行后台处理。虽然您可以使用(小心!)集成(Perl,Python,...)解释器(用于后台任务)的多线程支持,但当您需要“回调”到 Vim 核心时,这无济于事,您需要为用 Vimscript 编写的插件做。
我想出了以下内容:
if has('python') "{{{ LoadPythonDelayed
function! LoadPythonDelayed()
python << ENDP
import time
from threading import Thread
import vim
def LoadAddonPy():
time.sleep(2)
vim.command('call LoadAddon()')
Thread(target=LoadAddonPy).start()
ENDP
return ''
endfunction
call LoadPythonDelayed()
endif
到目前为止它似乎工作,也许它可能会触发错误(如果有的话我会放在这里)。到目前为止我注意到的一件事是,通过使用它,我无法在线程存在之前退出 vim。