summaryrefslogtreecommitdiff
path: root/lisp/mouse.el
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1995-12-26 04:43:32 +0000
committerRichard M. Stallman <rms@gnu.org>1995-12-26 04:43:32 +0000
commit5508d14a20d052a597d94635522a274862df00fb (patch)
treef0ec2e40cdd29bc7dc24236eae9a52fd5e4edb65 /lisp/mouse.el
parenta98bf22e9a20cbb835614d4c661650cb404a70f4 (diff)
downloademacs-5508d14a20d052a597d94635522a274862df00fb.tar.gz
(mouse-buffer-menu): If lots of buffers, group them into multiple panes.
Diffstat (limited to 'lisp/mouse.el')
-rw-r--r--lisp/mouse.el97
1 files changed, 59 insertions, 38 deletions
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 98711f4e767..b91f0015263 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -1158,50 +1158,71 @@ This switches buffers in the window that you clicked on,
and selects that window."
(interactive "e")
(mouse-minibuffer-check event)
- (let ((menu
- (list "Buffer Menu"
- (cons "Select Buffer"
- (let ((tail (buffer-list))
- (maxbuf 0)
- head)
- (while tail
- (or (eq ?\ (aref (buffer-name (car tail)) 0))
- (setq maxbuf
- (max maxbuf
- (length (buffer-name (car tail))))))
- (setq tail (cdr tail)))
- (setq tail (buffer-list))
- (while tail
- (let ((elt (car tail)))
- (if (not (string-match "^ "
- (buffer-name elt)))
- (setq head
- (cons
- (cons
- (format
- (format "%%%ds %%s%%s %%s" maxbuf)
- (buffer-name elt)
- (if (buffer-modified-p elt) "*" " ")
- (save-excursion
- (set-buffer elt)
- (if buffer-read-only "%" " "))
- (or (buffer-file-name elt)
- (save-excursion
- (set-buffer elt)
- (if list-buffers-directory
- (expand-file-name
- list-buffers-directory)))
- ""))
- elt)
- head))))
- (setq tail (cdr tail)))
- (reverse head))))))
+ (let* ((buffers
+ ;; Make an alist of (MENU-ITEM . BUFFER).
+ (let ((tail (buffer-list))
+ (maxlen 0)
+ head)
+ (while tail
+ (or (eq ?\ (aref (buffer-name (car tail)) 0))
+ (setq maxlen
+ (max maxlen
+ (length (buffer-name (car tail))))))
+ (setq tail (cdr tail)))
+ (setq tail (buffer-list))
+ (while tail
+ (let ((elt (car tail)))
+ (if (not (string-match "^ "
+ (buffer-name elt)))
+ (setq head
+ (cons
+ (cons
+ (format
+ (format "%%%ds %%s%%s %%s" maxlen)
+ (buffer-name elt)
+ (if (buffer-modified-p elt) "*" " ")
+ (save-excursion
+ (set-buffer elt)
+ (if buffer-read-only "%" " "))
+ (or (buffer-file-name elt)
+ (save-excursion
+ (set-buffer elt)
+ (if list-buffers-directory
+ (expand-file-name
+ list-buffers-directory)))
+ ""))
+ elt)
+ head))))
+ (setq tail (cdr tail)))
+ head))
+ (menu
+ ;; If we have lots of buffers, divide them into groups of 20
+ ;; and make a pane (or submenu) for each one.
+ (if (> (length buffers) 30)
+ (let ((buffers (reverse buffers)) sublists next
+ (i 1))
+ (while buffers
+ ;; Pull off the next 20 buffers
+ ;; and make them the next element of sublist.
+ (setq next (nthcdr 20 buffers))
+ (if next
+ (setcdr (nthcdr 19 buffers) nil))
+ (setq sublists (cons (cons (format "Buffers %d" i) buffers)
+ sublists))
+ (setq i (1+ i))
+ (setq buffers next))
+ (cons "Buffer Menu" (nreverse sublists)))
+ ;; Few buffers--put them all in one pane.
+ (list "Buffer Menu" (cons "Select Buffer" buffers)))))
+ (setq foo menu)
(let ((buf (x-popup-menu event menu))
(window (posn-window (event-start event))))
(if buf
(progn
(or (framep window) (select-window window))
(switch-to-buffer buf))))))
+
+(defun mouse-buffer-menu-split (alist)
;;; These need to be rewritten for the new scroll bar implementation.