]> git.eshelyaron.com Git - emacs.git/commitdiff
Set the current buffer in esh-mode before running filter functions
authorSteven Allen <steven@stebalien.com>
Sun, 16 Aug 2020 12:31:27 +0000 (14:31 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 16 Aug 2020 12:31:27 +0000 (14:31 +0200)
* lisp/eshell/esh-mode.el: (eshell-output-filter): Match
current-buffer behavior of comint-output-filter (bug#42870).

This change (a) sets the current buffer to the process-buffer when
invoking preoutput filter functions and (b) only invokes them when the
process-buffer is live. Otherwise, the preoutput filter functions be
invoked in whatever buffer happens to be focused, breaking hooks that
read buffer-local variables.

lisp/eshell/esh-mode.el

index d0147b345aa4592ca2ce0748f06485981d36cc42..8799007c5962b531bae6cd8c8c6e5f82bcaa5f64 100644 (file)
@@ -690,46 +690,47 @@ newline."
   "Send the output from PROCESS (STRING) to the interactive display.
 This is done after all necessary filtering has been done."
   (let ((oprocbuf (if process (process-buffer process)
-                   (current-buffer)))
-       (inhibit-point-motion-hooks t)
-       (inhibit-modification-hooks t))
-    (let ((functions eshell-preoutput-filter-functions))
-      (while (and functions string)
-       (setq string (funcall (car functions) string))
-       (setq functions (cdr functions))))
-    (if (and string oprocbuf (buffer-name oprocbuf))
-       (let (opoint obeg oend)
-         (with-current-buffer oprocbuf
-           (setq opoint (point))
-           (setq obeg (point-min))
-           (setq oend (point-max))
-           (let ((buffer-read-only nil)
-                 (nchars (length string))
-                 (ostart nil))
-             (widen)
-             (goto-char eshell-last-output-end)
-             (setq ostart (point))
-             (if (<= (point) opoint)
-                 (setq opoint (+ opoint nchars)))
-             (if (< (point) obeg)
-                 (setq obeg (+ obeg nchars)))
-             (if (<= (point) oend)
-                 (setq oend (+ oend nchars)))
+                    (current-buffer)))
+        (inhibit-point-motion-hooks t)
+        (inhibit-modification-hooks t))
+    (when (and string oprocbuf (buffer-name oprocbuf))
+      (with-current-buffer oprocbuf
+        (let ((functions eshell-preoutput-filter-functions))
+          (while (and functions string)
+            (setq string (funcall (car functions) string))
+            (setq functions (cdr functions))))
+        (when string
+          (let (opoint obeg oend)
+            (setq opoint (point))
+            (setq obeg (point-min))
+            (setq oend (point-max))
+            (let ((buffer-read-only nil)
+                  (nchars (length string))
+                  (ostart nil))
+              (widen)
+              (goto-char eshell-last-output-end)
+              (setq ostart (point))
+              (if (<= (point) opoint)
+                  (setq opoint (+ opoint nchars)))
+              (if (< (point) obeg)
+                  (setq obeg (+ obeg nchars)))
+              (if (<= (point) oend)
+                  (setq oend (+ oend nchars)))
               ;; Let the ansi-color overlay hooks run.
               (let ((inhibit-modification-hooks nil))
                 (insert-before-markers string))
-             (if (= (window-start) (point))
-                 (set-window-start (selected-window)
-                                   (- (point) nchars)))
-             (if (= (point) eshell-last-input-end)
-                 (set-marker eshell-last-input-end
-                             (- eshell-last-input-end nchars)))
-             (set-marker eshell-last-output-start ostart)
-             (set-marker eshell-last-output-end (point))
-             (force-mode-line-update))
-           (narrow-to-region obeg oend)
-           (goto-char opoint)
-           (eshell-run-output-filters))))))
+              (if (= (window-start) (point))
+                  (set-window-start (selected-window)
+                                    (- (point) nchars)))
+              (if (= (point) eshell-last-input-end)
+                  (set-marker eshell-last-input-end
+                              (- eshell-last-input-end nchars)))
+              (set-marker eshell-last-output-start ostart)
+              (set-marker eshell-last-output-end (point))
+              (force-mode-line-update))
+            (narrow-to-region obeg oend)
+            (goto-char opoint)
+            (eshell-run-output-filters)))))))
 
 (defun eshell-run-output-filters ()
   "Run the `eshell-output-filter-functions' on the current output."