Subject: bug#8911: bs-cycle-next deletes window in some cases.

From: Juanma Barranquero <[email-masked]>
Date: Mon, 27 Jun 2011 22:11:52 +0200

This code, which is mostly Martin's, fixes case 2. The user can
override the "signal error" behavior by customizing
display-buffer-alist or adding

(push '(((label . bs-cycle-next)
         (label . bs-cycle-previous))
        reuse-window
        (reuse-window same nil nil)
        (reuse-window-dedicated . t)
        (override . t))
      display-buffer-alist)

to their .emacs.

OK to install?

   J

=== modified file 'lisp/bs.el'
--- lisp/bs.el	2011-06-27 01:52:37 +0000
+++ lisp/bs.el	2011-06-27 19:59:41 +0000
@@ -1190,6 +1190,15 @@
 (defvar bs--cycle-list nil
   "Current buffer list used for cycling.")

+(defun bs--reuse-window-unless-dedicated (buffer &rest _args)
+ "Display BUFFER in the selected window.
+If the selected window is dedicated, signal an error instead.
+This function is intended to be called from `display-buffer'.
+To override it, see `display-buffer-alist'."
+ (if (and (window-dedicated-p) (not (eq (window-buffer) buffer)))
+     (error "Selected window is dedicated to its buffer")
+   (display-buffer-same-window buffer)))
+
 ;;;###autoload
 (defun bs-cycle-next ()
   "Select next buffer defined by buffer cycling.
@@ -1215,7 +1224,9 @@
         ;; We don't want the frame iconified if the only window in the frame
         ;; happens to be dedicated.
         (bury-buffer (current-buffer))
-	(switch-to-buffer next)
+	(display-buffer next
+			'((fun-with-args bs--reuse-window-unless-dedicated))
+			'bs-cycle-next)
 	(setq bs--cycle-list (append (cdr cycle-list)
 				     (list (car cycle-list))))
 	(bs-message-without-log "Next buffers: %s"
@@ -1244,7 +1255,9 @@
 					    bs--cycle-list)))
 	     (prev-buffer (car tupel))
 	     (cycle-list (cdr tupel)))
-	(switch-to-buffer prev-buffer)
+	(display-buffer prev-buffer
+			'((fun-with-args bs--reuse-window-unless-dedicated))
+			'bs-cycle-previous)
 	(setq bs--cycle-list (append (last cycle-list)
 				     (reverse (cdr (reverse cycle-list)))))
 	(bs-message-without-log "Previous buffers: %s"