From 3ca87c7b46c3ed7ea34f3eca5a3bbb93946c10e9 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Mon, 20 Apr 1998 20:45:25 +0000 Subject: [PATCH] (mouse-buffer-menu-mode-mult): New variable. (mouse-buffer-menu): Obey mouse-buffer-menu-mode-mult. Also avoid some consing. --- lisp/mouse.el | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/lisp/mouse.el b/lisp/mouse.el index 8d3c775c7ec..bc5f8475b77 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -1310,6 +1310,17 @@ If we have lots of buffers, divide them into groups of :type 'integer :group 'mouse) +(defcustom mouse-buffer-menu-mode-mult 4 + "*Group the buffers by the major mode groups on \\[mouse-buffer-menu]? +This number which determines (in a hairy way) whether \\[mouse-buffer-menu] +will split the buffer menu by the major modes (see +`mouse-buffer-menu-mode-groups') or just by menu length. +Set to 1 (or even 0!) if you want to group by major mode always, and to +a large number if you prefer a mixed multitude. The default is 4." + :type 'integer + :group 'mouse + :version "20.3") + (defvar mouse-buffer-menu-mode-groups '(("Info\\|Help\\|Apropos\\|Man" . "Help") ("\\bVM\\b\\|\\bMH\\b\\|Message\\|Mail\\|Group\\|Score\\|Summary\\|Article" @@ -1329,8 +1340,7 @@ This switches buffers in the window that you clicked on, and selects that window." (interactive "e") (mouse-minibuffer-check event) - (let (buffers alist menu split-by-major-mode sum-of-squares) - (setq buffers (buffer-list)) + (let ((buffers (buffer-list)) alist menu split-by-major-mode sum-of-squares) ;; Make an alist of elements that look like (MENU-ITEM . BUFFER). (let ((tail buffers)) (while tail @@ -1359,10 +1369,10 @@ and selects that window." (while tail (setq sum-of-squares (+ sum-of-squares - (* (length (cdr (cdr (car tail)))) - (length (cdr (cdr (car tail))))))) + (let ((len (length (cdr (cdr (car tail)))))) (* len len)))) (setq tail (cdr tail)))) - (if (< (* sum-of-squares 4) (* (length buffers) (length buffers))) + (if (< (* sum-of-squares mouse-buffer-menu-mode-mult) + (* (length buffers) (length buffers))) ;; Subdividing by major modes really helps, so let's do it. (let (subdivided-menus (buffers-left (length buffers))) ;; Sort the list to put the most popular major modes first. @@ -1392,23 +1402,20 @@ and selects that window." (cons (cons "Others" (mouse-buffer-menu-alist - (apply 'append - (mapcar 'cdr - (mapcar 'cdr split-by-major-mode))))) + ;; we don't need split-by-major-mode any + ;; more, so we can ditch it with nconc. + (apply 'nconc (mapcar 'cddr split-by-major-mode)))) subdivided-menus))) - (setq subdivided-menus - (nreverse subdivided-menus)) - (setq menu (cons "Buffer Menu" subdivided-menus))) + (setq menu (cons "Buffer Menu" (nreverse subdivided-menus)))) (progn (setq alist (mouse-buffer-menu-alist buffers)) (setq menu (cons "Buffer Menu" (mouse-buffer-menu-split "Select Buffer" alist))))) (let ((buf (x-popup-menu event menu)) (window (posn-window (event-start event)))) - (if buf - (progn + (when buf (or (framep window) (select-window window)) - (switch-to-buffer buf)))))) + (switch-to-buffer buf))))) (defun mouse-buffer-menu-alist (buffers) (let (tail -- 2.39.2