X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/4e141ed744f843814cf1bcc0d0fe5a5f674419f6..33a316bae032bbb1a30ccd5e15d0c46a5279884b:/lisp/iswitchb.el diff --git a/lisp/iswitchb.el b/lisp/iswitchb.el index d24f737851..aab768387d 100644 --- a/lisp/iswitchb.el +++ b/lisp/iswitchb.el @@ -1,6 +1,6 @@ ;;; iswitchb.el --- switch between buffers using substrings -;; Copyright (C) 1996, 1997, 2000, 2001 Free Software Foundation, Inc. +;; Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. ;; Author: Stephen Eglen ;; Maintainer: Stephen Eglen @@ -29,6 +29,8 @@ ;; Installation: ;; To get the functions in this package bound to keys, use ;; M-x iswitchb-mode or customize the option `iswitchb-mode'. +;; Alternatively, add the following line to your .emacs: +;; (iswitchb-mode 1) ;; As you type in a substring, the list of buffers currently matching ;; the substring is displayed as you type. The list is ordered so @@ -61,11 +63,11 @@ ;; The list in {} are the matching buffers, most recent first (buffers ;; visible in the current frame are put at the end of the list by ;; default). At any time I can select the item at the head of the -;; list by pressing RET. I can also bring the put the first element -;; at the end of the list by pressing C-s, or put the last element at -;; the head of the list by pressing C-r. The item in [] indicates -;; what can be added to my input by pressing TAB. In this case, I -;; will get "3" added to my input. So, press TAB: +;; list by pressing RET. I can also put the first element at the end +;; of the list by pressing C-s, or put the last element at the head of +;; the list by pressing C-r. The item in [] indicates what can be +;; added to my input by pressing TAB. In this case, I will get "3" +;; added to my input. So, press TAB: ;; iswitch 23{123456,123} ;; ;; At this point, I still have two matching buffers. @@ -183,7 +185,7 @@ ;; Using iswitchb for other completion tasks. ;; Kin Cho (kin@neoscale.com) sent the following suggestion to use -;; iswitchb for other completion tasks. +;; iswitchb for other completion tasks. ;; ;; (defun my-icompleting-read (prompt choices) ;; "Use iswitch as a completing-read replacement to choose from @@ -209,8 +211,8 @@ ;; (delete-minibuffer-contents)) ;; ;; (add-hook 'iswitchb-define-mode-map-hook -;; '(lambda () (define-key -;; iswitchb-mode-map "\C-o" +;; '(lambda () (define-key +;; iswitchb-mode-map "\C-o" ;; 'iswitchb-exclude-nonmatching))) ;; Other lisp packages extend iswitchb behaviour to other tasks. See @@ -293,7 +295,7 @@ is temporarily case sensitive." 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." - :type '(repeat regexp) + :type '(repeat (choice regexp function)) :group 'iswitchb) (defcustom iswitchb-cannot-complete-hook 'iswitchb-completion-help @@ -375,18 +377,11 @@ See documentation of `walk-windows' for useful values.") "Iswitchb-specific customization of minibuffer setup. This hook is run during minibuffer setup iff `iswitchb' will be active. -It is intended for use in customizing iswitchb for interoperation -with other packages." -;;; For instance: - -;;; \(add-hook 'iswitchb-minibuffer-setup-hook -;;; \(function -;;; \(lambda () -;;; \(make-local-variable 'resize-minibuffer-window-max-height) -;;; \(setq resize-minibuffer-window-max-height 3)))) - -;;; will constrain rsz-mini to a maximum minibuffer height of 3 lines when -;;; iswitchb is running. Copied from `icomplete-minibuffer-setup-hook'." +For instance: +\(add-hook 'iswitchb-minibuffer-setup-hook + '\(lambda () (set (make-local-variable 'max-mini-window-height) 3))) +will constrain the minibuffer to a maximum height of 3 lines when +iswitchb is running." :type 'hook :group 'iswitchb) @@ -473,9 +468,6 @@ selected.") (defvar iswitchb-buffer-ignore-orig nil "Stores original value of `iswitchb-buffer-ignore'.") -(defvar iswitchb-xemacs (string-match "XEmacs" (emacs-version)) - "Non-nil if we are running XEmacs. Otherwise, assume we are running Emacs.") - (defvar iswitchb-default nil "Default buffer for iswitchb.") @@ -518,7 +510,7 @@ variable `iswitchb-mode'." (define-key map "\C-m" 'iswitchb-exit-minibuffer) (setq iswitchb-mode-map map) (run-hooks 'iswitchb-define-mode-map-hook))) - + ;;; MAIN FUNCTION (defun iswitchb () "Switch to buffer matching a substring. @@ -547,7 +539,7 @@ in a separate window. \\[iswitchb-kill-buffer] Kill buffer at head of buffer list." ;;\\[iswitchb-toggle-ignore] Toggle ignoring certain buffers (see \ ;;`iswitchb-buffer-ignore') - + (let* ((prompt "iswitch ") (buf (iswitchb-read-buffer prompt))) @@ -599,7 +591,6 @@ If REQUIRE-MATCH is non-nil, an existing-buffer must be selected." (iswitchb-set-matches) (let ((minibuffer-local-completion-map iswitchb-mode-map) - (iswitchb-prepost-hooks t) ;; Record the minibuffer depth that we expect to find once ;; the minibuffer is set up and iswitchb-entryfn-p is called. (iswitchb-minibuf-depth (1+ (minibuffer-depth))) @@ -612,7 +603,8 @@ If REQUIRE-MATCH is non-nil, an existing-buffer must be selected." nil ;require-match [handled elsewhere] nil ;initial-contents 'iswitchb-history))) - (if (get-buffer iswitchb-final-text) + (if (and (not (eq iswitchb-exit 'usefirst)) + (get-buffer iswitchb-final-text)) ;; This happens for example if the buffer was chosen with the mouse. (setq iswitchb-matches (list iswitchb-final-text))) @@ -626,7 +618,7 @@ If REQUIRE-MATCH is non-nil, an existing-buffer must be selected." (setq buf-sel iswitchb-final-text) ;; else take head of list (setq buf-sel (car iswitchb-matches))) - + ;; Or possibly choose the default buffer (if (equal iswitchb-final-text "") (setq buf-sel @@ -661,11 +653,11 @@ The result is stored in `iswitchb-common-match-string'." (let (res) (cond ((not iswitchb-matches) (run-hooks 'iswitchb-cannot-complete-hook)) - + ((= 1 (length iswitchb-matches)) ;; only one choice, so select it. (exit-minibuffer)) - + (t ;; else there could be some completions (setq res iswitchb-common-match-string) @@ -714,7 +706,9 @@ The result is stored in `iswitchb-common-match-string'." (interactive) (if (or (not iswitchb-require-match) (iswitchb-existing-buffer-p)) - (throw 'exit nil))) + (progn + (setq iswitchb-exit 'usefirst) + (throw 'exit nil)))) (defun iswitchb-select-buffer-text () "Select the buffer named by the prompt. @@ -847,16 +841,16 @@ BUFFER-LIST can be list of buffers or list of strings." ret) (mapcar (lambda (x) - + (if do-string (setq name x) ;We already have the name (setq name (buffer-name x))) - + (cond ((and (or (and string-format (string-match regexp name)) (and (null string-format) (string-match (regexp-quote regexp) name))) - + (not (iswitchb-ignore-buffername-p name))) (setq ret (cons name ret)) ))) @@ -954,10 +948,10 @@ Return the modified list with the last element prepended to it." (set-window-start win (point-min)) (scroll-other-window)) (set-buffer buf)) - + (with-output-to-temp-buffer temp-buf - (if iswitchb-xemacs - + (if (featurep 'xemacs) + ;; XEmacs extents are put on by default, doesn't seem to be ;; any way of switching them off. (display-completion-list (if iswitchb-matches @@ -1012,7 +1006,7 @@ Return the modified list with the last element prepended to it." (or (eq iswitchb-method 'always-frame) (y-or-n-p "Jump to frame? "))) (setq newframe (window-frame win)) - (if (not iswitchb-xemacs) + (if (fboundp 'select-frame-set-input-focus) (select-frame-set-input-focus newframe) (raise-frame newframe) (select-frame newframe) @@ -1032,7 +1026,7 @@ Return the modified list with the last element prepended to it." ((eq iswitchb-method 'otherframe) (progn (switch-to-buffer-other-frame buffer) - (if (not iswitchb-xemacs) + (if (fboundp 'select-frame-set-input-focus) (select-frame-set-input-focus (selected-frame))) ))))) @@ -1043,7 +1037,7 @@ Return the modified list with the last element prepended to it." (if (and iswitchb-newbuffer (or (not iswitchb-prompt-newbuffer) - + (and iswitchb-prompt-newbuffer (y-or-n-p (format @@ -1143,7 +1137,7 @@ This is a hack for XEmacs, and should really be handled by `iswitchb-exhibit'." (goto-char (point-min))))) ;; add this hook for XEmacs only. -(if iswitchb-xemacs +(if (featurep 'xemacs) (add-hook 'iswitchb-minibuffer-setup-hook 'iswitchb-init-XEmacs-trick)) @@ -1157,7 +1151,7 @@ This is a hack for XEmacs, and should really be handled by `iswitchb-exhibit'." (define-key iswitchb-mode-map '[backspace] 'backward-delete-char) (define-key iswitchb-mode-map '[(meta backspace)] 'backward-kill-word)) -(if iswitchb-xemacs +(if (featurep 'xemacs) (add-hook 'iswitchb-define-mode-map-hook 'iswitchb-xemacs-backspacekey)) @@ -1187,16 +1181,14 @@ Copied from `icomplete-exhibit' with two changes: (iswitchb-set-common-completion) ;; Insert the match-status information: - (insert (iswitchb-completions + (insert (iswitchb-completions contents - minibuffer-completion-table - minibuffer-completion-predicate (not minibuffer-completion-confirm))))))) -(defun iswitchb-completions (name candidates predicate require-match) +(defun iswitchb-completions (name require-match) "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 "(" "[")) @@ -1237,7 +1229,6 @@ Modified from `icomplete-completions'." (most nil) (most-len (length most)) most-is-exact - first (alternatives (apply (function concat) @@ -1273,7 +1264,7 @@ Modified from `icomplete-completions'." (concat open-bracket-determined (substring most (length name)) close-bracket-determined)) - + ;; list all alternatives open-bracket-prospects (if most-is-exact @@ -1304,13 +1295,13 @@ Copied from `icomplete-tidy'." (if (and (boundp 'iswitchb-eoinput) iswitchb-eoinput) - + (if (> iswitchb-eoinput (point-max)) ;; Oops, got rug pulled out from under us - reinit: (setq iswitchb-eoinput (point-max)) (let ((buffer-undo-list buffer-undo-list )) ; prevent entry (delete-region iswitchb-eoinput (point-max)))) - + ;; Reestablish the local variable 'cause minibuffer-setup is weird: (make-local-variable 'iswitchb-eoinput) (setq iswitchb-eoinput 1))) @@ -1336,7 +1327,7 @@ This is an example function which can be hooked on to "Return non-nil iff we should ignore case when matching. See the variable `iswitchb-case' for details." (if iswitchb-case - (if iswitchb-xemacs + (if (featurep 'xemacs) (isearch-no-upper-case-p iswitchb-text) (isearch-no-upper-case-p iswitchb-text t)))) @@ -1353,4 +1344,5 @@ This mode enables switching between buffers using substrings. See (provide 'iswitchb) +;;; arch-tag: d74198ae-753f-44f2-b34f-0c515398d90a ;;; iswitchb.el ends here