changeset 46517:a308cb6a79fd

(last-buffer): Handle buffer-list and buffer-predicate frame parameters like bury-buffer.
author Richard M. Stallman <rms@gnu.org>
date Thu, 18 Jul 2002 14:58:53 +0000
parents 25e7debccc64
children c6ca69a1c8d3
files lisp/bindings.el
diffstat 1 files changed, 20 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/bindings.el	Thu Jul 18 14:57:46 2002 +0000
+++ b/lisp/bindings.el	Thu Jul 18 14:58:53 2002 +0000
@@ -275,10 +275,26 @@
 
 (defun last-buffer () "\
 Return the last non-hidden buffer in the buffer list."
-  (let ((list (reverse (buffer-list))))
-    (while (eq (aref (buffer-name (car list)) 0) ? )
-      (setq list (cdr list)))
-    (car list)))
+  ;; This logic is more or less copied from bury-buffer,
+  ;; except that we reverse the buffer list.
+  (let ((fbl  (frame-parameter 'buffer-list))
+	(list (buffer-list))
+	(pred (frame-parameter nil 'buffer-predicate))
+	found notsogood)
+    ;; Merge the frame buffer list with the whole buffer list,
+    ;; and reverse it.
+    (dolist (buffer fbl)
+      (setq list (delq buffer list)))
+    (setq list (nreverse (append fbl list)))
+    (while (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)
+	    (unless notsogood (setq notsogood (car list)))
+	  (setq found (car list)))))
+    (or found notsogood)))
 
 (defun unbury-buffer () "\
 Switch to the last buffer in the buffer list."