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:
committed by
Juri Linkov
parent
d2d5e54824
commit
699081f051
@@ -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)))))))
|
||||
|
||||
Reference in New Issue
Block a user