]> code.delx.au - gnu-emacs/blobdiff - lisp/msb.el
(Vchar_unify_table): Comment added.
[gnu-emacs] / lisp / msb.el
index ab25a339110837a0d6a39d2c146db0de4c41ca52..910d39db17704755d92389b9e9e5394311e1d1f8 100644 (file)
@@ -1,7 +1,7 @@
 ;;; msb.el --- customizable buffer-selection with multiple menus
 
 ;; Copyright (C) 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002,
 ;;; msb.el --- customizable buffer-selection with multiple menus
 
 ;; Copyright (C) 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002,
-;;   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;;   2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 ;; Author: Lars Lindberg <lars.lindberg@home.se>
 ;; Maintainer: FSF
 
 ;; Author: Lars Lindberg <lars.lindberg@home.se>
 ;; Maintainer: FSF
 
 ;; This file is part of GNU Emacs.
 
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -22,9 +22,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 
 ;;; Commentary:
 
      3099
      "Other files (%d)")))
 
      3099
      "Other files (%d)")))
 
-;; msb--many-menus is obsolete
-(defvar msb--many-menus msb--very-many-menus)
-
 ;;;
 ;;; Customizable variables
 ;;;
 ;;;
 ;;; Customizable variables
 ;;;
@@ -235,12 +230,12 @@ A value of nil means don't display this menu.
 MENU-TITLE is really a format.  If you add %d in it, the %d is
 replaced with the number of items in that menu.
 
 MENU-TITLE is really a format.  If you add %d in it, the %d is
 replaced with the number of items in that menu.
 
-ITEM-HANDLING-FN, is optional.  If it is supplied and is a function,
-than it is used for displaying the items in that particular buffer
+ITEM-HANDLING-FN is optional.  If it is supplied and is a function,
+then it is used for displaying the items in that particular buffer
 menu, otherwise the function pointed out by
 `msb-item-handling-function' is used.
 
 menu, otherwise the function pointed out by
 `msb-item-handling-function' is used.
 
-ITEM-SORT-FN, is also optional.
+ITEM-SORT-FN is also optional.
 If it is not supplied, the function pointed out by
 `msb-item-sort-function' is used.
 If it is nil, then no sort takes place and the buffers are presented
 If it is not supplied, the function pointed out by
 `msb-item-sort-function' is used.
 If it is nil, then no sort takes place and the buffers are presented
@@ -282,7 +277,7 @@ that differs by this value or more."
 (defcustom msb-max-menu-items 15
   "*The maximum number of items in a menu.
 If this variable is set to 15 for instance, then the submenu will be
 (defcustom msb-max-menu-items 15
   "*The maximum number of items in a menu.
 If this variable is set to 15 for instance, then the submenu will be
-split up in minor parts, 15 items each.  nil means no limit."
+split up in minor parts, 15 items each.  A value of nil means no limit."
   :type '(choice integer (const nil))
   :set 'msb-custom-set
   :group 'msb)
   :type '(choice integer (const nil))
   :set 'msb-custom-set
   :group 'msb)
@@ -336,7 +331,7 @@ names that starts with a space character."
   "*The appearance of a buffer menu.
 
 The default function to call for handling the appearance of a menu
   "*The appearance of a buffer menu.
 
 The default function to call for handling the appearance of a menu
-item.  It should take to arguments, BUFFER and MAX-BUFFER-NAME-LENGTH,
+item.  It should take two arguments, BUFFER and MAX-BUFFER-NAME-LENGTH,
 where the latter is the max length of all buffer names.
 
 The function should return the string to use in the menu.
 where the latter is the max length of all buffer names.
 
 The function should return the string to use in the menu.
@@ -454,10 +449,10 @@ An item looks like (NAME . BUFFER)."
 (defun msb-sort-by-directory (item1 item2)
   "Sort the items ITEM1 and ITEM2 by directory name.  Made for dired.
 An item look like (NAME . BUFFER)."
 (defun msb-sort-by-directory (item1 item2)
   "Sort the items ITEM1 and ITEM2 by directory name.  Made for dired.
 An item look like (NAME . BUFFER)."
-  (string-lessp (save-excursion (set-buffer (cdr item1))
-                               (msb--dired-directory))
-               (save-excursion (set-buffer (cdr item2))
-                               (msb--dired-directory))))
+  (string-lessp (with-current-buffer (cdr item1)
+                  (msb--dired-directory))
+               (with-current-buffer (cdr item2)
+                  (msb--dired-directory))))
 
 ;;;
 ;;; msb
 
 ;;;
 ;;; msb
@@ -581,8 +576,7 @@ If the argument is left out or nil, then the current buffer is considered."
     (while rest
       (let ((found-p nil)
            (tmp-rest rest)
     (while rest
       (let ((found-p nil)
            (tmp-rest rest)
-           result
-           new-dir item)
+            item)
        (setq item (car tmp-rest))
        ;; Clump together the "rest"-buffers that have a dir that is
        ;; a subdir of the current one.
        (setq item (car tmp-rest))
        ;; Clump together the "rest"-buffers that have a dir that is
        ;; a subdir of the current one.
@@ -665,7 +659,7 @@ If the argument is left out or nil, then the current buffer is considered."
 (defun msb--create-function-info (menu-cond-elt)
   "Create a vector from an element MENU-COND-ELT of `msb-menu-cond'.
 This takes the form:
 (defun msb--create-function-info (menu-cond-elt)
   "Create a vector from an element MENU-COND-ELT of `msb-menu-cond'.
 This takes the form:
-\]BUFFER-LIST-VARIABLE CONDITION MENU-SORT-KEY MENU-TITLE ITEM-HANDLER SORTER)
+\[BUFFER-LIST-VARIABLE CONDITION MENU-SORT-KEY MENU-TITLE ITEM-HANDLER SORTER]
 See `msb-menu-cond' for a description of its elements."
   (let* ((list-symbol (make-symbol "-msb-buffer-list"))
         (tmp-ih (and (> (length menu-cond-elt) 3)
 See `msb-menu-cond' for a description of its elements."
   (let* ((list-symbol (make-symbol "-msb-buffer-list"))
         (tmp-ih (and (> (length menu-cond-elt) 3)
@@ -728,7 +722,7 @@ See `msb-menu-cond' for a description of its elements."
 (defun msb--add-to-menu (buffer function-info max-buffer-name-length)
   "Add BUFFER to the menu depicted by FUNCTION-INFO.
 All side-effects.  Adds an element of form (BUFFER-TITLE . BUFFER)
 (defun msb--add-to-menu (buffer function-info max-buffer-name-length)
   "Add BUFFER to the menu depicted by FUNCTION-INFO.
 All side-effects.  Adds an element of form (BUFFER-TITLE . BUFFER)
-to the buffer-list variable in function-info."
+to the buffer-list variable in FUNCTION-INFO."
   (let ((list-symbol (aref function-info 0))) ;BUFFER-LIST-VARIABLE
     ;; Here comes the hairy side-effect!
     (set list-symbol
   (let ((list-symbol (aref function-info 0))) ;BUFFER-LIST-VARIABLE
     ;; Here comes the hairy side-effect!
     (set list-symbol
@@ -745,8 +739,7 @@ to the buffer-list variable in function-info."
   (unless (and (not msb-display-invisible-buffers-p)
               (msb-invisible-buffer-p buffer))
     (condition-case nil
   (unless (and (not msb-display-invisible-buffers-p)
               (msb-invisible-buffer-p buffer))
     (condition-case nil
-       (save-excursion
-         (set-buffer buffer)
+       (with-current-buffer buffer
          ;; Menu found.  Add to this menu
          (dolist (info (msb--collect function-info-vector))
            (msb--add-to-menu buffer info max-buffer-name-length)))
          ;; Menu found.  Add to this menu
          (dolist (info (msb--collect function-info-vector))
            (msb--add-to-menu buffer info max-buffer-name-length)))
@@ -791,8 +784,7 @@ Example:
 results in
 \((a a1 a2 a4 a3) (b b1 b3 b2) (c c3))"
   (when (not (null alist))
 results in
 \((a a1 a2 a4 a3) (b b1 b3 b2) (c c3))"
   (when (not (null alist))
-    (let (result
-         same
+    (let (same
          tmp-old-car
          tmp-same
          (first-time-p t)
          tmp-old-car
          tmp-same
          (first-time-p t)
@@ -817,7 +809,8 @@ results in
                         old-car (car item))
                   (list (cons tmp-old-car (nreverse tmp-same))))))
               (sort alist (lambda (item1 item2)
                         old-car (car item))
                   (list (cons tmp-old-car (nreverse tmp-same))))))
               (sort alist (lambda (item1 item2)
-                            (funcall sort-predicate (car item1) (car item2))))))
+                            (funcall sort-predicate
+                                      (car item1) (car item2))))))
        (list (cons old-car (nreverse same)))))))
 
 
        (list (cons old-car (nreverse same)))))))
 
 
@@ -831,11 +824,11 @@ results in
            (sort
             (let ((mode-list nil))
               (dolist (buffer (cdr (buffer-list)))
            (sort
             (let ((mode-list nil))
               (dolist (buffer (cdr (buffer-list)))
-                (save-excursion
-                  (set-buffer buffer)
+                (with-current-buffer buffer
                   (when (and (not (msb-invisible-buffer-p))
                              (not (assq major-mode mode-list)))
                   (when (and (not (msb-invisible-buffer-p))
                              (not (assq major-mode mode-list)))
-                    (push (cons major-mode mode-name)
+                    (push (cons major-mode
+                                 (format-mode-line mode-name nil nil buffer))
                           mode-list))))
               mode-list)
             (lambda (item1 item2)
                           mode-list))))
               mode-list)
             (lambda (item1 item2)
@@ -850,12 +843,10 @@ It takes the form ((TITLE . BUFFER-LIST)...)."
           (most-recently-used
            (loop with n = 0
                  for buffer in buffers
           (most-recently-used
            (loop with n = 0
                  for buffer in buffers
-                 if (save-excursion
-                      (set-buffer buffer)
+                 if (with-current-buffer buffer
                       (and (not (msb-invisible-buffer-p))
                            (not (eq major-mode 'dired-mode))))
                       (and (not (msb-invisible-buffer-p))
                            (not (eq major-mode 'dired-mode))))
-                 collect (save-excursion
-                           (set-buffer buffer)
+                 collect (with-current-buffer buffer
                            (cons (funcall msb-item-handling-function
                                           buffer
                                           max-buffer-name-length)
                            (cons (funcall msb-item-handling-function
                                           buffer
                                           max-buffer-name-length)
@@ -908,22 +899,20 @@ It takes the form ((TITLE . BUFFER-LIST)...)."
     (when file-buffers
       (setq file-buffers
            (mapcar (lambda (buffer-list)
     (when file-buffers
       (setq file-buffers
            (mapcar (lambda (buffer-list)
-                     (cons msb-files-by-directory-sort-key
-                           (cons (car buffer-list)
-                                 (sort
-                                  (mapcar (function
-                                           (lambda (buffer)
-                                             (cons (save-excursion
-                                                     (set-buffer buffer)
-                                                     (funcall msb-item-handling-function
-                                                              buffer
-                                                              max-buffer-name-length))
-                                                   buffer)))
-                                          (cdr buffer-list))
-                                  (function
-                                   (lambda (item1 item2)
-                                     (string< (car item1) (car item2))))))))
-                    (msb--choose-file-menu file-buffers))))
+                     (list* msb-files-by-directory-sort-key
+                             (car buffer-list)
+                             (sort
+                              (mapcar (lambda (buffer)
+                                        (cons (with-current-buffer buffer
+                                                (funcall
+                                                 msb-item-handling-function
+                                                 buffer
+                                                 max-buffer-name-length))
+                                              buffer))
+                                      (cdr buffer-list))
+                              (lambda (item1 item2)
+                                (string< (car item1) (car item2))))))
+                    (msb--choose-file-menu file-buffers))))
     ;; Now make the menu - a list of (TITLE . BUFFER-LIST)
     (let* (menu
           (most-recently-used
     ;; Now make the menu - a list of (TITLE . BUFFER-LIST)
     (let* (menu
           (most-recently-used
@@ -962,13 +951,13 @@ It takes the form ((TITLE . BUFFER-LIST)...)."
                             "*Files by directory*")
                           'msb--toggle-menu-type)))))))
 
                             "*Files by directory*")
                           'msb--toggle-menu-type)))))))
 
-(defun msb--create-buffer-menu  ()
+(defun msb--create-buffer-menu ()
   (save-match-data
     (save-excursion
       (msb--create-buffer-menu-2))))
 
 (defun msb--toggle-menu-type ()
   (save-match-data
     (save-excursion
       (msb--create-buffer-menu-2))))
 
 (defun msb--toggle-menu-type ()
-  "Multi purpose function for selecting a buffer with the mouse."
+  "Multi-purpose function for selecting a buffer with the mouse."
   (interactive)
   (setq msb-files-by-directory (not msb-files-by-directory))
   ;; This gets a warning, but it is correct,
   (interactive)
   (setq msb-files-by-directory (not msb-files-by-directory))
   ;; This gets a warning, but it is correct,
@@ -1103,14 +1092,15 @@ variable `msb-menu-cond'."
          buffers-menu frames-menu)
       ;; Make the menu of buffers proper.
       (setq msb--last-buffer-menu (msb--create-buffer-menu))
          buffers-menu frames-menu)
       ;; Make the menu of buffers proper.
       (setq msb--last-buffer-menu (msb--create-buffer-menu))
-      (setq buffers-menu msb--last-buffer-menu)
+      ;; Skip the `keymap' symbol.
+      (setq buffers-menu (cdr msb--last-buffer-menu))
       ;; Make a Frames menu if we have more than one frame.
       (when (cdr frames)
        (let* ((frame-length (length frames))
               (f-title  (format "Frames (%d)" frame-length)))
          ;; List only the N most recently selected frames
          (when (and (integerp msb-max-menu-items)
       ;; Make a Frames menu if we have more than one frame.
       (when (cdr frames)
        (let* ((frame-length (length frames))
               (f-title  (format "Frames (%d)" frame-length)))
          ;; List only the N most recently selected frames
          (when (and (integerp msb-max-menu-items)
-                    (>  msb-max-menu-items 1)
+                    (> msb-max-menu-items 1)
                     (> frame-length msb-max-menu-items))
            (setcdr (nthcdr msb-max-menu-items frames) nil))
          (setq frames-menu
                     (> frame-length msb-max-menu-items))
            (setcdr (nthcdr msb-max-menu-items frames) nil))
          (setq frames-menu
@@ -1124,14 +1114,13 @@ variable `msb-menu-cond'."
                           (cons nil nil))
                     'menu-bar-select-frame))
                  frames)))))
                           (cons nil nil))
                     'menu-bar-select-frame))
                  frames)))))
-      (define-key (current-global-map) [menu-bar buffer]
-       (cons "Buffers"
+      (setcdr global-buffers-menu-map
              (if (and buffers-menu frames-menu)
                  ;; Combine Frame and Buffers menus with separator between
              (if (and buffers-menu frames-menu)
                  ;; Combine Frame and Buffers menus with separator between
-                 (nconc (list 'keymap "Buffers and Frames" frames-menu
+                 (nconc (list "Buffers and Frames" frames-menu
                               (and msb-separator-diff '(separator "--")))
                               (and msb-separator-diff '(separator "--")))
-                        (cddr buffers-menu))
-               (or buffers-menu 'undefined)))))))
+                        (cdr buffers-menu))
+                buffers-menu)))))
 
 ;; Snarf current bindings of `mouse-buffer-menu' (normally
 ;; C-down-mouse-1).
 
 ;; Snarf current bindings of `mouse-buffer-menu' (normally
 ;; C-down-mouse-1).
@@ -1156,12 +1145,14 @@ different buffer menu using the function `msb'."
     (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)
     (menu-bar-update-buffers t)))
 
     (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)
     (menu-bar-update-buffers t)))
 
-(defun msb-unload-hook ()
-  (msb-mode 0))
-(add-hook 'msb-unload-hook 'msb-unload-hook)
+(defun msb-unload-function ()
+  "Unload the Msb library."
+  (msb-mode -1)
+  ;; continue standard unloading
+  nil)
 
 (provide 'msb)
 (eval-after-load "msb" '(run-hooks 'msb-after-load-hook 'msb-after-load-hooks))
 
 
 (provide 'msb)
 (eval-after-load "msb" '(run-hooks 'msb-after-load-hook 'msb-after-load-hooks))
 
-;;; arch-tag: 403f9e82-b92e-4e7a-a797-5d6d9b76da36
+;; arch-tag: 403f9e82-b92e-4e7a-a797-5d6d9b76da36
 ;;; msb.el ends here
 ;;; msb.el ends here