]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix use of 'display-buffer-alist' for Info buffers
authorMartin Rudalics <rudalics@gmx.at>
Wed, 3 Jan 2024 10:35:25 +0000 (11:35 +0100)
committerEli Zaretskii <eliz@gnu.org>
Sat, 6 Jan 2024 09:49:36 +0000 (11:49 +0200)
* 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)

lisp/info.el

index 39ca88c358cefd74eaf3601012ce0e143338562a..f438493415510a6ad7878c578b26561996b47203 100644 (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)