aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/mouse.el35
1 files 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
1310 :type 'integer 1310 :type 'integer
1311 :group 'mouse) 1311 :group 'mouse)
1312 1312
1313(defcustom mouse-buffer-menu-mode-mult 4
1314 "*Group the buffers by the major mode groups on \\[mouse-buffer-menu]?
1315This number which determines (in a hairy way) whether \\[mouse-buffer-menu]
1316will split the buffer menu by the major modes (see
1317`mouse-buffer-menu-mode-groups') or just by menu length.
1318Set to 1 (or even 0!) if you want to group by major mode always, and to
1319a large number if you prefer a mixed multitude. The default is 4."
1320 :type 'integer
1321 :group 'mouse
1322 :version "20.3")
1323
1313(defvar mouse-buffer-menu-mode-groups 1324(defvar mouse-buffer-menu-mode-groups
1314 '(("Info\\|Help\\|Apropos\\|Man" . "Help") 1325 '(("Info\\|Help\\|Apropos\\|Man" . "Help")
1315 ("\\bVM\\b\\|\\bMH\\b\\|Message\\|Mail\\|Group\\|Score\\|Summary\\|Article" 1326 ("\\bVM\\b\\|\\bMH\\b\\|Message\\|Mail\\|Group\\|Score\\|Summary\\|Article"
@@ -1329,8 +1340,7 @@ This switches buffers in the window that you clicked on,
1329and selects that window." 1340and selects that window."
1330 (interactive "e") 1341 (interactive "e")
1331 (mouse-minibuffer-check event) 1342 (mouse-minibuffer-check event)
1332 (let (buffers alist menu split-by-major-mode sum-of-squares) 1343 (let ((buffers (buffer-list)) alist menu split-by-major-mode sum-of-squares)
1333 (setq buffers (buffer-list))
1334 ;; Make an alist of elements that look like (MENU-ITEM . BUFFER). 1344 ;; Make an alist of elements that look like (MENU-ITEM . BUFFER).
1335 (let ((tail buffers)) 1345 (let ((tail buffers))
1336 (while tail 1346 (while tail
@@ -1359,10 +1369,10 @@ and selects that window."
1359 (while tail 1369 (while tail
1360 (setq sum-of-squares 1370 (setq sum-of-squares
1361 (+ sum-of-squares 1371 (+ sum-of-squares
1362 (* (length (cdr (cdr (car tail)))) 1372 (let ((len (length (cdr (cdr (car tail)))))) (* len len))))
1363 (length (cdr (cdr (car tail)))))))
1364 (setq tail (cdr tail)))) 1373 (setq tail (cdr tail))))
1365 (if (< (* sum-of-squares 4) (* (length buffers) (length buffers))) 1374 (if (< (* sum-of-squares mouse-buffer-menu-mode-mult)
1375 (* (length buffers) (length buffers)))
1366 ;; Subdividing by major modes really helps, so let's do it. 1376 ;; Subdividing by major modes really helps, so let's do it.
1367 (let (subdivided-menus (buffers-left (length buffers))) 1377 (let (subdivided-menus (buffers-left (length buffers)))
1368 ;; Sort the list to put the most popular major modes first. 1378 ;; Sort the list to put the most popular major modes first.
@@ -1392,23 +1402,20 @@ and selects that window."
1392 (cons (cons 1402 (cons (cons
1393 "Others" 1403 "Others"
1394 (mouse-buffer-menu-alist 1404 (mouse-buffer-menu-alist
1395 (apply 'append 1405 ;; we don't need split-by-major-mode any
1396 (mapcar 'cdr 1406 ;; more, so we can ditch it with nconc.
1397 (mapcar 'cdr split-by-major-mode))))) 1407 (apply 'nconc (mapcar 'cddr split-by-major-mode))))
1398 subdivided-menus))) 1408 subdivided-menus)))
1399 (setq subdivided-menus 1409 (setq menu (cons "Buffer Menu" (nreverse subdivided-menus))))
1400 (nreverse subdivided-menus))
1401 (setq menu (cons "Buffer Menu" subdivided-menus)))
1402 (progn 1410 (progn
1403 (setq alist (mouse-buffer-menu-alist buffers)) 1411 (setq alist (mouse-buffer-menu-alist buffers))
1404 (setq menu (cons "Buffer Menu" 1412 (setq menu (cons "Buffer Menu"
1405 (mouse-buffer-menu-split "Select Buffer" alist))))) 1413 (mouse-buffer-menu-split "Select Buffer" alist)))))
1406 (let ((buf (x-popup-menu event menu)) 1414 (let ((buf (x-popup-menu event menu))
1407 (window (posn-window (event-start event)))) 1415 (window (posn-window (event-start event))))
1408 (if buf 1416 (when buf
1409 (progn
1410 (or (framep window) (select-window window)) 1417 (or (framep window) (select-window window))
1411 (switch-to-buffer buf)))))) 1418 (switch-to-buffer buf)))))
1412 1419
1413(defun mouse-buffer-menu-alist (buffers) 1420(defun mouse-buffer-menu-alist (buffers)
1414 (let (tail 1421 (let (tail