-
Notifications
You must be signed in to change notification settings - Fork 64
Open
Description
概要
Vim/NeoVim に外部プログラムの非同期化が入りましたので、それを利用して「Process.system()」の非同期化を行いたいです。
私の最終的な目標は HTTP ダウンロード処理の非同期化 ですが、その第一段階として 外部コマンド実行 (Process.system()) の非同期化 を提案します。
これにより、処理時間の長い外部プログラムを呼び出す場合など、必要に応じて UI をブロックせずに実行できるようになり、かつ、既存の background オプションと比べ、以下メリットが実現できます。
- 非同期実行したプログラムの戻り値が受け取れる
- コールバックによる非同期実行したプログラム完了時の処理を定義できる
方針
- 既存の関数
Process.systemにオプションasync,out_cb,err_cb,exit_cbを追加
out_cb,err_cb,exit_cbはasyncがv:trueの場合にのみ有効 asyncオプションがv:trueの場合、Vim/NeoVim の非同期 API でコマンドを実行する
(Vim ならjob_start, NeoVim ならjobstart)
修正後の Process.system API 定義イメージ
" * {command} [, {input} [, {timeout}]]
" * {command} [, {dict}]
" {dict} = {
" use_vimproc: bool,
" input: string,
" timeout: bool,
" background: bool,
" async: bool,
" out_cb: function,
" err_cb: function,
" exit_cb: function
" }
function! s:system(str, ...) abort
...(略)
endfunction使用イメージ
call s:Process.system(command, {
\ 'async': 1,
\ 'err_cb': function('s:my_out_cb',[arg]),
\ 'out_cb': function('s:my_err_cb',[arg]),
\ 'exit_cb': function('s:my_exit_cb',[arg])})Metadata
Metadata
Assignees
Labels
No labels