Commit dcb6e7b3 authored by Martin Rudalics's avatar Martin Rudalics
Browse files

Optionally avoid that switching to previous or next buffer shows that buffer twice.

* window.el (switch-to-visible-buffer): New option.
(switch-to-prev-buffer, switch-to-next-buffer): Observe
switch-to-visible-buffer.  Make sure that checking for a window
showing a buffer already is done on the same frame.

* windows.texi (Window History): Describe new option
switch-to-visible-buffer.
parent 4fb9a543
2012-03-27 Martin Rudalics <rudalics@gmx.at>
* windows.texi (Window History): Describe new option
switch-to-visible-buffer.
2012-03-27 Glenn Morris <rgm@gnu.org> 2012-03-27 Glenn Morris <rgm@gnu.org>
* searching.texi (String Search): Add xref to Emacs manual. * searching.texi (String Search): Add xref to Emacs manual.
......
...@@ -2073,7 +2073,8 @@ or killed or has been already shown by a recent invocation of ...@@ -2073,7 +2073,8 @@ or killed or has been already shown by a recent invocation of
If repeated invocations of this command have already shown all buffers If repeated invocations of this command have already shown all buffers
previously shown in @var{window}, further invocations will show buffers previously shown in @var{window}, further invocations will show buffers
from the buffer list of the frame @var{window} appears on (@pxref{The from the buffer list of the frame @var{window} appears on (@pxref{The
Buffer List}). Buffer List}) trying to skip buffers that are already shown in another
window on that frame.
@end deffn @end deffn
@deffn Command switch-to-next-buffer &optional window @deffn Command switch-to-next-buffer &optional window
...@@ -2087,6 +2088,19 @@ can be undone, this function tries to show a buffer from the buffer list ...@@ -2087,6 +2088,19 @@ can be undone, this function tries to show a buffer from the buffer list
of the frame @var{window} appears on (@pxref{The Buffer List}). of the frame @var{window} appears on (@pxref{The Buffer List}).
@end deffn @end deffn
By default @code{switch-to-prev-buffer} and @code{switch-to-next-buffer}
can switch to a buffer that is already shown in another window on the
same frame. The following option can be used to override that behavior.
@defopt switch-to-visible-buffer
If this variable is non-@code{nil}, @code{switch-to-prev-buffer} and
@code{switch-to-next-buffer} may switch to a buffer that is already
visible on the same frame, provided the buffer was shown in the argument
window before. If it's @code{nil}, @code{switch-to-prev-buffer} and
@code{switch-to-next-buffer} always try to avoid switching to a buffer
that is already visible in another window on the same frame.
@end defopt
@node Dedicated Windows @node Dedicated Windows
@section Dedicated Windows @section Dedicated Windows
......
2012-03-27 Martin Rudalics <rudalics@gmx.at>
* window.el (switch-to-visible-buffer): New option.
(switch-to-prev-buffer, switch-to-next-buffer): Observe
switch-to-visible-buffer. Make sure that checking for a window
showing a buffer already is done on the same frame.
2012-03-27 Glenn Morris <rgm@gnu.org> 2012-03-27 Glenn Morris <rgm@gnu.org>
* startup.el (mail-host-address): Doc fix. * startup.el (mail-host-address): Doc fix.
......
...@@ -2575,6 +2575,18 @@ before was current this also makes BUFFER the current buffer." ...@@ -2575,6 +2575,18 @@ before was current this also makes BUFFER the current buffer."
(when point (when point
(set-window-point-1 window point)))) (set-window-point-1 window point))))
(defcustom switch-to-visible-buffer t
"If non-nil, allow switching to an already visible buffer.
If this variable is non-nil, `switch-to-prev-buffer' and
`switch-to-next-buffer' may switch to an already visible buffer
provided the buffer was shown in the argument window before. If
this variable is nil, `switch-to-prev-buffer' and
`switch-to-next-buffer' always try to avoid switching to a buffer
that is already visible in another window on the same frame."
:type 'boolean
:version "24.1"
:group 'windows)
(defun switch-to-prev-buffer (&optional window bury-or-kill) (defun switch-to-prev-buffer (&optional window bury-or-kill)
"In WINDOW switch to previous buffer. "In WINDOW switch to previous buffer.
WINDOW must be a live window and defaults to the selected one. WINDOW must be a live window and defaults to the selected one.
...@@ -2584,6 +2596,7 @@ shown in WINDOW is about to be buried or killed and consequently ...@@ -2584,6 +2596,7 @@ shown in WINDOW is about to be buried or killed and consequently
shall not be switched to in future invocations of this command." shall not be switched to in future invocations of this command."
(interactive) (interactive)
(let* ((window (window-normalize-window window t)) (let* ((window (window-normalize-window window t))
(frame (window-frame window))
(old-buffer (window-buffer window)) (old-buffer (window-buffer window))
;; Save this since it's destroyed by `set-window-buffer'. ;; Save this since it's destroyed by `set-window-buffer'.
(next-buffers (window-next-buffers window)) (next-buffers (window-next-buffers window))
...@@ -2602,14 +2615,13 @@ shall not be switched to in future invocations of this command." ...@@ -2602,14 +2615,13 @@ shall not be switched to in future invocations of this command."
(not (eq new-buffer old-buffer)) (not (eq new-buffer old-buffer))
(or bury-or-kill (or bury-or-kill
(not (memq new-buffer next-buffers)))) (not (memq new-buffer next-buffers))))
;; _DO_ show visible buffers as advertized in Elisp manual 28.14 (if (and (not switch-to-visible-buffer)
;; on `switch-to-prev-buffer' & `switch-to-next-buffer' (get-buffer-window new-buffer frame))
;;(if (get-buffer-window new-buffer) ;; Try to avoid showing a buffer visible in some other window.
;; ;; Try to avoid showing a buffer visible in some other window. (setq visible new-buffer)
;; (setq visible new-buffer)
(set-window-buffer-start-and-point (set-window-buffer-start-and-point
window new-buffer (nth 1 entry) (nth 2 entry)) window new-buffer (nth 1 entry) (nth 2 entry))
(throw 'found t))) (throw 'found t))))
;; Scan reverted buffer list of WINDOW's frame next, skipping ;; Scan reverted buffer list of WINDOW's frame next, skipping
;; entries of next buffers. Note that when we bury or kill a ;; entries of next buffers. Note that when we bury or kill a
;; buffer we don't reverse the global buffer list to avoid showing ;; buffer we don't reverse the global buffer list to avoid showing
...@@ -2617,15 +2629,16 @@ shall not be switched to in future invocations of this command." ...@@ -2617,15 +2629,16 @@ shall not be switched to in future invocations of this command."
;; buffer list in order to make sure that switching to the ;; buffer list in order to make sure that switching to the
;; previous/next buffer traverse it in opposite directions. ;; previous/next buffer traverse it in opposite directions.
(dolist (buffer (if bury-or-kill (dolist (buffer (if bury-or-kill
(buffer-list (window-frame window)) (buffer-list frame)
(nreverse (buffer-list (window-frame window))))) (nreverse (buffer-list frame))))
(when (and (buffer-live-p buffer) (when (and (buffer-live-p buffer)
(not (eq buffer old-buffer)) (not (eq buffer old-buffer))
(not (eq (aref (buffer-name buffer) 0) ?\s)) (not (eq (aref (buffer-name buffer) 0) ?\s))
(or bury-or-kill (not (memq buffer next-buffers)))) (or bury-or-kill (not (memq buffer next-buffers))))
(if (get-buffer-window buffer) (if (get-buffer-window buffer frame)
;; Try to avoid showing a buffer visible in some other window. ;; Try to avoid showing a buffer visible in some other window.
(setq visible buffer) (unless visible
(setq visible buffer))
(setq new-buffer buffer) (setq new-buffer buffer)
(set-window-buffer-start-and-point window new-buffer) (set-window-buffer-start-and-point window new-buffer)
(throw 'found t)))) (throw 'found t))))
...@@ -2678,6 +2691,7 @@ shall not be switched to in future invocations of this command." ...@@ -2678,6 +2691,7 @@ shall not be switched to in future invocations of this command."
WINDOW must be a live window and defaults to the selected one." WINDOW must be a live window and defaults to the selected one."
(interactive) (interactive)
(let* ((window (window-normalize-window window t)) (let* ((window (window-normalize-window window t))
(frame (window-frame window))
(old-buffer (window-buffer window)) (old-buffer (window-buffer window))
(next-buffers (window-next-buffers window)) (next-buffers (window-next-buffers window))
new-buffer entry killed-buffers visible) new-buffer entry killed-buffers visible)
...@@ -2698,11 +2712,11 @@ WINDOW must be a live window and defaults to the selected one." ...@@ -2698,11 +2712,11 @@ WINDOW must be a live window and defaults to the selected one."
(throw 'found t))) (throw 'found t)))
;; Scan the buffer list of WINDOW's frame next, skipping previous ;; Scan the buffer list of WINDOW's frame next, skipping previous
;; buffers entries. ;; buffers entries.
(dolist (buffer (buffer-list (window-frame window))) (dolist (buffer (buffer-list frame))
(when (and (buffer-live-p buffer) (not (eq buffer old-buffer)) (when (and (buffer-live-p buffer) (not (eq buffer old-buffer))
(not (eq (aref (buffer-name buffer) 0) ?\s)) (not (eq (aref (buffer-name buffer) 0) ?\s))
(not (assq buffer (window-prev-buffers window)))) (not (assq buffer (window-prev-buffers window))))
(if (get-buffer-window buffer) (if (get-buffer-window buffer frame)
;; Try to avoid showing a buffer visible in some other window. ;; Try to avoid showing a buffer visible in some other window.
(setq visible buffer) (setq visible buffer)
(setq new-buffer buffer) (setq new-buffer buffer)
...@@ -2716,9 +2730,14 @@ WINDOW must be a live window and defaults to the selected one." ...@@ -2716,9 +2730,14 @@ WINDOW must be a live window and defaults to the selected one."
(not (setq killed-buffers (not (setq killed-buffers
(cons new-buffer killed-buffers)))) (cons new-buffer killed-buffers))))
(not (eq new-buffer old-buffer))) (not (eq new-buffer old-buffer)))
(set-window-buffer-start-and-point (if (and (not switch-to-visible-buffer)
window new-buffer (nth 1 entry) (nth 2 entry)) (get-buffer-window new-buffer frame))
(throw 'found t))) ;; Try to avoid showing a buffer visible in some other window.
(unless visible
(setq visible new-buffer))
(set-window-buffer-start-and-point
window new-buffer (nth 1 entry) (nth 2 entry))
(throw 'found t))))
;; Show a buffer visible in another window. ;; Show a buffer visible in another window.
(when visible (when visible
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment