Hoe verschillende programma's asynchroon achter elkaar uit te voeren

Ik wil verschillende programma's een voor een uitvoeren en hun uitvoer weergeven in een enkele buffer. Ik kan dit doen door meerdere malen call-process aan te roepen:

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

Het probleem is dat Emacs vastloopt totdat het laatste aanroepproces is voltooid.

Hoe verschillende programma's sequentieel (de een na de ander) uit te voeren zonder Emacs te bevriezen?

1
(1) Asynchroon een enkel wrapper-proces aanroepen dat synchroon alle kindprocessen aanroept. (2) Gebruik proceswachtwoorden om elk proces te starten wanneer het voorgaande proces voltooid is.
toegevoegd de auteur Mark Ireland, de bron
Zie de handleiding: C-h i g (elisp) Sentinels
toegevoegd de auteur Mark Ireland, de bron
lawlist speelde een tijdje geleden met dit soort dingen, dus je kunt een benadering van hetzelfde probleem zien op stackoverflow.com/q/23237869
toegevoegd de auteur Mark Ireland, de bron
Ik zou het liefst vermijden (1). Kun je alsjeblieft iets vertellen over proceswachtwoorden? Bedankt!
toegevoegd de auteur Jim Conant, de bron
Er is een zeer bekende bibliotheek genaamd uitgesteld die precies dit doet. Je kunt het vinden op melpa of op github: github.com/kiwanami/emacs-deferred . Er is een goede kans dat je het al hebt geïnstalleerd als je een pakketjunkie bent
toegevoegd de auteur Airsick, de bron

1 antwoord

U kunt beginnen met zoiets als:

(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
toegevoegd