Mercurial > emacs
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 |