aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Love2000-08-15 11:19:13 +0000
committerDave Love2000-08-15 11:19:13 +0000
commita4a49c21ec068d1e79f548f94489d11457c75baa (patch)
tree3f0027563861206651b62f58ff0af7e374d4d7e0
parentdc7904f533d38b5a9f2b0be7aa90fd0e859aeb6d (diff)
downloademacs-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.el178
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)