diff --git a/lisp/window.el b/lisp/window.el index edca4a2da5..d55123bbd2 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -8119,6 +8119,7 @@ display-buffer--action-function-custom-type (const display-buffer-reuse-window) (const display-buffer-pop-up-window) (const display-buffer-same-window) + (const display-buffer-reuse-or-same-window) (const display-buffer-pop-up-frame) (const display-buffer-in-child-frame) (const display-buffer-below-selected) @@ -8248,6 +8249,16 @@ display-buffer--same-window-action Specifies to call `display-buffer-same-window'.") (put 'display-buffer--same-window-action 'risky-local-variable t) +(defvar display-buffer--reuse-or-same-window-action + '((display-buffer-reuse-window + display-buffer-same-window) + (inhibit-same-window . nil)) + "A `display-buffer' action for reusing a window or using the same one. +If a window showing the buffer exists already, reuse that window. +Otherwise, use preferably the selected window. Specifies to call +`display-buffer-reuse-or-same-window'.") +(put 'display-buffer--reuse-or-same-window-action 'risky-local-variable t) + (defvar display-buffer--other-frame-action '((display-buffer-reuse-window display-buffer-pop-up-frame) @@ -8266,7 +8277,9 @@ display-buffer `display-buffer-same-window' -- Use the selected window. `display-buffer-reuse-window' -- Use a window already showing the buffer. - `display-buffer-in-previous-window' -- Use a window that did +`display-buffer-reuse-or-same-window' -- Either reuse a window or + use the selected one. +`display-buffer-in-previous-window' -- Use a window that did show the buffer before. `display-buffer-use-some-window' -- Use some existing window. `display-buffer-use-least-recent-window' -- Try to avoid re-using @@ -8505,6 +8518,20 @@ display-buffer-same-window (window-dedicated-p)) (window--display-buffer buffer (selected-window) 'reuse alist))) +(defun display-buffer-reuse-or-same-window (buffer alist) + "Display BUFFER reusing a window showing it or the selected one. +ALIST is an association list of action symbols and values. See +Info node `(elisp) Buffer Display Action Alists' for details of +such alists. + +First try to use a window already showing BUFFER. If no such +window exists, do like `display-buffer-same-window'." + (or (display-buffer-reuse-window buffer alist) + (unless (or (cdr (assq 'inhibit-same-window alist)) + (window-minibuffer-p) + (window-dedicated-p)) + (window--display-buffer buffer (selected-window) 'reuse alist)))) + (defun display-buffer--maybe-same-window (buffer alist) "Conditionally display BUFFER in the selected window. ALIST is an association list of action symbols and values. See @@ -9339,6 +9366,13 @@ pop-to-buffer-same-window another window." (pop-to-buffer buffer display-buffer--same-window-action norecord)) +(defun pop-to-buffer-reuse-or-same-window (buffer &optional norecord) + "Select specified BUFFER in a window showing it or the same one. +This is like `pop-to-buffer-same-window', but tries first to +reuse a window already showing BUFFER and only if no such window +exists behaves like `pop-to-buffer-same-window'." + (pop-to-buffer buffer display-buffer--reuse-or-same-window-action norecord)) + (defun read-buffer-to-switch (prompt) "Read the name of a buffer to switch to, prompting with PROMPT. Return the name of the buffer as a string.