Fix use of 'display-buffer-alist' for Info buffers

* lisp/info.el (info-pop-to-buffer): New function.
(info-other-window, info, Info-find-node, Info-revert-find-node)
(Info-next, Info-prev, Info-up, info-display-manual): Call
'info-pop-to-buffer'.  (Bug#68081)
This commit is contained in:
Martin Rudalics 2024-01-03 11:35:25 +01:00 committed by Eli Zaretskii
parent 657275529e
commit d3a4fe5694

View file

@ -732,8 +732,53 @@ in `Info-file-supports-index-cookies-list'."
(read-file-name "Info file name: " nil nil t))
(if (numberp current-prefix-arg)
(format "*info*<%s>" current-prefix-arg))))
(info-setup file-or-node
(switch-to-buffer-other-window (or buffer "*info*"))))
(info-pop-to-buffer file-or-node buffer t))
(defun info-pop-to-buffer (&optional file-or-node buffer-or-name other-window)
"Put Info node FILE-OR-NODE in specified buffer and display it.
Optional argument FILE-OR-NODE is as for `info'.
If the optional argument BUFFER-OR-NAME is a buffer, use that
buffer. If it is a string, use that string as the name of the
buffer, creating it if it does not exist. Otherwise, use a
buffer with the name `*info*', creating it if it does not exist.
Optional argument OTHER-WINDOW nil means to prefer the selected
window. OTHER-WINDOW non-nil means to prefer another window.
Select the window used, if it has been made."
(let ((buffer (cond
((bufferp buffer-or-name)
buffer-or-name)
((stringp buffer-or-name)
(get-buffer-create buffer-or-name))
(t
(get-buffer-create "*info*")))))
(with-current-buffer buffer
(unless (derived-mode-p 'Info-mode)
(Info-mode)))
(let* ((window
(display-buffer buffer
(if other-window
'(nil (inhibit-same-window . t))
'(display-buffer-same-window)))))
(with-current-buffer buffer
(if file-or-node
;; If argument already contains parentheses, don't add another set
;; since the argument will then be parsed improperly. This also
;; has the added benefit of allowing node names to be included
;; following the parenthesized filename.
(Info-goto-node
(if (and (stringp file-or-node) (string-match "(.*)" file-or-node))
file-or-node
(concat "(" file-or-node ")")))
(if (and (zerop (buffer-size))
(null Info-history))
;; If we just created the Info buffer, go to the directory.
(Info-directory))))
(when window
(select-window window)))))
;;;###autoload (put 'info 'info-file (purecopy "emacs"))
;;;###autoload
@ -768,8 +813,8 @@ See a list of available Info commands in `Info-mode'."
;; of names that might have been wrapped (in emails, etc.).
(setq file-or-node
(string-replace "\n" " " file-or-node)))
(info-setup file-or-node
(pop-to-buffer-same-window (or buffer "*info*"))))
(info-pop-to-buffer file-or-node buffer))
(defun info-setup (file-or-node buffer)
"Display Info node FILE-OR-NODE in BUFFER."
@ -789,6 +834,8 @@ See a list of available Info commands in `Info-mode'."
;; If we just created the Info buffer, go to the directory.
(Info-directory))))
(make-obsolete 'info-setup "use `info-pop-to-buffer' instead" "30.1")
;;;###autoload
(defun info-emacs-manual ()
"Display the Emacs manual in Info mode."
@ -927,7 +974,7 @@ If NOERROR, inhibit error messages when we can't find the node."
(setq nodename (info--node-canonicalize-whitespace nodename))
(setq filename (Info-find-file filename noerror))
;; Go into Info buffer.
(or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*"))
(or (derived-mode-p 'Info-mode) (info-pop-to-buffer filename))
;; Record the node we are leaving, if we were in one.
(and (not no-going-back)
Info-current-file
@ -957,7 +1004,7 @@ otherwise, that defaults to `Top'."
"Go to an Info node FILENAME and NODENAME, re-reading disk contents.
When *info* is already displaying FILENAME and NODENAME, the window position
is preserved, if possible."
(or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*"))
(or (derived-mode-p 'Info-mode) (info-pop-to-buffer filename))
(let ((old-filename Info-current-file)
(old-nodename Info-current-node)
(window-selected (eq (selected-window) (get-buffer-window)))
@ -2290,7 +2337,7 @@ This command doesn't descend into sub-nodes, like \\<Info-mode-map>\\[Info-forwa
(interactive nil Info-mode)
;; In case another window is currently selected
(save-window-excursion
(or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*"))
(or (derived-mode-p 'Info-mode) (info-pop-to-buffer))
(Info-goto-node (Info-extract-pointer "next"))))
(defun Info-prev ()
@ -2299,7 +2346,7 @@ This command doesn't go up to the parent node, like \\<Info-mode-map>\\[Info-bac
(interactive nil Info-mode)
;; In case another window is currently selected
(save-window-excursion
(or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*"))
(or (derived-mode-p 'Info-mode) (info-pop-to-buffer))
(Info-goto-node (Info-extract-pointer "prev[ious]*" "previous"))))
(defun Info-up (&optional same-file)
@ -2308,7 +2355,7 @@ If SAME-FILE is non-nil, do not move to a different Info file."
(interactive nil Info-mode)
;; In case another window is currently selected
(save-window-excursion
(or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*"))
(or (derived-mode-p 'Info-mode) (info-pop-to-buffer))
(let ((old-node Info-current-node)
(old-file Info-current-file)
(node (Info-extract-pointer "up")) p)
@ -5485,7 +5532,7 @@ completion alternatives to currently visited manuals."
(raise-frame (window-frame window))
(select-frame-set-input-focus (window-frame window))
(select-window window))
(switch-to-buffer found)))
(info-pop-to-buffer nil found)))
;; The buffer doesn't exist; create it.
(info-initialize)
(info (Info-find-file manual)