Birkaç program senkronize olmayan bir şekilde birbiri ardına nasıl çalıştırılır

Birkaç programı birbiri ardına çalıştırmak ve çıktılarını tek bir tamponda göstermek istiyorum. Bunu çağırma işlemi 'ni birden çok kez çağırarak yapabilirim:

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

Sorun, Emacs'in son çağrı süreci bitene kadar donmasıdır.

Emacs donmadan birkaç program ardışık olarak (birbiri ardına) nasıl yürütülür?

1
(1) Eşzamanlı olarak, tüm çocuk süreçlerini eşzamanlı olarak çağıran tek bir sarmalayıcı işlemini çağırır. (2) Önceki süreç tamamlandığında, her işlemi başlatmak için işlem sentinellerini kullanın.
katma yazar Mark Ireland, kaynak
Kılavuza bakın: C-h i g (elisp) Sentinels
katma yazar Mark Ireland, kaynak
Hukukçu bir süre önce bu tür bir şeyle oynuyordu, dolayısıyla aynı sorunla ilgili bir yaklaşımı stackoverflow.com/q/23237869
Mümkünse kaçınmak istiyorum (1). Süreç sentinelleri hakkında biraz bilgi verir misiniz? Teşekkürler!
katma yazar Jim Conant, kaynak
Tam olarak bunu yapan ertelenen adında çok iyi bilinen bir kütüphane var. Bunu melpa veya github'da bulabilirsiniz: github.com/kiwanami/emacs-deferred . Bir paket bağımlısıysanız, zaten yüklemiş olmanız iyi bir ihtimaldir.
katma yazar Airsick, kaynak

1 cevap

Şunun gibi bir şeyle başlayabilirsiniz:

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