Emacs 是单线程的并且在到达“安全点”之前不会处理外部输入(例如关于进程状态的变化)。所以上面的循环(正如@juanleon 建议的那样)“太紧了”。您想在sleep
其中添加一个。
但更好的做法是set-process-sentinel
让 Emacs 在进程结束时得到通知,而不是忙着等待。例如:
...start a new process stored in proc...
(push proc my-list-of-running-processes)
(set-process-sentinel proc #'my-run-when-its-over)
...
(defun my-run-when-its-over (proc msg)
(setq my-list-of-running-processes (delq proc my-list-of-running-processes))
(unless my-list-of-running-processes
(message "Haha! all my processes are done!")))
另请注意,您可能不想使用process-list
,因为它可能包含不相关的过程(例如,如果您使用M-x shell
或其他各种东西),这就是我在my-list-of-running-processes
上面使用的原因。