]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix deferred display of async shell-command buffers
authorBasil L. Contovounesios <contovob@tcd.ie>
Sat, 3 Feb 2018 21:22:51 +0000 (23:22 +0200)
committerJuri Linkov <juri@linkov.net>
Sat, 3 Feb 2018 21:22:51 +0000 (23:22 +0200)
* 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)

lisp/simple.el

index 3ac6b86381cc1e9e72e82d7c9904e96ae8de977d..e2deceb4c262d0c5734322fec1218b0e4de5c86c 100644 (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)))))))