Commit 699081f0 authored by Basil L. Contovounesios's avatar Basil L. Contovounesios Committed by Juri Linkov

Fix deferred display of async shell-command buffers

* lisp/simple.el (shell-command): Display async shell buffer on
process output for every, not just first, command invocation.  Check
buffer liveness, not name, before displaying. (bug#30213, bug#30280)
parent d2d5e548
......@@ -3547,14 +3547,20 @@ the use of a shell (with its need to quote arguments)."
;; carriage motion (see comint-inhibit-carriage-motion).
(set-process-filter proc 'comint-output-filter)
(if async-shell-command-display-buffer
;; Display buffer immediately.
(display-buffer buffer '(nil (allow-no-window . t)))
(add-function :before (process-filter proc)
(lambda (process _string)
(let ((buf (process-buffer process)))
(when (and (zerop (buffer-size buf))
(string= (buffer-name buf)
(display-buffer buf))))))))
;; Defer displaying buffer until first process output.
;; Use disposable named advice so that the buffer is
;; displayed at most once per process lifetime.
(let ((nonce (make-symbol "nonce")))
(add-function :before (process-filter proc)
(lambda (proc _string)
(let ((buf (process-buffer proc)))
(when (buffer-live-p buf)
(remove-function (process-filter proc)
(display-buffer buf))))
`((name . ,nonce)))))))
;; Otherwise, command is executed synchronously.
(shell-command-on-region (point) (point) command
output-buffer nil error-buffer)))))))
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment