X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/1bad168e59601c1c843a38b2962e77b29f497f11..cbb59342310c395a04b5dc85454938167793dd96:/lisp/iswitchb.el diff --git a/lisp/iswitchb.el b/lisp/iswitchb.el index c259edcc95..fd6cff0faa 100644 --- a/lisp/iswitchb.el +++ b/lisp/iswitchb.el @@ -1,7 +1,6 @@ ;;; iswitchb.el --- switch between buffers using substrings -;; Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 1996-1997, 2000-2011 Free Software Foundation, Inc. ;; Author: Stephen Eglen ;; Maintainer: Stephen Eglen @@ -9,10 +8,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 3, 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 @@ -20,9 +19,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: @@ -177,7 +174,7 @@ ;; iswitch for all buffer selections in Emacs, add: ;; (setq read-buffer-function 'iswitchb-read-buffer) ;; (This variable was introduced in Emacs 20.3.) -;; XEmacs users can get the same behaviour by doing: +;; XEmacs users can get the same behavior by doing: ;; (defalias 'read-buffer 'iswitchb-read-buffer) ;; since `read-buffer' is defined in lisp. @@ -214,7 +211,7 @@ ;; iswitchb-mode-map "\C-o" ;; 'iswitchb-exclude-nonmatching))) -;; Other lisp packages extend iswitchb behaviour to other tasks. See +;; Other lisp packages extend iswitchb behavior to other tasks. See ;; ido.el (by Kim Storm) and mcomplete.el (Yuji Minejima). ;; Window managers: Switching frames/focus follows mouse; Sawfish. @@ -244,11 +241,6 @@ ;;; Code: -;; CL needed for cadr and last -(if (not (and (fboundp 'cadr) - (fboundp 'last))) - (require 'cl)) - (require 'font-lock) ;;; User Variables @@ -264,7 +256,7 @@ :link '(emacs-library-link :tag "Lisp File" "iswitchb.el")) (defcustom iswitchb-case case-fold-search - "*Non-nil if searching of buffer names should ignore case. + "Non-nil if searching of buffer names should ignore case. If this is non-nil but the user input has any upper case letters, matching is temporarily case sensitive." :type 'boolean @@ -272,16 +264,16 @@ is temporarily case sensitive." (defcustom iswitchb-buffer-ignore '("^ ") - "*List of regexps or functions matching buffer names to ignore. + "List of regexps or functions matching buffer names to ignore. For example, traditional behavior is not to list buffers whose names begin with a space, for which the regexp is `^ '. See the source file for -example functions that filter buffernames." +example functions that filter buffer names." :type '(repeat (choice regexp function)) :group 'iswitchb) (put 'iswitchb-buffer-ignore 'risky-local-variable t) (defcustom iswitchb-max-to-show nil - "*If non-nil, limit the number of names shown in the minibuffer. + "If non-nil, limit the number of names shown in the minibuffer. If this value is N, and N is greater than the number of matching buffers, the first N/2 and the last N/2 matching buffers are shown. This can greatly speed up iswitchb if you have a @@ -290,7 +282,7 @@ multitude of buffers open." :group 'iswitchb) (defcustom iswitchb-use-virtual-buffers nil - "*If non-nil, refer to past buffers when none match. + "If non-nil, refer to past buffers when none match. This feature relies upon the `recentf' package, which will be enabled if this variable is configured to a non-nil value." :type 'boolean @@ -304,7 +296,7 @@ enabled if this variable is configured to a non-nil value." (defvar iswitchb-virtual-buffers nil) (defcustom iswitchb-cannot-complete-hook 'iswitchb-completion-help - "*Hook run when `iswitchb-complete' can't complete any more. + "Hook run when `iswitchb-complete' can't complete any more. The most useful values are `iswitchb-completion-help', which pops up a window with completion alternatives, or `iswitchb-next-match' or `iswitchb-prev-match', which cycle the buffer list." @@ -321,7 +313,7 @@ window with completion alternatives, or `iswitchb-next-match' or ;;(setq iswitchb-buffer-ignore '("^ " "\\.c\\'" "\\.h\\'")) (defcustom iswitchb-default-method 'always-frame - "*How to switch to new buffer when using `iswitchb-buffer'. + "How to switch to new buffer when using `iswitchb-buffer'. Possible values: `samewindow' Show new buffer in same window `otherwindow' Show new buffer in another window (same frame) @@ -341,31 +333,32 @@ Possible values: :group 'iswitchb) (defcustom iswitchb-regexp nil - "*Non-nil means that `iswitchb' will do regexp matching. + "Non-nil means that `iswitchb' will do regexp matching. Value can be toggled within `iswitchb' using `iswitchb-toggle-regexp'." :type 'boolean :group 'iswitchb) (defcustom iswitchb-newbuffer t - "*Non-nil means create new buffer if no buffer matches substring. + "Non-nil means create new buffer if no buffer matches substring. See also `iswitchb-prompt-newbuffer'." :type 'boolean :group 'iswitchb) (defcustom iswitchb-prompt-newbuffer t - "*Non-nil means prompt user to confirm before creating new buffer. + "Non-nil means prompt user to confirm before creating new buffer. See also `iswitchb-newbuffer'." :type 'boolean :group 'iswitchb) +(define-obsolete-variable-alias 'iswitchb-use-fonts 'iswitchb-use-faces "22.1") + (defcustom iswitchb-use-faces t - "*Non-nil means use font-lock fonts for showing first match." + "Non-nil means use font-lock faces for showing first match." :type 'boolean :group 'iswitchb) -(define-obsolete-variable-alias 'iswitchb-use-fonts 'iswitchb-use-faces "22.1") (defcustom iswitchb-use-frame-buffer-list nil - "*Non-nil means use the currently selected frame's buffer list." + "Non-nil means use the currently selected frame's buffer list." :type 'boolean :group 'iswitchb) @@ -374,6 +367,11 @@ See also `iswitchb-newbuffer'." :type 'hook :group 'iswitchb) +(defcustom iswitchb-delim "," + "Delimiter to put between buffer names when displaying results." + :type 'string + :group 'iswitchb) + (defvar iswitchb-all-frames 'visible "*Argument to pass to `walk-windows' when finding visible buffers. See documentation of `walk-windows' for useful values.") @@ -526,9 +524,7 @@ selected.") ;;; ISWITCHB KEYMAP (defun iswitchb-define-mode-map () - "Set up the keymap for `iswitchb-buffer'. -This is obsolete. Use \\[iswitchb-mode] or customize the -variable `iswitchb-mode'." + "Set up the keymap for `iswitchb-buffer'." (interactive) (let (map) ;; generated every time so that it can inherit new functions. @@ -549,6 +545,10 @@ variable `iswitchb-mode'." (setq iswitchb-mode-map map) (run-hooks 'iswitchb-define-mode-map-hook))) +(make-obsolete 'iswitchb-define-mode-map + "use M-x iswitchb-mode or customize the variable `iswitchb-mode'." + "21.1") + ;;; MAIN FUNCTION (defun iswitchb () "Switch to buffer matching a substring. @@ -609,7 +609,7 @@ Return the name of a buffer selected. PROMPT is the prompt to give to the user. DEFAULT if given is the default buffer to be selected, which will go to the front of the list. -If REQUIRE-MATCH is non-nil, an existing-buffer must be selected. +If REQUIRE-MATCH is non-nil, an existing buffer must be selected. If START is a string, the selection process is started with that string. If MATCHES-SET is non-nil, the buflist is not updated before @@ -656,9 +656,12 @@ the selection process begins. Used by isearchb.el." ;; that file now and act as though that buffer had been selected. (if (and iswitchb-virtual-buffers (not (iswitchb-existing-buffer-p))) - (let ((virt (car iswitchb-virtual-buffers))) - (find-file-noselect (cdr virt)) - (setq iswitchb-matches (list (car virt)) + (let ((virt (car iswitchb-virtual-buffers)) + (new-buf)) + ;; Keep the name of the buffer returned by find-file-noselect, as + ;; the buffer 'virt' could be a symlink to a file of a different name. + (setq new-buf (buffer-name (find-file-noselect (cdr virt)))) + (setq iswitchb-matches (list new-buf) iswitchb-virtual-buffers nil))) ;; Handling the require-match must be done in a better way. @@ -688,7 +691,7 @@ the selection process begins. Used by isearchb.el." "Find common completion of `iswitchb-text' in `iswitchb-matches'. The result is stored in `iswitchb-common-match-string'." - (let* (val) + (let (val) (setq iswitchb-common-match-string nil) (if (and iswitchb-matches (not iswitchb-regexp) ;; testing @@ -778,8 +781,7 @@ If no buffer exactly matching the prompt exists, maybe create a new one." (setq iswitchb-exit 'findfile) (exit-minibuffer)) -(eval-when-compile - (defvar recentf-list)) +(defvar recentf-list) (defun iswitchb-next-match () "Put first element of `iswitchb-matches' at the end of the list." @@ -888,7 +890,7 @@ current frame, rather than all frames, regardless of value of "Set `iswitchb-matches' to the list of buffers matching prompt." (if iswitchb-rescan (setq iswitchb-matches - (let* ((buflist iswitchb-buflist)) + (let ((buflist iswitchb-buflist)) (iswitchb-get-matched-buffers iswitchb-text iswitchb-regexp buflist)) iswitchb-virtual-buffers nil))) @@ -898,7 +900,7 @@ current frame, rather than all frames, regardless of value of "Return buffers matching REGEXP. If STRING-FORMAT is nil, consider REGEXP as just a string. BUFFER-LIST can be list of buffers or list of strings." - (let* ((case-fold-search (iswitchb-case)) + (let ((case-fold-search (iswitchb-case)) name ret) (if (null string-format) (setq regexp (regexp-quote regexp))) (setq iswitchb-invalid-regexp nil) @@ -1010,19 +1012,13 @@ Return the modified list with the last element prepended to it." ;; XEmacs extents are put on by default, doesn't seem to be ;; any way of switching them off. - (display-completion-list (if iswitchb-matches - iswitchb-matches - iswitchb-buflist) + (display-completion-list (or iswitchb-matches iswitchb-buflist) :help-string "iswitchb " :activate-callback (lambda (x y z) (message "doesn't work yet, sorry!"))) ;; else running Emacs - (with-current-buffer standard-output - (fundamental-mode)) - (display-completion-list (if iswitchb-matches - iswitchb-matches - iswitchb-buflist)))) + (display-completion-list (or iswitchb-matches iswitchb-buflist)))) (setq iswitchb-common-match-inserted nil)))) ;;; KILL CURRENT BUFFER @@ -1030,13 +1026,15 @@ Return the modified list with the last element prepended to it." (defun iswitchb-kill-buffer () "Kill the buffer at the head of `iswitchb-matches'." (interactive) - (let ( (enable-recursive-minibuffers t) - buf) + (let ((enable-recursive-minibuffers t) + buf) (setq buf (car iswitchb-matches)) ;; check to see if buf is non-nil. (if buf - (progn + (let ((bufobjs (mapcar (lambda (name) + (or (get-buffer name) name)) + iswitchb-buflist))) (kill-buffer buf) ;; Check if buffer exists. XEmacs gnuserv.el makes alias @@ -1045,13 +1043,20 @@ Return the modified list with the last element prepended to it." (if (get-buffer buf) ;; buffer couldn't be killed. (setq iswitchb-rescan t) - ;; else buffer was killed so remove name from list. - (setq iswitchb-buflist (delq buf iswitchb-buflist))))))) + ;; Else `kill-buffer' succeeds so re-make the buffer list + ;; taking into account packages like uniquify may rename + ;; buffers, and try to preserve the ordering of buffers. + (setq iswitchb-buflist + (delq nil (mapcar (lambda (b) + (if (bufferp b) + (buffer-name b) + b)) + bufobjs)))))))) ;;; VISIT CHOSEN BUFFER (defun iswitchb-visit-buffer (buffer) "Visit buffer named BUFFER according to `iswitchb-method'." - (let* (win newframe) + (let (win newframe) (cond ((eq iswitchb-method 'samewindow) (switch-to-buffer buffer)) @@ -1120,19 +1125,6 @@ If BUFFER is visible in the current frame, return nil." (get-buffer-window buffer 0) ; better than 'visible ))) -(defun iswitchb-default-keybindings () - "Set up default keybindings for `iswitchb-buffer'. -Call this function to override the normal bindings. This function also -adds a hook to the minibuffer. - -Obsolescent. Use `iswitchb-mode'." - (interactive) - (add-hook 'minibuffer-setup-hook 'iswitchb-minibuffer-setup) - (global-set-key "\C-xb" 'iswitchb-buffer) - (global-set-key "\C-x4b" 'iswitchb-buffer-other-window) - (global-set-key "\C-x4\C-o" 'iswitchb-display-buffer) - (global-set-key "\C-x5b" 'iswitchb-buffer-other-frame)) - (defun iswitchb-buffer () "Switch to another buffer. @@ -1235,9 +1227,8 @@ Copied from `icomplete-exhibit' with two changes: (insert (iswitchb-completions contents)))))) -(eval-when-compile - (defvar most-len) - (defvar most-is-exact)) +(defvar most-len) +(defvar most-is-exact) (defun iswitchb-output-completion (com) (if (= (length com) most-len) @@ -1346,7 +1337,7 @@ Modified from `icomplete-completions'." most-is-exact (alternatives (mapconcat (if most 'iswitchb-output-completion - 'identity) comps ","))) + 'identity) comps iswitchb-delim))) (concat @@ -1369,7 +1360,7 @@ Modified from `icomplete-completions'." ;; list all alternatives open-bracket-prospects (if most-is-exact - (concat "," alternatives) + (concat iswitchb-delim alternatives) alternatives) close-bracket-prospects)))))) @@ -1445,5 +1436,4 @@ This mode enables switching between buffers using substrings. See (provide 'iswitchb) -;; arch-tag: d74198ae-753f-44f2-b34f-0c515398d90a ;;; iswitchb.el ends here