emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Buffer listing in multiple frames/ttys


From: Károly Lőrentey
Subject: Re: Buffer listing in multiple frames/ttys
Date: Sun, 11 Dec 2005 17:53:21 +0100
User-agent: Gnus/5.110004 (No Gnus v0.4) Emacs/22.0.52 (gnu/linux)

Richard Stallman <address@hidden> writes:
> It could be an ordinary frame parameter, if only previous-buffer will
> access it.  But I don't like the idea of changing primitives such as
> switch-to-buffer, bury-buffer, and kill-buffer.  Not now.

Below is an updated version of the patch without such low-level
changes.  If people find no problems, I'll install it on the CVS
trunk.

*** orig/lisp/bindings.el
--- mod/lisp/bindings.el
***************
*** 338,366 ****
  (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)
--- 338,343 ----
***************
*** 673,680 ****
  
  (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)
  
  (let ((map minibuffer-local-map))
    (define-key map "\en"   'next-history-element)
--- 650,657 ----
  
  (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] 'previous-buffer)
! (define-key global-map [?\C-x C-left] 'previous-buffer)
  
  (let ((map minibuffer-local-map))
    (define-key map "\en"   'next-history-element)


*** orig/lisp/menu-bar.el
--- mod/lisp/menu-bar.el
***************
*** 1662,1671 ****
                             "Next Buffer"
                             'next-buffer
                             :help "Switch to the \"next\" buffer in a cyclic 
order")
!                      (list 'prev-buffer
                             'menu-item
                             "Previous Buffer"
!                            'prev-buffer
                             :help "Switch to the \"previous\" buffer in a 
cyclic order")
                       (list 'select-named-buffer
                             'menu-item
--- 1662,1671 ----
                             "Next Buffer"
                             'next-buffer
                             :help "Switch to the \"next\" buffer in a cyclic 
order")
!                      (list 'previous-buffer
                             'menu-item
                             "Previous Buffer"
!                            'previous-buffer
                             :help "Switch to the \"previous\" buffer in a 
cyclic order")
                       (list 'select-named-buffer
                             'menu-item


*** orig/lisp/simple.el
--- mod/lisp/simple.el
***************
*** 52,75 ****
    "Highlight (un)matching of parens and expressions."
    :group 'matching)
  
  (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 ()
    "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)))
  
  ;;; next-error support framework
--- 52,118 ----
    "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))
!       (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 ((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)))
! 
  
  ;;; next-error support framework
-- 
Károly

Attachment: pgp8Nwgim0sep.pgp
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]