+2005-12-16 L\e$,1 q\e(Brentey K\e,Aa\e(Broly <lorentey@elte.hu>
+
+ * bindings.el (last-buffer): Move to simple.el.
+ * simple.el (last-buffer): Move here.
+ (get-next-valid-buffer): New function.
+ (next-buffer): Use frame-local buffer list, maintain buried buffer list.
+ (prev-buffer): Ditto. Rename to `previous-buffer'.
+
+ * menu-bar.el (menu-bar-update-buffers): Update references to `prev-buffer'.
+ * bindings.el (global-map): Ditto.
+
2005-12-15 Luc Teirlinck <teirllm@auburn.edu>
* cus-edit.el: Introductory comment change.
(defvar mode-line-buffer-identification-keymap nil "\
Keymap for what is displayed by `mode-line-buffer-identification'.")
-(defun last-buffer () "\
-Return the last non-hidden buffer in the buffer list."
- ;; This logic is more or less copied from bury-buffer,
- ;; except that we reverse the buffer list.
- (let ((list (nreverse (buffer-list (selected-frame))))
- (pred (frame-parameter nil 'buffer-predicate))
- found notsogood)
- (while (and list (not found))
- (unless (or (eq (aref (buffer-name (car list)) 0) ? )
- ;; If the selected frame has a buffer_predicate,
- ;; disregard buffers that don't fit the predicate.
- (and pred (not (funcall pred (car list)))))
- (if (get-buffer-window (car list) 'visible)
- (or notsogood (eq (car list) (current-buffer)))
- (setq found (car list))))
- (pop list))
- (or found notsogood
- (get-buffer "*scratch*")
- (progn
- (set-buffer-major-mode
- (get-buffer-create "*scratch*"))
- (get-buffer "*scratch*")))))
-
(defun unbury-buffer () "\
Switch to the last buffer in the buffer list."
(interactive)
(define-key global-map [?\C-x right] 'next-buffer)
(define-key global-map [?\C-x C-right] 'next-buffer)
-(define-key global-map [?\C-x left] 'prev-buffer)
-(define-key global-map [?\C-x C-left] 'prev-buffer)
+(define-key global-map [?\C-x left] 'previous-buffer)
+(define-key global-map [?\C-x C-left] 'previous-buffer)
(let ((map minibuffer-local-map))
(define-key map "\en" 'next-history-element)
"Highlight (un)matching of parens and expressions."
:group 'matching)
+(defun get-next-valid-buffer (list &optional buffer visible-ok frame) "\
+Search LIST for a valid buffer to display in FRAME.
+Return nil when all buffers in LIST are undesirable for display,
+otherwise return the first suitable buffer in LIST.
+
+Buffers not visible in windows are preferred to visible buffers,
+unless VISIBLE-OK is non-nil.
+If the optional argument FRAME is nil, it defaults to the selected frame.
+If BUFFER is non-nil, ignore occurances of that buffer in LIST."
+ ;; This logic is more or less copied from other-buffer.
+ (setq frame (or frame (selected-frame)))
+ (let ((pred (frame-parameter frame 'buffer-predicate))
+ found buf)
+ (while (and (not found) list)
+ (setq buf (car list))
+ (if (and (not (eq buffer buf))
+ (buffer-live-p buf)
+ (or (null pred) (funcall pred buf))
+ (not (eq (aref (buffer-name buf) 0) ?\s))
+ (or visible-ok (null (get-buffer-window buf 'visible))))
+ (setq found buf)
+ (setq list (cdr list))))
+ (car list)))
+
+(defun last-buffer (&optional buffer visible-ok frame) "\
+Return the last non-hidden displayable buffer in the buffer list.
+If BUFFER is non-nil, last-buffer will ignore that buffer.
+Buffers not visible in windows are preferred to visible buffers,
+unless optional argument VISIBLE-OK is non-nil.
+If the optional third argument FRAME is non-nil, use that frame's
+buffer list instead of the selected frame's buffer list.
+If no other buffer exists, the buffer `*scratch*' is returned."
+ (setq frame (or frame (selected-frame)))
+ (or (get-next-valid-buffer (frame-parameter frame 'buried-buffer-list)
+ buffer visible-ok frame)
+ (get-next-valid-buffer (nreverse (buffer-list frame))
+ buffer visible-ok frame)
+ (progn
+ (set-buffer-major-mode (get-buffer-create "*scratch*"))
+ (get-buffer "*scratch*"))))
+
(defun next-buffer ()
"Switch to the next buffer in cyclic order."
(interactive)
- (let ((buffer (current-buffer)))
- (switch-to-buffer (other-buffer buffer))
- (bury-buffer buffer)))
-
-(defun prev-buffer ()
+ (let ((buffer (current-buffer))
+ (bbl (frame-parameter nil 'buried-buffer-list)))
+ (switch-to-buffer (other-buffer buffer t))
+ (bury-buffer buffer)
+ (set-frame-parameter nil 'buried-buffer-list
+ (cons buffer (delq buffer bbl)))))
+
+(defun previous-buffer ()
"Switch to the previous buffer in cyclic order."
(interactive)
- (let ((list (nreverse (buffer-list)))
- found)
- (while (and (not found) list)
- (let ((buffer (car list)))
- (if (and (not (get-buffer-window buffer))
- (not (string-match "\\` " (buffer-name buffer))))
- (setq found buffer)))
- (setq list (cdr list)))
- (switch-to-buffer found)))
+ (let ((buffer (last-buffer (current-buffer) t))
+ (bbl (frame-parameter nil 'buried-buffer-list)))
+ (switch-to-buffer buffer)
+ ;; Clean up buried-buffer-list up to and including the chosen buffer.
+ (while (and bbl (not (eq (car bbl) buffer)))
+ (setq bbl (cdr bbl)))
+ (set-frame-parameter nil 'buried-buffer-list bbl)))
+
\f
;;; next-error support framework