diff options
| -rw-r--r-- | lisp/mouse.el | 35 |
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]? | ||
| 1315 | This number which determines (in a hairy way) whether \\[mouse-buffer-menu] | ||
| 1316 | will split the buffer menu by the major modes (see | ||
| 1317 | `mouse-buffer-menu-mode-groups') or just by menu length. | ||
| 1318 | Set to 1 (or even 0!) if you want to group by major mode always, and to | ||
| 1319 | a 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, | |||
| 1329 | and selects that window." | 1340 | and 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 |