;;; 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, 2001, 2002, 2003, 2004, 2005, 2006,
+;; 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
;; Author: Stephen Eglen <stephen@gnu.org>
;; Maintainer: Stephen Eglen <stephen@gnu.org>
;; 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
;; 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:
;; 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.
;; 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.
: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
(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
: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
(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."
;;(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)
: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)
: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.")
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
;; 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.
;; 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
(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
(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)
(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."
- (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))
-
-(make-obsolete 'iswitchb-default-keybindings 'iswitchb-mode "21.1")
-
(defun iswitchb-buffer ()
"Switch to another buffer.
most-is-exact
(alternatives
(mapconcat (if most 'iswitchb-output-completion
- 'identity) comps ",")))
+ 'identity) comps iswitchb-delim)))
(concat
;; list all alternatives
open-bracket-prospects
(if most-is-exact
- (concat "," alternatives)
+ (concat iswitchb-delim alternatives)
alternatives)
close-bracket-prospects))))))