X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9b75c1e26efe96f0ed327ee06b0e046a9e5724ed..6f1b43a0ad8ed8e231f168fcd135376414cb56cc:/lisp/msb.el diff --git a/lisp/msb.el b/lisp/msb.el index ab25a33911..910d39db17 100644 --- a/lisp/msb.el +++ b/lisp/msb.el @@ -1,7 +1,7 @@ ;;; 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 ;; Maintainer: FSF @@ -11,10 +11,10 @@ ;; 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 -;; 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 @@ -22,9 +22,7 @@ ;; 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 . ;;; Commentary: @@ -190,9 +188,6 @@ 3099 "Other files (%d)"))) -;; msb--many-menus is obsolete -(defvar msb--many-menus msb--very-many-menus) - ;;; ;;; 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. -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. -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 @@ -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 -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) @@ -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 -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. @@ -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)." - (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 @@ -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) - 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. @@ -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: -\]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) @@ -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) -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 @@ -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 - (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))) @@ -791,8 +784,7 @@ Example: 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) @@ -817,7 +809,8 @@ results in 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))))))) @@ -831,11 +824,11 @@ results in (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))) - (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) @@ -850,12 +843,10 @@ It takes the form ((TITLE . BUFFER-LIST)...)." (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)))) - collect (save-excursion - (set-buffer buffer) + collect (with-current-buffer buffer (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) - (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 @@ -962,13 +951,13 @@ It takes the form ((TITLE . BUFFER-LIST)...)." "*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 () - "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, @@ -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)) - (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) - (> 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 @@ -1124,14 +1114,13 @@ variable `msb-menu-cond'." (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 - (nconc (list 'keymap "Buffers and Frames" frames-menu + (nconc (list "Buffers and Frames" frames-menu (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). @@ -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))) -(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)) -;;; arch-tag: 403f9e82-b92e-4e7a-a797-5d6d9b76da36 +;; arch-tag: 403f9e82-b92e-4e7a-a797-5d6d9b76da36 ;;; msb.el ends here