;;; iswitchb.el --- switch between buffers using substrings
-;; Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: Stephen Eglen <stephen@gnu.org>
;; Maintainer: Stephen Eglen <stephen@gnu.org>
;; Keywords: completion convenience
-;; location: http://www.anc.ed.ac.uk/~stephen/emacs/
;; This file is part of GNU Emacs.
;; 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)
+;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; 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., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'font-lock)
-;; Set up the custom library.
-;; taken from http://www.dina.kvl.dk/~abraham/custom/
-(eval-and-compile
- (condition-case ()
- (require 'custom)
- (error nil))
- (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
- nil ;; We've got what we needed
- ;; We have the old custom-library, hack around it!
- (defmacro defgroup (&rest args)
- nil)
- (defmacro defcustom (var value doc &rest args)
- `(defvar ,var ,value ,doc))))
-
;;; User Variables
;;
;; These are some things you might want to change.
example functions that filter buffernames."
: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.
:type 'hook
:group 'iswitchb)
-;;; Examples for setting the value of iswitchb-buffer-ignore
-;(defun iswitchb-ignore-c-mode (name)
-; "Ignore all c mode buffers -- example function for iswitchb."
-; (save-excursion
-; (set-buffer name)
-; (string-match "^C$" mode-name)))
+;; Examples for setting the value of iswitchb-buffer-ignore
+;;(defun iswitchb-ignore-c-mode (name)
+;; "Ignore all c mode buffers -- example function for iswitchb."
+;; (with-current-buffer name
+;; (derived-mode-p 'c-mode)))
-;(setq iswitchb-buffer-ignore '("^ " iswitchb-ignore-c-mode))
-;(setq iswitchb-buffer-ignore '("^ " "\\.c$" "\\.h$"))
+;;(setq iswitchb-buffer-ignore '("^ " iswitchb-ignore-c-mode))
+;;(setq iswitchb-buffer-ignore '("^ " "\\.c\\'" "\\.h\\'"))
(defcustom iswitchb-default-method 'always-frame
"*How to switch to new buffer when using `iswitchb-buffer'.
(defcustom iswitchb-minibuffer-setup-hook nil
"Iswitchb-specific customization of minibuffer setup.
-This hook is run during minibuffer setup iff `iswitchb' will be active.
+This hook is run during minibuffer setup if `iswitchb' is active.
For instance:
\(add-hook 'iswitchb-minibuffer-setup-hook
'\(lambda () (set (make-local-variable 'max-mini-window-height) 3)))
:type 'hook
:group 'iswitchb)
-(defface iswitchb-single-match-face
+(defface iswitchb-single-match
'((t
(:inherit font-lock-comment-face)))
"Iswitchb face for single matching buffer name."
:version "22.1"
:group 'iswitchb)
-(defface iswitchb-current-match-face
+(defface iswitchb-current-match
'((t
(:inherit font-lock-function-name-face)))
"Iswitchb face for current matching buffer name."
:version "22.1"
:group 'iswitchb)
-(defface iswitchb-virtual-matches-face
+(defface iswitchb-virtual-matches
'((t
(:inherit font-lock-builtin-face)))
"Iswitchb face for matching virtual buffer names.
:version "22.1"
:group 'iswitchb)
-(defface iswitchb-invalid-regexp-face
+(defface iswitchb-invalid-regexp
'((t
(:inherit font-lock-warning-face)))
"Iswitchb face for indicating invalid regexp. "
(defvar iswitchb-global-map
(let ((map (make-sparse-keymap)))
- (substitute-key-definition 'switch-to-buffer ; normally C-x b
- 'iswitchb-buffer map global-map)
- (substitute-key-definition 'switch-to-buffer-other-window ; C-x 4 b
- 'iswitchb-buffer-other-window map global-map)
- (substitute-key-definition 'switch-to-buffer-other-frame ; C-x 5 b
- 'iswitchb-buffer-other-frame map global-map)
- (substitute-key-definition 'display-buffer ; C-x 4 C-o
- 'iswitchb-display-buffer map global-map)
+ (dolist (b '((switch-to-buffer . iswitchb-buffer)
+ (switch-to-buffer-other-window . iswitchb-buffer-other-window)
+ (switch-to-buffer-other-frame . iswitchb-buffer-other-frame)
+ (display-buffer . iswitchb-display-buffer)))
+ (if (fboundp 'command-remapping)
+ (define-key map (vector 'remap (car b)) (cdr b))
+ (substitute-key-definition (car b) (cdr b) map global-map)))
map)
"Global keymap for `iswitchb-mode'.")
(define-key map "\C-j" 'iswitchb-select-buffer-text)
(define-key map "\C-t" 'iswitchb-toggle-regexp)
(define-key map "\C-x\C-f" 'iswitchb-find-file)
- ;;(define-key map "\C-a" 'iswitchb-toggle-ignore)
+ (define-key map "\C-n" 'iswitchb-toggle-ignore)
(define-key map "\C-c" 'iswitchb-toggle-case)
(define-key map "\C-k" 'iswitchb-kill-buffer)
(define-key map "\C-m" 'iswitchb-exit-minibuffer)
(defun iswitchb-to-end (lst)
"Move the elements from LST to the end of `iswitchb-temp-buflist'."
- (mapcar
- (lambda (elem)
- (setq iswitchb-temp-buflist (delq elem iswitchb-temp-buflist)))
- lst)
+ (dolist (elem lst)
+ (setq iswitchb-temp-buflist (delq elem iswitchb-temp-buflist)))
(setq iswitchb-temp-buflist (nconc iswitchb-temp-buflist lst)))
(defun iswitchb-get-buffers-in-frames (&optional current)
"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))
- ;; need reverse since we are building up list backwards
- (list (reverse buffer-list))
- (do-string (stringp (car list)))
- name
- ret)
+ (let* ((case-fold-search (iswitchb-case))
+ name ret)
+ (if (null string-format) (setq regexp (regexp-quote regexp)))
(setq iswitchb-invalid-regexp nil)
- (catch 'invalid-regexp
- (mapcar
- (lambda (x)
-
- (if do-string
- (setq name x) ;We already have the name
- (setq name (buffer-name x)))
-
- (cond
- ((and (if (not string-format)
- (string-match (regexp-quote regexp) name)
- (condition-case error
- (string-match regexp name)
- (invalid-regexp
- (setq iswitchb-invalid-regexp t)
- (throw 'invalid-regexp (setq ret (cdr error))))))
- (not (iswitchb-ignore-buffername-p name)))
- (setq ret (cons name ret)))))
- list))
- ret))
+ (condition-case error
+ (dolist (x buffer-list (nreverse ret))
+ (setq name (if (stringp x) x (buffer-name x)))
+ (when (and (string-match regexp name)
+ (not (iswitchb-ignore-buffername-p name)))
+ (push name ret)))
+ (invalid-regexp
+ (setq iswitchb-invalid-regexp t)
+ (cdr error)))))
(defun iswitchb-ignore-buffername-p (bufname)
"Return t if the buffer BUFNAME should be ignored."
(progn
(setq ignorep t)
(setq re-list nil))))
- ((fboundp nextstr)
+ ((functionp nextstr)
(if (funcall nextstr bufname)
(progn
(setq ignorep t)
(set-buffer-major-mode newbufcreated))
(iswitchb-visit-buffer newbufcreated))
;; else wont create new buffer
- (message (format "no buffer matching `%s'" buf)))))
+ (message "no buffer matching `%s'" buf))))
(defun iswitchb-window-buffer-p (buffer)
"Return window pointer if BUFFER is visible in another frame.
(put-text-property 0 (length first) 'face
(if (= (length comps) 1)
(if iswitchb-invalid-regexp
- 'iswitchb-invalid-regexp-face
- 'iswitchb-single-match-face)
- 'iswitchb-current-match-face)
+ 'iswitchb-invalid-regexp
+ 'iswitchb-single-match)
+ 'iswitchb-current-match)
first)
(setq comps (cons first (cdr comps)))))
(let ((comp comps))
(while comp
(put-text-property 0 (length (car comp))
- 'face 'iswitchb-virtual-matches-face
+ 'face 'iswitchb-virtual-matches
(car comp))
(setq comp (cdr comp))))))
(iswitchb-to-end summaries)))
(defun iswitchb-case ()
- "Return non-nil iff we should ignore case when matching.
+ "Return non-nil if we should ignore case when matching.
See the variable `iswitchb-case' for details."
(if iswitchb-case
(if (featurep 'xemacs)
;;;###autoload
(define-minor-mode iswitchb-mode
"Toggle Iswitchb global minor mode.
-With arg, turn Iswitchb mode on if and only iff ARG is positive.
+With arg, turn Iswitchb mode on if ARG is positive, otherwise turn it off.
This mode enables switching between buffers using substrings. See
`iswitchb' for details."
nil nil iswitchb-global-map :global t :group 'iswitchb
(provide 'iswitchb)
-;;; arch-tag: d74198ae-753f-44f2-b34f-0c515398d90a
+;; arch-tag: d74198ae-753f-44f2-b34f-0c515398d90a
;;; iswitchb.el ends here