diff options
| author | Dave Love | 2000-08-15 11:19:13 +0000 |
|---|---|---|
| committer | Dave Love | 2000-08-15 11:19:13 +0000 |
| commit | a4a49c21ec068d1e79f548f94489d11457c75baa (patch) | |
| tree | 3f0027563861206651b62f58ff0af7e374d4d7e0 | |
| parent | dc7904f533d38b5a9f2b0be7aa90fd0e859aeb6d (diff) | |
| download | emacs-a4a49c21ec068d1e79f548f94489d11457c75baa.tar.gz emacs-a4a49c21ec068d1e79f548f94489d11457c75baa.zip | |
(msb--few-menus, msb--very-many-menus): Use current Gnus
modes.
(msb--init-file-alist, msb--aggregate-alist, msb--add-separators):
Fix previous change to mapcan.
(msb--init-file-alist, msb--add-separators)
(msb--make-keymap-menu): Simplify.
(msb--choose-file-menu): Use copy-sequence.
(msb-mode-map): Add title to keymap.
(msb-unload-hook): New function.
| -rw-r--r-- | lisp/msb.el | 178 |
1 files changed, 87 insertions, 91 deletions
diff --git a/lisp/msb.el b/lisp/msb.el index fface2e29b4..463d6edbc8f 100644 --- a/lisp/msb.el +++ b/lisp/msb.el | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | ;;; msb.el --- Customizable buffer-selection with multiple menus. | 1 | ;;; msb.el --- Customizable buffer-selection with multiple menus. |
| 2 | 2 | ||
| 3 | ;; Copyright (C) 1993, 94, 95, 97, 98, 99 Free Software Foundation, Inc. | 3 | ;; Copyright (C) 1993, 94, 95, 97, 98, 99, 2000 Free Software Foundation, Inc. |
| 4 | 4 | ||
| 5 | ;; Author: Lars Lindberg <Lars.G.Lindberg@capgemini.se> | 5 | ;; Author: Lars Lindberg <Lars.G.Lindberg@capgemini.se> |
| 6 | ;; Maintainer: FSF | 6 | ;; Maintainer: FSF |
| @@ -108,16 +108,12 @@ | |||
| 108 | ((eq major-mode 'w3-mode) | 108 | ((eq major-mode 'w3-mode) |
| 109 | 4020 | 109 | 4020 |
| 110 | "WWW (%d)") | 110 | "WWW (%d)") |
| 111 | ((or (memq major-mode '(rmail-mode rmail-edit-mode vm-summary-mode vm-mode mail-mode)) | 111 | ((or (memq major-mode |
| 112 | (memq major-mode '(mh-letter-mode | 112 | '(rmail-mode rmail-edit-mode vm-summary-mode vm-mode mail-mode)) |
| 113 | mh-show-mode | 113 | (memq major-mode '(mh-letter-mode mh-show-mode mh-folder-mode)) |
| 114 | mh-folder-mode)) | 114 | (memq major-mode |
| 115 | (memq major-mode '(gnus-summary-mode | 115 | '(gnus-summary-mode message-mode gnus-group-mode |
| 116 | news-reply-mode | 116 | gnus-article-mode score-mode gnus-browse-killed-mode))) |
| 117 | gnus-group-mode | ||
| 118 | gnus-article-mode | ||
| 119 | gnus-kill-file-mode | ||
| 120 | gnus-browse-killed-mode))) | ||
| 121 | 4010 | 117 | 4010 |
| 122 | "Mail (%d)") | 118 | "Mail (%d)") |
| 123 | ((not buffer-file-name) | 119 | ((not buffer-file-name) |
| @@ -163,15 +159,11 @@ | |||
| 163 | ((eq major-mode 'w3-mode) | 159 | ((eq major-mode 'w3-mode) |
| 164 | 5020 | 160 | 5020 |
| 165 | "WWW (%d)") | 161 | "WWW (%d)") |
| 166 | ((or (memq major-mode '(rmail-mode rmail-edit-mode vm-summary-mode vm-mode mail-mode)) | 162 | ((or (memq major-mode |
| 167 | (memq major-mode '(mh-letter-mode | 163 | '(rmail-mode rmail-edit-mode vm-summary-mode vm-mode mail-mode)) |
| 168 | mh-show-mode | 164 | (memq major-mode '(mh-letter-mode mh-show-mode mh-folder-mode)) |
| 169 | mh-folder-mode)) | 165 | (memq major-mode '(gnus-summary-mode message-mode gnus-group-mode |
| 170 | (memq major-mode '(gnus-summary-mode | 166 | gnus-article-mode score-mode |
| 171 | news-reply-mode | ||
| 172 | gnus-group-mode | ||
| 173 | gnus-article-mode | ||
| 174 | gnus-kill-file-mode | ||
| 175 | gnus-browse-killed-mode))) | 167 | gnus-browse-killed-mode))) |
| 176 | 5010 | 168 | 5010 |
| 177 | "Mail (%d)") | 169 | "Mail (%d)") |
| @@ -381,8 +373,7 @@ Set this to nil or t if you don't want any sorting (faster)." | |||
| 381 | (const :tag "Newest first" t) | 373 | (const :tag "Newest first" t) |
| 382 | (const :tag "Oldest first" nil)) | 374 | (const :tag "Oldest first" nil)) |
| 383 | :set 'msb-custom-set | 375 | :set 'msb-custom-set |
| 384 | :group 'msb | 376 | :group 'msb) |
| 385 | ) | ||
| 386 | 377 | ||
| 387 | (defcustom msb-files-by-directory nil | 378 | (defcustom msb-files-by-directory nil |
| 388 | "*Non-nil means that files should be sorted by directory. | 379 | "*Non-nil means that files should be sorted by directory. |
| @@ -524,37 +515,41 @@ If the argument is left out or nil, then the current buffer is considered." | |||
| 524 | ;; Make alist that looks like | 515 | ;; Make alist that looks like |
| 525 | ;; ((PATH-1 BUFFER-1) (PATH-2 BUFFER-2) ...) | 516 | ;; ((PATH-1 BUFFER-1) (PATH-2 BUFFER-2) ...) |
| 526 | ;; sorted on PATH-x | 517 | ;; sorted on PATH-x |
| 527 | (sort (mapcar | 518 | (sort |
| 528 | (lambda (buffer) | 519 | (apply #'nconc |
| 529 | (let ((file-name (expand-file-name (buffer-file-name buffer)))) | 520 | (mapcar |
| 530 | (when file-name | 521 | (lambda (buffer) |
| 531 | (list (cons (msb--strip-dir file-name) buffer))))) | 522 | (let ((file-name (expand-file-name |
| 532 | list) | 523 | (buffer-file-name buffer)))) |
| 533 | (lambda (item1 item2) | 524 | (when file-name |
| 534 | (string< (car item1) (car item2)))))) | 525 | (list (cons (msb--strip-dir file-name) buffer))))) |
| 526 | list)) | ||
| 527 | (lambda (item1 item2) | ||
| 528 | (string< (car item1) (car item2)))))) | ||
| 535 | ;; Now clump buffers together that have the same path | 529 | ;; Now clump buffers together that have the same path |
| 536 | ;; Make alist that looks like | 530 | ;; Make alist that looks like |
| 537 | ;; ((PATH1 . (BUFFER-1 BUFFER-2 ...)) (PATH2 . (BUFFER-K)) ...) | 531 | ;; ((PATH1 . (BUFFER-1 BUFFER-2 ...)) (PATH2 . (BUFFER-K)) ...) |
| 538 | (let ((path nil) | 532 | (let ((path nil) |
| 539 | (buffers nil)) | 533 | (buffers nil)) |
| 540 | (nconc | 534 | (nconc |
| 541 | (mapcar (lambda (item) | 535 | (apply |
| 542 | (cond | 536 | #'nconc |
| 543 | ((and path | 537 | (mapcar (lambda (item) |
| 544 | (string= path (car item))) | 538 | (cond |
| 545 | ;; The same path as earlier: Add to current list of | 539 | ((equal path (car item)) |
| 546 | ;; buffers. | 540 | ;; The same path as earlier: Add to current list of |
| 547 | (push (cdr item) buffers) | 541 | ;; buffers. |
| 548 | ;; This item should not be added to list | 542 | (push (cdr item) buffers) |
| 549 | nil) | 543 | ;; This item should not be added to list |
| 550 | (t | 544 | nil) |
| 551 | ;; New path | 545 | (t |
| 552 | (let ((result (and path (cons path buffers)))) | 546 | ;; New path |
| 553 | (setq path (car item)) | 547 | (let ((result (and path (cons path buffers)))) |
| 554 | (setq buffers (list (cdr item))) | 548 | (setq path (car item)) |
| 555 | ;; Add the last result the list. | 549 | (setq buffers (list (cdr item))) |
| 556 | (and result (list result)))))) | 550 | ;; Add the last result the list. |
| 557 | buffer-alist) | 551 | (and result (list result)))))) |
| 552 | buffer-alist)) | ||
| 558 | ;; Add the last result to the list | 553 | ;; Add the last result to the list |
| 559 | (list (cons path buffers)))))) | 554 | (list (cons path buffers)))))) |
| 560 | 555 | ||
| @@ -583,7 +578,7 @@ If the argument is left out or nil, then the current buffer is considered." | |||
| 583 | rest (cdr buffer-alist) | 578 | rest (cdr buffer-alist) |
| 584 | path (car first) | 579 | path (car first) |
| 585 | buffers (cdr first)) | 580 | buffers (cdr first)) |
| 586 | (setq msb--choose-file-menu-list (apply #'list rest)) | 581 | (setq msb--choose-file-menu-list (copy-sequence rest)) |
| 587 | ;; This big loop tries to clump buffers together that have a | 582 | ;; This big loop tries to clump buffers together that have a |
| 588 | ;; similar name. Remember that buffer-alist is sorted based on the | 583 | ;; similar name. Remember that buffer-alist is sorted based on the |
| 589 | ;; path for the buffers. | 584 | ;; path for the buffers. |
| @@ -688,7 +683,7 @@ See `msb-menu-cond' for a description of its elements." | |||
| 688 | (sorter (if (or (fboundp tmp-s) | 683 | (sorter (if (or (fboundp tmp-s) |
| 689 | (null tmp-s) | 684 | (null tmp-s) |
| 690 | (eq tmp-s t)) | 685 | (eq tmp-s t)) |
| 691 | tmp-s | 686 | tmp-s |
| 692 | msb-item-sort-function))) | 687 | msb-item-sort-function))) |
| 693 | (when (< (length menu-cond-elt) 3) | 688 | (when (< (length menu-cond-elt) 3) |
| 694 | (error "Wrong format of msb-menu-cond")) | 689 | (error "Wrong format of msb-menu-cond")) |
| @@ -807,7 +802,9 @@ results in | |||
| 807 | (first-time-p t) | 802 | (first-time-p t) |
| 808 | old-car) | 803 | old-car) |
| 809 | (nconc | 804 | (nconc |
| 810 | (mapcar (lambda (item) | 805 | (apply #'nconc |
| 806 | (mapcar | ||
| 807 | (lambda (item) | ||
| 811 | (cond | 808 | (cond |
| 812 | (first-time-p | 809 | (first-time-p |
| 813 | (push (cdr item) same) | 810 | (push (cdr item) same) |
| @@ -824,7 +821,7 @@ results in | |||
| 824 | old-car (car item)) | 821 | old-car (car item)) |
| 825 | (list (cons tmp-old-car (nreverse tmp-same)))))) | 822 | (list (cons tmp-old-car (nreverse tmp-same)))))) |
| 826 | (sort alist (lambda (item1 item2) | 823 | (sort alist (lambda (item1 item2) |
| 827 | (funcall sort-predicate (car item1) (car item2))))) | 824 | (funcall sort-predicate (car item1) (car item2)))))) |
| 828 | (list (cons old-car (nreverse same))))))) | 825 | (list (cons old-car (nreverse same))))))) |
| 829 | 826 | ||
| 830 | 827 | ||
| @@ -965,9 +962,9 @@ It takes the form ((TITLE . BUFFER-LIST)...)." | |||
| 965 | (list (cons 'toggle | 962 | (list (cons 'toggle |
| 966 | (cons | 963 | (cons |
| 967 | (if msb-files-by-directory | 964 | (if msb-files-by-directory |
| 968 | "*Files by type*" | 965 | "*Files by type*" |
| 969 | "*Files by directory*") | 966 | "*Files by directory*") |
| 970 | 'msb--toggle-menu-type))))))) | 967 | 'msb--toggle-menu-type))))))) |
| 971 | 968 | ||
| 972 | (defun msb--create-buffer-menu () | 969 | (defun msb--create-buffer-menu () |
| 973 | (save-match-data | 970 | (save-match-data |
| @@ -1017,7 +1014,8 @@ variable `msb-menu-cond'." | |||
| 1017 | (mouse-select-buffer event)) | 1014 | (mouse-select-buffer event)) |
| 1018 | ((and (numberp (car choice)) | 1015 | ((and (numberp (car choice)) |
| 1019 | (null (cdr choice))) | 1016 | (null (cdr choice))) |
| 1020 | (let ((msb--last-buffer-menu (nthcdr 3 (assq (car choice) msb--last-buffer-menu)))) | 1017 | (let ((msb--last-buffer-menu (nthcdr 3 (assq (car choice) |
| 1018 | msb--last-buffer-menu)))) | ||
| 1021 | (mouse-select-buffer event))) | 1019 | (mouse-select-buffer event))) |
| 1022 | ((while (numberp (car choice)) | 1020 | ((while (numberp (car choice)) |
| 1023 | (setq choice (cdr choice)))) | 1021 | (setq choice (cdr choice)))) |
| @@ -1031,26 +1029,25 @@ variable `msb-menu-cond'." | |||
| 1031 | 1029 | ||
| 1032 | ;; Add separators | 1030 | ;; Add separators |
| 1033 | (defun msb--add-separators (sorted-list) | 1031 | (defun msb--add-separators (sorted-list) |
| 1034 | (cond | 1032 | (if (or (not msb-separator-diff) |
| 1035 | ((or (not msb-separator-diff) | 1033 | (not (numberp msb-separator-diff))) |
| 1036 | (not (numberp msb-separator-diff))) | 1034 | sorted-list |
| 1037 | sorted-list) | ||
| 1038 | (t | ||
| 1039 | (let ((last-key nil)) | 1035 | (let ((last-key nil)) |
| 1040 | (mapcar | 1036 | (apply #'nconc |
| 1041 | (lambda (item) | 1037 | (mapcar |
| 1042 | (cond | 1038 | (lambda (item) |
| 1043 | ((and msb-separator-diff | 1039 | (cond |
| 1044 | last-key | 1040 | ((and msb-separator-diff |
| 1045 | (> (- (car item) last-key) | 1041 | last-key |
| 1046 | msb-separator-diff)) | 1042 | (> (- (car item) last-key) |
| 1047 | (setq last-key (car item)) | 1043 | msb-separator-diff)) |
| 1048 | (list (cons last-key 'separator) | 1044 | (setq last-key (car item)) |
| 1049 | item)) | 1045 | (list (cons last-key 'separator) |
| 1050 | (t | 1046 | item)) |
| 1051 | (setq last-key (car item)) | 1047 | (t |
| 1052 | (list item)))) | 1048 | (setq last-key (car item)) |
| 1053 | sorted-list))))) | 1049 | (list item)))) |
| 1050 | sorted-list))))) | ||
| 1054 | 1051 | ||
| 1055 | (defun msb--split-menus-2 (list mcount result) | 1052 | (defun msb--split-menus-2 (list mcount result) |
| 1056 | (cond | 1053 | (cond |
| @@ -1061,22 +1058,21 @@ variable `msb-menu-cond'." | |||
| 1061 | (while (< count msb-max-menu-items) | 1058 | (while (< count msb-max-menu-items) |
| 1062 | (push (pop list) tmp-list) | 1059 | (push (pop list) tmp-list) |
| 1063 | (incf count)) | 1060 | (incf count)) |
| 1064 | (setq tmp-list (nreverse tmp-list)) | 1061 | (setq tmp-list (nreverse tmp-list)) |
| 1065 | (setq sub-name (concat (car (car tmp-list)) "...")) | 1062 | (setq sub-name (concat (car (car tmp-list)) "...")) |
| 1066 | (push (nconc (list mcount sub-name | 1063 | (push (nconc (list mcount sub-name |
| 1067 | 'keymap sub-name) | 1064 | 'keymap sub-name) |
| 1068 | tmp-list) | 1065 | tmp-list) |
| 1069 | result)) | 1066 | result)) |
| 1070 | (msb--split-menus-2 list (1+ mcount) result)) | 1067 | (msb--split-menus-2 list (1+ mcount) result)) |
| 1071 | ((null result) | 1068 | ((null result) |
| 1072 | list) | 1069 | list) |
| 1073 | (t | 1070 | (t |
| 1074 | (let (sub-name) | 1071 | (let (sub-name) |
| 1075 | (setq sub-name (concat (car (car list)) "...")) | 1072 | (setq sub-name (concat (car (car list)) "...")) |
| 1076 | (push (nconc (list mcount sub-name | 1073 | (push (nconc (list mcount sub-name 'keymap sub-name) |
| 1077 | 'keymap sub-name) | 1074 | list) |
| 1078 | list) | 1075 | result)) |
| 1079 | result)) | ||
| 1080 | (nreverse result)))) | 1076 | (nreverse result)))) |
| 1081 | 1077 | ||
| 1082 | (defun msb--split-menus (list) | 1078 | (defun msb--split-menus (list) |
| @@ -1094,12 +1090,9 @@ variable `msb-menu-cond'." | |||
| 1094 | ((eq 'separator sub-menu) | 1090 | ((eq 'separator sub-menu) |
| 1095 | (list 'separator "--")) | 1091 | (list 'separator "--")) |
| 1096 | (t | 1092 | (t |
| 1097 | (let ((buffers (mapcar (function | 1093 | (let ((buffers (mapcar (lambda (item) |
| 1098 | (lambda (item) | 1094 | (cons (buffer-name (cdr item)) |
| 1099 | (let ((string (car item)) | 1095 | (cons (car item) end))) |
| 1100 | (buffer (cdr item))) | ||
| 1101 | (cons (buffer-name buffer) | ||
| 1102 | (cons string end))))) | ||
| 1103 | (cdr sub-menu)))) | 1096 | (cdr sub-menu)))) |
| 1104 | (nconc (list (incf mcount) (car sub-menu) | 1097 | (nconc (list (incf mcount) (car sub-menu) |
| 1105 | 'keymap (car sub-menu)) | 1098 | 'keymap (car sub-menu)) |
| @@ -1151,7 +1144,7 @@ variable `msb-menu-cond'." | |||
| 1151 | ;; Snarf current bindings of `mouse-buffer-menu' (normally | 1144 | ;; Snarf current bindings of `mouse-buffer-menu' (normally |
| 1152 | ;; C-down-mouse-1). | 1145 | ;; C-down-mouse-1). |
| 1153 | (defvar msb-mode-map | 1146 | (defvar msb-mode-map |
| 1154 | (let ((map (make-sparse-keymap))) | 1147 | (let ((map (make-sparse-keymap "Msb"))) |
| 1155 | (mapcar (lambda (key) | 1148 | (mapcar (lambda (key) |
| 1156 | (define-key map key #'msb)) | 1149 | (define-key map key #'msb)) |
| 1157 | (where-is-internal 'mouse-buffer-menu (make-sparse-keymap))) | 1150 | (where-is-internal 'mouse-buffer-menu (make-sparse-keymap))) |
| @@ -1175,6 +1168,9 @@ different buffer menu using the function `msb'." | |||
| 1175 | (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)) | 1168 | (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)) |
| 1176 | (run-hooks 'menu-bar-update-hook)) | 1169 | (run-hooks 'menu-bar-update-hook)) |
| 1177 | 1170 | ||
| 1171 | (defun msb-unload-hook () | ||
| 1172 | (msb-mode 0)) | ||
| 1173 | |||
| 1178 | (add-to-list 'minor-mode-map-alist (cons 'msb-mode msb-mode-map)) | 1174 | (add-to-list 'minor-mode-map-alist (cons 'msb-mode msb-mode-map)) |
| 1179 | 1175 | ||
| 1180 | (provide 'msb) | 1176 | (provide 'msb) |