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)
This commit is contained in:
Basil L. Contovounesios 2018-02-03 23:22:51 +02:00 committed by Juri Linkov
parent d2d5e54824
commit 699081f051

View file

@ -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)
bname))
(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)
nonce)
(display-buffer buf))))
`((name . ,nonce)))))))
;; Otherwise, command is executed synchronously.
(shell-command-on-region (point) (point) command
output-buffer nil error-buffer)))))))