]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't clear out local variables in `with-help-window'
authorLars Ingebrigtsen <larsi@gnus.org>
Fri, 13 May 2022 14:58:59 +0000 (16:58 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 13 May 2022 15:14:36 +0000 (17:14 +0200)
* lisp/help-mode.el (help-mode-setup): Declare obsolete.
(help-mode-finish): Ditto.

* lisp/help.el (with-help-window): Don't be a wrapper around
`with-temp-buffer-window', because that made the macro big and
difficult to understand.
(help--window-setup): Implement the relevant bits from
`with-temp-buffer-window'.  Also don't clear out local variables,
because that makes things like `text-scale-mode' not work (bug#25979).

lisp/help-mode.el
lisp/help.el

index 4a65f40507b2d7c9a84bf7eb4efc0aedfbb44108..0e4d48e1531adbabf9382e8c17450d8abdf050e9 100644 (file)
@@ -422,12 +422,15 @@ Commands:
 ;;;###autoload
 (defun help-mode-setup ()
   "Enter Help mode in the current buffer."
-  (help-mode)
+  (declare (obsolete nil "29.1"))
+  (unless (derived-mode-p 'help-mode)
+    (help-mode))
   (setq buffer-read-only nil))
 
 ;;;###autoload
 (defun help-mode-finish ()
   "Finalize Help mode setup in current buffer."
+  (declare (obsolete nil "29.1"))
   (when (derived-mode-p 'help-mode)
     (setq buffer-read-only t)
     (help-make-xrefs (current-buffer))))
index d9f364e1adb610b180a4da2096c3c4ad63bf6f3e..83782a847750348146a00afddc8500c5ee59cdb2 100644 (file)
@@ -1938,40 +1938,37 @@ Return VALUE."
     ;; Return VALUE.
     value))
 
-;; `with-help-window' is a wrapper for `with-temp-buffer-window'
-;; providing the following additional twists:
-
-;; (1) It puts the buffer in `help-mode' (via `help-mode-setup') and
-;;     adds cross references (via `help-mode-finish').
-
-;; (2) It issues a message telling how to scroll and quit the help
-;;     window (via `help-window-setup').
-
-;; (3) An option (customizable via `help-window-select') to select the
-;;     help window automatically.
-
-;; (4) A marker (`help-window-point-marker') to move point in the help
-;;     window to an arbitrary buffer position.
 (defmacro with-help-window (buffer-or-name &rest body)
   "Evaluate BODY, send output to BUFFER-OR-NAME and show in a help window.
-This construct is like `with-temp-buffer-window', which see, but unlike
-that, it puts the buffer specified by BUFFER-OR-NAME in `help-mode' and
-displays a message about how to delete the help window when it's no
-longer needed.  The help window will be selected if
-`help-window-select' is non-nil.
-Most of this is done by `help-window-setup', which see."
+The return value from BODY will be returned.
+
+The help window will be selected if `help-window-select' is
+non-nil.
+
+The `temp-buffer-window-setup-hook' hook is called."
   (declare (indent 1) (debug t))
-  `(progn
-     ;; Make `help-window-point-marker' point nowhere.  The only place
-     ;; where this should be set to a buffer position is within BODY.
-     (set-marker help-window-point-marker nil)
-     (let ((temp-buffer-window-setup-hook
-           (cons 'help-mode-setup temp-buffer-window-setup-hook))
-          (temp-buffer-window-show-hook
-           (cons 'help-mode-finish temp-buffer-window-show-hook)))
-       (setq help-window-old-frame (selected-frame))
-       (with-temp-buffer-window
-       ,buffer-or-name nil 'help-window-setup (progn ,@body)))))
+  `(help--window-setup ,buffer-or-name (lambda () ,@body)))
+
+(defun help--window-setup (buffer callback)
+  ;; Make `help-window-point-marker' point nowhere.  The only place
+  ;; where this should be set to a buffer position is within BODY.
+  (set-marker help-window-point-marker nil)
+  (with-current-buffer (get-buffer-create buffer)
+    (setq buffer-read-only t
+          buffer-file-name nil)
+    (buffer-disable-undo)
+    (let ((inhibit-read-only t)
+         (inhibit-modification-hooks t))
+      (erase-buffer)
+      (delete-all-overlays)
+      (prog1
+          (let ((standard-output (current-buffer)))
+            (funcall callback)
+            (run-hooks 'temp-buffer-window-setup-hook))
+        (help-window-setup (temp-buffer-window-show (current-buffer)))
+        (unless (derived-mode-p 'help-mode)
+          (help-mode))
+        (help-make-xrefs (current-buffer))))))
 
 ;; Called from C, on encountering `help-char' when reading a char.
 ;; Don't print to *Help*; that would clobber Help history.