comparison lisp/msb.el @ 91073:4bc33ffdda1a

Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 902-908) - Update from CVS - Merge from emacs--rel--22 * emacs--rel--22 (patch 131-137) - Update from CVS - Merge from gnus--rel--5.10 * gnus--rel--5.10 (patch 261-262) - Update from CVS Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-278
author Miles Bader <miles@gnu.org>
date Sat, 27 Oct 2007 09:12:07 +0000
parents f55f9811f5d7 a14b49f75b09
children 880960b70474
comparison
equal deleted inserted replaced
91072:74ab3ea909f9 91073:4bc33ffdda1a
452 452
453 453
454 (defun msb-sort-by-directory (item1 item2) 454 (defun msb-sort-by-directory (item1 item2)
455 "Sort the items ITEM1 and ITEM2 by directory name. Made for dired. 455 "Sort the items ITEM1 and ITEM2 by directory name. Made for dired.
456 An item look like (NAME . BUFFER)." 456 An item look like (NAME . BUFFER)."
457 (string-lessp (save-excursion (set-buffer (cdr item1)) 457 (string-lessp (with-current-buffer (cdr item1)
458 (msb--dired-directory)) 458 (msb--dired-directory))
459 (save-excursion (set-buffer (cdr item2)) 459 (with-current-buffer (cdr item2)
460 (msb--dired-directory)))) 460 (msb--dired-directory))))
461 461
462 ;;; 462 ;;;
463 ;;; msb 463 ;;; msb
464 ;;; 464 ;;;
465 ;;; This function can be used instead of (mouse-buffer-menu EVENT) 465 ;;; This function can be used instead of (mouse-buffer-menu EVENT)
579 ;; similar name. Remember that buffer-alist is sorted based on the 579 ;; similar name. Remember that buffer-alist is sorted based on the
580 ;; directory name of the buffers' visited files. 580 ;; directory name of the buffers' visited files.
581 (while rest 581 (while rest
582 (let ((found-p nil) 582 (let ((found-p nil)
583 (tmp-rest rest) 583 (tmp-rest rest)
584 result 584 item)
585 new-dir item)
586 (setq item (car tmp-rest)) 585 (setq item (car tmp-rest))
587 ;; Clump together the "rest"-buffers that have a dir that is 586 ;; Clump together the "rest"-buffers that have a dir that is
588 ;; a subdir of the current one. 587 ;; a subdir of the current one.
589 (while (and tmp-rest 588 (while (and tmp-rest
590 (<= (length buffers) max-clumped-together) 589 (<= (length buffers) max-clumped-together)
743 ;; This is all side-effects, folks! 742 ;; This is all side-effects, folks!
744 ;; This should be optimized. 743 ;; This should be optimized.
745 (unless (and (not msb-display-invisible-buffers-p) 744 (unless (and (not msb-display-invisible-buffers-p)
746 (msb-invisible-buffer-p buffer)) 745 (msb-invisible-buffer-p buffer))
747 (condition-case nil 746 (condition-case nil
748 (save-excursion 747 (with-current-buffer buffer
749 (set-buffer buffer)
750 ;; Menu found. Add to this menu 748 ;; Menu found. Add to this menu
751 (dolist (info (msb--collect function-info-vector)) 749 (dolist (info (msb--collect function-info-vector))
752 (msb--add-to-menu buffer info max-buffer-name-length))) 750 (msb--add-to-menu buffer info max-buffer-name-length)))
753 (error (unless msb--error 751 (error (unless msb--error
754 (setq msb--error 752 (setq msb--error
789 (lambda (item1 item2) 787 (lambda (item1 item2)
790 (string< (symbol-name item1) (symbol-name item2)))) 788 (string< (symbol-name item1) (symbol-name item2))))
791 results in 789 results in
792 \((a a1 a2 a4 a3) (b b1 b3 b2) (c c3))" 790 \((a a1 a2 a4 a3) (b b1 b3 b2) (c c3))"
793 (when (not (null alist)) 791 (when (not (null alist))
794 (let (result 792 (let (same
795 same
796 tmp-old-car 793 tmp-old-car
797 tmp-same 794 tmp-same
798 (first-time-p t) 795 (first-time-p t)
799 old-car) 796 old-car)
800 (nconc 797 (nconc
815 tmp-old-car old-car) 812 tmp-old-car old-car)
816 (setq same (list (cdr item)) 813 (setq same (list (cdr item))
817 old-car (car item)) 814 old-car (car item))
818 (list (cons tmp-old-car (nreverse tmp-same)))))) 815 (list (cons tmp-old-car (nreverse tmp-same))))))
819 (sort alist (lambda (item1 item2) 816 (sort alist (lambda (item1 item2)
820 (funcall sort-predicate (car item1) (car item2)))))) 817 (funcall sort-predicate
818 (car item1) (car item2))))))
821 (list (cons old-car (nreverse same))))))) 819 (list (cons old-car (nreverse same)))))))
822 820
823 821
824 (defun msb--mode-menu-cond () 822 (defun msb--mode-menu-cond ()
825 (let ((key msb-modes-key)) 823 (let ((key msb-modes-key))
829 key 827 key
830 (concat (cdr item) " (%d)"))) 828 (concat (cdr item) " (%d)")))
831 (sort 829 (sort
832 (let ((mode-list nil)) 830 (let ((mode-list nil))
833 (dolist (buffer (cdr (buffer-list))) 831 (dolist (buffer (cdr (buffer-list)))
834 (save-excursion 832 (with-current-buffer buffer
835 (set-buffer buffer)
836 (when (and (not (msb-invisible-buffer-p)) 833 (when (and (not (msb-invisible-buffer-p))
837 (not (assq major-mode mode-list))) 834 (not (assq major-mode mode-list)))
838 (push (cons major-mode mode-name) 835 (push (cons major-mode mode-name)
839 mode-list)))) 836 mode-list))))
840 mode-list) 837 mode-list)
848 (> msb-display-most-recently-used 0)) 845 (> msb-display-most-recently-used 0))
849 (let* ((buffers (cdr (buffer-list))) 846 (let* ((buffers (cdr (buffer-list)))
850 (most-recently-used 847 (most-recently-used
851 (loop with n = 0 848 (loop with n = 0
852 for buffer in buffers 849 for buffer in buffers
853 if (save-excursion 850 if (with-current-buffer buffer
854 (set-buffer buffer)
855 (and (not (msb-invisible-buffer-p)) 851 (and (not (msb-invisible-buffer-p))
856 (not (eq major-mode 'dired-mode)))) 852 (not (eq major-mode 'dired-mode))))
857 collect (save-excursion 853 collect (with-current-buffer buffer
858 (set-buffer buffer)
859 (cons (funcall msb-item-handling-function 854 (cons (funcall msb-item-handling-function
860 buffer 855 buffer
861 max-buffer-name-length) 856 max-buffer-name-length)
862 buffer)) 857 buffer))
863 and do (incf n) 858 and do (incf n)
906 function-info-vector 901 function-info-vector
907 max-buffer-name-length)))) 902 max-buffer-name-length))))
908 (when file-buffers 903 (when file-buffers
909 (setq file-buffers 904 (setq file-buffers
910 (mapcar (lambda (buffer-list) 905 (mapcar (lambda (buffer-list)
911 (cons msb-files-by-directory-sort-key 906 (list* msb-files-by-directory-sort-key
912 (cons (car buffer-list) 907 (car buffer-list)
913 (sort 908 (sort
914 (mapcar (function 909 (mapcar (lambda (buffer)
915 (lambda (buffer) 910 (cons (with-current-buffer buffer
916 (cons (save-excursion 911 (funcall
917 (set-buffer buffer) 912 msb-item-handling-function
918 (funcall msb-item-handling-function 913 buffer
919 buffer 914 max-buffer-name-length))
920 max-buffer-name-length)) 915 buffer))
921 buffer))) 916 (cdr buffer-list))
922 (cdr buffer-list)) 917 (lambda (item1 item2)
923 (function 918 (string< (car item1) (car item2))))))
924 (lambda (item1 item2) 919 (msb--choose-file-menu file-buffers))))
925 (string< (car item1) (car item2))))))))
926 (msb--choose-file-menu file-buffers))))
927 ;; Now make the menu - a list of (TITLE . BUFFER-LIST) 920 ;; Now make the menu - a list of (TITLE . BUFFER-LIST)
928 (let* (menu 921 (let* (menu
929 (most-recently-used 922 (most-recently-used
930 (msb--most-recently-used-menu max-buffer-name-length)) 923 (msb--most-recently-used-menu max-buffer-name-length))
931 (others (nconc file-buffers 924 (others (nconc file-buffers
1101 arg)) 1094 arg))
1102 (let ((frames (frame-list)) 1095 (let ((frames (frame-list))
1103 buffers-menu frames-menu) 1096 buffers-menu frames-menu)
1104 ;; Make the menu of buffers proper. 1097 ;; Make the menu of buffers proper.
1105 (setq msb--last-buffer-menu (msb--create-buffer-menu)) 1098 (setq msb--last-buffer-menu (msb--create-buffer-menu))
1106 (setq buffers-menu msb--last-buffer-menu) 1099 ;; Skip the `keymap' symbol.
1100 (setq buffers-menu (cdr msb--last-buffer-menu))
1107 ;; Make a Frames menu if we have more than one frame. 1101 ;; Make a Frames menu if we have more than one frame.
1108 (when (cdr frames) 1102 (when (cdr frames)
1109 (let* ((frame-length (length frames)) 1103 (let* ((frame-length (length frames))
1110 (f-title (format "Frames (%d)" frame-length))) 1104 (f-title (format "Frames (%d)" frame-length)))
1111 ;; List only the N most recently selected frames 1105 ;; List only the N most recently selected frames
1122 (list (frame-parameter frame 'name) 1116 (list (frame-parameter frame 'name)
1123 (frame-parameter frame 'name) 1117 (frame-parameter frame 'name)
1124 (cons nil nil)) 1118 (cons nil nil))
1125 'menu-bar-select-frame)) 1119 'menu-bar-select-frame))
1126 frames))))) 1120 frames)))))
1127 (define-key (current-global-map) [menu-bar buffer] 1121 (setcdr global-buffers-menu-map
1128 (cons "Buffers"
1129 (if (and buffers-menu frames-menu) 1122 (if (and buffers-menu frames-menu)
1130 ;; Combine Frame and Buffers menus with separator between 1123 ;; Combine Frame and Buffers menus with separator between
1131 (nconc (list 'keymap "Buffers and Frames" frames-menu 1124 (nconc (list "Buffers and Frames" frames-menu
1132 (and msb-separator-diff '(separator "--"))) 1125 (and msb-separator-diff '(separator "--")))
1133 (cddr buffers-menu)) 1126 (cdr buffers-menu))
1134 (or buffers-menu 'undefined))))))) 1127 buffers-menu)))))
1135 1128
1136 ;; Snarf current bindings of `mouse-buffer-menu' (normally 1129 ;; Snarf current bindings of `mouse-buffer-menu' (normally
1137 ;; C-down-mouse-1). 1130 ;; C-down-mouse-1).
1138 (defvar msb-mode-map 1131 (defvar msb-mode-map
1139 (let ((map (make-sparse-keymap "Msb"))) 1132 (let ((map (make-sparse-keymap "Msb")))
1161 (add-hook 'msb-unload-hook 'msb-unload-hook) 1154 (add-hook 'msb-unload-hook 'msb-unload-hook)
1162 1155
1163 (provide 'msb) 1156 (provide 'msb)
1164 (eval-after-load "msb" '(run-hooks 'msb-after-load-hook 'msb-after-load-hooks)) 1157 (eval-after-load "msb" '(run-hooks 'msb-after-load-hook 'msb-after-load-hooks))
1165 1158
1166 ;;; arch-tag: 403f9e82-b92e-4e7a-a797-5d6d9b76da36 1159 ;; arch-tag: 403f9e82-b92e-4e7a-a797-5d6d9b76da36
1167 ;;; msb.el ends here 1160 ;;; msb.el ends here