Skip to content

プロセスの非同期実行を行いたい #836

@mikoto2000

Description

@mikoto2000

概要

Vim/NeoVim に外部プログラムの非同期化が入りましたので、それを利用して「Process.system()」の非同期化を行いたいです。

私の最終的な目標は HTTP ダウンロード処理の非同期化 ですが、その第一段階として 外部コマンド実行 (Process.system()) の非同期化 を提案します。

これにより、処理時間の長い外部プログラムを呼び出す場合など、必要に応じて UI をブロックせずに実行できるようになり、かつ、既存の background オプションと比べ、以下メリットが実現できます。

  • 非同期実行したプログラムの戻り値が受け取れる
  • コールバックによる非同期実行したプログラム完了時の処理を定義できる

方針

  1. 既存の関数 Process.system にオプション async, out_cb, err_cb, exit_cb を追加
    out_cb, err_cb, exit_cbasyncv:true の場合にのみ有効
  2. 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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions