Mercurial > emacs
changeset 63012:3ae2519a0cfd
(iswitchb-single-match-face)
(iswitchb-current-match-face, iswitchb-virtual-matches-face)
(iswitchb-invalid-regexp-face): New faces.
(iswitchb-completions): Use them.
(iswitchb-use-faces): Renamed from iswitchb-use-fonts, which is
now marked as an obsolete alias.
(iswitchb-read-buffer): Remove check for bound font variables.
(iswitchb-invalid-regexp): New free variable.
(iswitchb-get-matched-buffers): Catch invalid-regexp errors and
set iswitchb-invalid-regexp.
(iswitchb, iswitchb-complete, iswitchb-completions): Deal with invalid regexps.
(iswitchb-completions): Add check for complete match when entering a regexp.
(iswitchb-completions): Remove require-match argument.
(iswitchb-exhibit): Fix caller.
(iswitchb-common-match-inserted): New variable.
(iswitchb-complete, iswitchb-completion-help): Use it.
author | Eli Zaretskii <eliz@gnu.org> |
---|---|
date | Sat, 04 Jun 2005 19:10:07 +0000 |
parents | 2b4fae9529bd |
children | 72fa85f045b3 |
files | lisp/iswitchb.el |
diffstat | 1 files changed, 93 insertions(+), 53 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/iswitchb.el Sat Jun 04 19:03:06 2005 +0000 +++ b/lisp/iswitchb.el Sat Jun 04 19:10:07 2005 +0000 @@ -1,6 +1,6 @@ ;;; iswitchb.el --- switch between buffers using substrings -;; Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. +;; Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 Free Software Foundation, Inc. ;; Author: Stephen Eglen <stephen@gnu.org> ;; Maintainer: Stephen Eglen <stephen@gnu.org> @@ -165,11 +165,10 @@ ;; Font-Lock -;; If you have font-lock loaded, the first matching buffer is -;; highlighted. To switch this off, set (setq iswitchb-use-fonts nil) -;; I don't use font-lock that much, so I've hardcoded the faces. If -;; this is too harsh, let me know. Colouring of the matching buffer -;; name was suggested by Carsten Dominik (dominik@strw.leidenuniv.nl) +;; font-lock is used to highlight the first matching buffer. To +;; switch this off, set (setq iswitchb-use-faces nil). Colouring of +;; the matching buffer name was suggested by Carsten Dominik +;; (dominik@strw.leidenuniv.nl) ;; Replacement for read-buffer @@ -230,16 +229,10 @@ ;; Regexp matching -;; There is limited provision for regexp matching within iswitchb, -;; enabled through `iswitchb-regexp'. This allows you to type `c$' -;; for example and see all buffer names ending in `c'. This facility -;; is quite limited though in two respects. First, you can't -;; currently type in expressions like `[0-9]' directly -- you have to -;; type them in when iswitchb-regexp is nil and then toggle on the -;; regexp functionality. Likewise, don't enter an expression -;; containing `\' in regexp mode. If you try, iswitchb gets confused, -;; so just hit C-g and try again. Secondly, no completion mechanism -;; is currently offered when regexp searching. +;; There is provision for regexp matching within iswitchb, enabled +;; through `iswitchb-regexp'. This allows you to type `c$' for +;; example and see all buffer names ending in `c'. No completion +;; mechanism is currently offered when regexp searching. ;;; TODO @@ -256,6 +249,8 @@ (fboundp 'last))) (require 'cl)) +(require 'font-lock) + ;; Set up the custom library. ;; taken from http://www.dina.kvl.dk/~abraham/custom/ (eval-and-compile @@ -377,10 +372,11 @@ :type 'boolean :group 'iswitchb) -(defcustom iswitchb-use-fonts t +(defcustom iswitchb-use-faces t "*Non-nil means use font-lock fonts 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." @@ -408,6 +404,35 @@ :type 'hook :group 'iswitchb) +(defface iswitchb-single-match-face + '((t + (:inherit font-lock-comment-face))) + "Iswitchb face for single matching buffer name." + :version "22.1" + :group 'iswitchb) + +(defface iswitchb-current-match-face + '((t + (:inherit font-lock-function-name-face))) + "Iswitchb face for current matching buffer name." + :version "22.1" + :group 'iswitchb) + +(defface iswitchb-virtual-matches-face + '((t + (:inherit font-lock-builtin-face))) + "Iswitchb face for matching virtual buffer names. +See also `iswitchb-use-virtual-buffers'." + :version "22.1" + :group 'iswitchb) + +(defface iswitchb-invalid-regexp-face + '((t + (:inherit font-lock-warning-face))) + "Iswitchb face for indicating invalid regexp. " + :version "22.1" + :group 'iswitchb) + ;; Do we need the variable iswitchb-use-mycompletion? ;;; Internal Variables @@ -507,6 +532,11 @@ (defvar iswitchb-minibuf-depth nil "Value we expect to be returned by `minibuffer-depth' in the minibuffer.") +(defvar iswitchb-common-match-inserted nil + "Non-nil if we have just inserted a common match in the minibuffer.") + +(defvar iswitchb-invalid-regexp) + ;;; FUNCTIONS ;;; ISWITCHB KEYMAP @@ -564,6 +594,7 @@ ;;`iswitchb-buffer-ignore') (let* ((prompt "iswitch ") + iswitchb-invalid-regexp (buf (iswitchb-read-buffer prompt))) ;;(message "chosen text %s" iswitchb-final-text) @@ -572,7 +603,8 @@ (cond ( (eq iswitchb-exit 'findfile) (call-interactively 'find-file)) - + (iswitchb-invalid-regexp + (message "Won't make invalid regexp named buffer")) (t ;; View the buffer ;;(message "go to buf %s" buf) @@ -602,10 +634,7 @@ buf-sel iswitchb-final-text (icomplete-mode nil) ;; prevent icomplete starting up - ;; can only use fonts if they have been bound. - (iswitchb-use-fonts (and iswitchb-use-fonts - (boundp 'font-lock-comment-face) - (boundp 'font-lock-function-name-face)))) + ) (iswitchb-define-mode-map) (setq iswitchb-exit nil) @@ -691,7 +720,9 @@ (let (res) (cond ((not iswitchb-matches) (run-hooks 'iswitchb-cannot-complete-hook)) - + (iswitchb-invalid-regexp + ;; Do nothing + ) ((= 1 (length iswitchb-matches)) ;; only one choice, so select it. (exit-minibuffer)) @@ -703,7 +734,8 @@ (not (equal res iswitchb-text))) ;; found something to complete, so put it in the minibuffer. (progn - (setq iswitchb-rescan nil) + (setq iswitchb-rescan nil + iswitchb-common-match-inserted t) (delete-region (minibuffer-prompt-end) (point)) (insert res)) ;; else nothing to complete @@ -889,6 +921,7 @@ (do-string (stringp (car list))) name ret) + (setq iswitchb-invalid-regexp nil) (catch 'invalid-regexp (mapcar (lambda (x) @@ -898,17 +931,15 @@ (setq name (buffer-name x))) (cond - ((and (or (and string-format - (condition-case error - (string-match regexp name) - (invalid-regexp - (throw 'invalid-regexp (setq ret (cdr error)))))) - (and (null string-format) - (string-match (regexp-quote regexp) name))) - + ((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)) - ))) + (setq ret (cons name ret))))) list)) ret)) @@ -994,7 +1025,8 @@ (temp-buf "*Completions*") (win)) - (if (eq last-command this-command) + (if (and (eq last-command this-command) + (not iswitchb-common-match-inserted)) ;; scroll buffer (progn (set-buffer temp-buf) @@ -1021,8 +1053,8 @@ (fundamental-mode)) (display-completion-list (if iswitchb-matches iswitchb-matches - iswitchb-buflist)) - ))))) + iswitchb-buflist)))) + (setq iswitchb-common-match-inserted nil)))) ;;; KILL CURRENT BUFFER @@ -1232,8 +1264,7 @@ ;; Insert the match-status information: (insert (iswitchb-completions - contents - (not minibuffer-completion-confirm))))))) + contents)))))) (eval-when-compile (defvar most-len) @@ -1248,27 +1279,29 @@ (setq most-is-exact t)) (substring com most-len))) -(defun iswitchb-completions (name require-match) +(defun iswitchb-completions (name) "Return the string that is displayed after the user's text. Modified from `icomplete-completions'." (let ((comps iswitchb-matches) ; "-determined" - only one candidate - (open-bracket-determined (if require-match "(" "[")) - (close-bracket-determined (if require-match ")" "]")) + (open-bracket-determined "[") + (close-bracket-determined "]") ;"-prospects" - more than one candidate (open-bracket-prospects "{") (close-bracket-prospects "}") first) - (if (and iswitchb-use-fonts comps) + (if (and iswitchb-use-faces comps) (progn (setq first (car comps)) (setq first (format "%s" first)) (put-text-property 0 (length first) 'face (if (= (length comps) 1) - 'font-lock-comment-face - 'font-lock-function-name-face) + (if iswitchb-invalid-regexp + 'iswitchb-invalid-regexp-face + 'iswitchb-single-match-face) + 'iswitchb-current-match-face) first) (setq comps (cons first (cdr comps))))) @@ -1297,7 +1330,7 @@ (let ((comp comps)) (while comp (put-text-property 0 (length (car comp)) - 'face 'font-lock-builtin-face + 'face 'iswitchb-virtual-matches-face (car comp)) (setq comp (cdr comp)))))) @@ -1305,16 +1338,23 @@ open-bracket-determined close-bracket-determined)) - ((null (cdr comps)) ;one match - (concat (if (and (> (length (car comps)) - (length name))) - (concat open-bracket-determined + (iswitchb-invalid-regexp + (concat " " (car comps))) + ((null (cdr comps)) ;one match + (concat + (if (if (not iswitchb-regexp) + (= (length name) + (length (car comps))) + (string-match name (car comps)) + (string-equal (match-string 0 (car comps)) + (car comps))) + "" + (concat open-bracket-determined ;; when there is one match, show the ;; matching buffer name in full (car comps) - close-bracket-determined) - "") - (if (not iswitchb-use-fonts) " [Matched]"))) + close-bracket-determined)) + (if (not iswitchb-use-faces) " [Matched]"))) (t ;multiple matches (if (and iswitchb-max-to-show (> (length comps) iswitchb-max-to-show))