Як запустити кілька програм один за одним асинхронно

Я хочу запустити декілька програм одне за одним і відображати їх вихід в одному буфері. Я можу це зробити, зателефонувавши call-process декілька разів:

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

Проблема полягає в тому, що Emacs зависає до завершення останнього call-process .

Як виконати декілька програм послідовно (один за іншим) без зависання Emacs?

1
(1) Асинхронно викликати один процес обгортки, який викликає синхронно всі дочірні процеси. (2) Використовуйте процес дозорів для початку кожного процесу, коли закінчується попередній процес.
додано Автор Mark Ireland, джерело
Див. Посібник: C-h i g (elisp) Sentinels
додано Автор Mark Ireland, джерело
Західний список вже давно грає з таким видом, тому ви можете побачити один підхід до однієї і тієї ж проблеми на stackoverflow.com/q/23237869
додано Автор Mark Ireland, джерело
Я хотів би уникнути (1), якщо це можливо. Не могли б ви трохи поговорити про процесові дозорних служб? Дякую!
додано Автор Jim Conant, джерело
Існує дуже добре відома бібліотека, яка називається відкладена, що робить саме це. Ви можете знайти його на melpa або на 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
додано