From cd87a5c7a18ee0fd956ccc151ace85874a8404b1 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Fri, 13 May 2022 16:58:59 +0200 Subject: [PATCH] Don't clear out local variables in `with-help-window' * 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 | 5 +++- lisp/help.el | 59 ++++++++++++++++++++++------------------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lisp/help-mode.el b/lisp/help-mode.el index 4a65f40507b..0e4d48e1531 100644 --- a/lisp/help-mode.el +++ b/lisp/help-mode.el @@ -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)))) diff --git a/lisp/help.el b/lisp/help.el index d9f364e1adb..83782a84775 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -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. -- 2.39.2