呼び出されてから一定時間(たとえば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
これまでのところ動作しているようですが、バグが発生する可能性があります (動作する場合はここに記載します)。これまでに注意したことの 1 つは、これを使用すると、スレッドが存在する前に vim を終了できないことです。