Executar comandos no Emacs de forma assíncrona, mas exibir saída incrementalmente
Eu tenho uma função de utilidade:
(defun execute-in-buffer (command-with-args buffer)
"Execute a string COMMAND-WITH-ARGS representing a shell command with arguments,
inserting the results in BUFFER."
(switch-to-buffer buffer)
(insert (format ">>> %s\n" command-with-args))
(let* ((command-args-list (s-split " " command-with-args))
(command (car command-args-list))
(args (cdr command-args-list)))
(apply 'call-process command nil buffer t args)))
Isso me permite fazer coisas como(execute-in-buffer "ls /" (get-buffer-create "*my-output*")
. No entanto, não é adequado para comandos lentos. Se eu chamar uma série de comandos lentos, não obtenho nenhuma saída até o final:
(let ((buf (get-buffer-create "*my-output")))
(execute-in-buffer "sleep 10" buf)
(execute-in-buffer "ls /" buf))
Eu quero ser capaz de chamar de forma síncrona, então o próximo comando só é executado após o anterior terminar. No entanto, quero ver a saída dos meus comandos enquanto eles são executados. Como eu faria isso?
(O código de exemplo é apenas para mostrar, estou feliz em deixá-lo em favor de outra coisa.)