Bir-biridan keyin bir-biriga mos kelmaydigan tarzda bir nechta dasturlarni qanday ishlatish kerak

Men bir nechta dasturlarni ketma-ket ishga tushirishni va bitta buferda chiqishlarini namoyish qilmoqchiman. Buni bir necha marta call-process deb chaqirish orqali amalga oshirish mumkin:

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

Muammo shundaki, Emacs oxirgi call-process tugaguniga qadar muzlaydi.

Emacsni muzlatmasdan bir nechta dasturlarni ketma-ket (bir-birining ortidan) qanday bajarish mumkin?

1
(1) Asinxrona, barcha jarayonlarni bir vaqtda chaqiradigan bitta sarmoyalar jarayonini chaqiradi. (2) Avvalgi jarayon tugallanganda har bir jarayonni boshlash uchun jarayonni jo'natuvchilarni ishlating.
qo'shib qo'ydi muallif Mark Ireland, manba
Qo'llanmani ko'ring: C-h i g (elisp) Sentinels
qo'shib qo'ydi muallif Mark Ireland, manba
huquqshunos bu kabi narsalar bilan bir vaqtlar ilgari o'ynab turardi, shuning uchun siz xuddi shu muammoga bir yondashuvni stackoverflow.com/q/23237869
qo'shib qo'ydi muallif Mark Ireland, manba
Men imkon qadar (1) iloji boricha qochishni xohlayman. Muvaffaqiyatli jarayonlar haqida qisqacha ma'lumot bera olasizmi? Rahmat!
qo'shib qo'ydi muallif Jim Conant, manba
Bularning barchasini bajaradigan juda mashhur kutubxona bor. Uni melpada yoki githubda topishingiz mumkin: github.com/kiwanami/emacs-deferred . Agar sizda paketga aloqador narsalar bo'lsa, unda siz o'rnatilgan barcha yaxshi ehtimoli bor
qo'shib qo'ydi muallif Airsick, manba

1 javoblar

Quyidagidek boshlashingiz mumkin:

(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
qo'shib qo'ydi