非同期的に複数のプログラムを1つずつ実行する方法

複数のプログラムを1つずつ実行して、その出力を1つのバッファに表示したい。私は call-process を複数回呼び出すことでこれを行うことができます:

(call-process "cmd1" nil "*out*" t)
(call-process "cmd2" nil "*out*" t)
...

問題は、最後の call-process が終了するまでEmacsがフリーズすることです。

Emacsをフリーズせずに複数のプログラムを順番に(1つずつ)実行するには?

1
(1)すべての子プロセスを同期的に呼び出す単一のラッパー・プロセスを非同期に呼び出します。 (2)プロセスのセンチネルを使用して、前のプロセスが完了したときに各プロセスを開始します。
追加された 著者 Mark Ireland,
マニュアルを参照してください: C-h i g(elisp)Sentinels
追加された 著者 Mark Ireland,
法律リストはこの種のものでしばらく前に遊んでいたので、 stackoverflow.com/q/23237869</で同じ問題のアプローチを見ることができますa>
追加された 著者 Mark Ireland,
可能であれば(1)を避けたいと思います。プロセス監視員について少し詳しく教えてください。ありがとう!
追加された 著者 Jim Conant,
deferedと呼ばれる非常によく知られているライブラリがあります。メルパまたはgithubで見つけることができます: github.com/kiwanami/emacs-deferred あなたがパッケージの中毒者であれば既にインストールされている可能性が高いです
追加された 著者 Airsick,

1 答え

あなたは次のようなものから始めることができます:

(let ((proc1 (start-process "myproc1" t "cmd1")))
  (set-process-sentinel proc1
    (lambda (proc1 _string)
      (with-current-buffer (process-buffer proc1)
        (let ((proc2 (start-process "myproc2" t "cmd2")))
          (set-process-sentinel proc2
            (lambda (proc2 _string)
              (with-current-buffer (process-buffer proc2)
                (let ((proc3 (start-process "myproc3" t "cmd3")))
                  ...)))))))))              
3
追加された