Mercurial > emacs
changeset 60805:aba5f8c41ae0
Don't forcibly turn on the mode upon load.
(icomplete-mode): Use define-minor-mode.
(icomplete-eoinput): Default to nil.
(icomplete-minibuffer-setup): Remove autoload.
(icomplete-tidy): Simplify.
(icomplete-exhibit): Use buffer-undo-list to determine if we're still
in the initial state or if the user has modified the field.
Fix handling of icomplete-max-delay-chars.
Remove code that handles the oddball case where
minibuffer-completion-table is an integer.
Wrap icomplete-completions in while-no-input in case building
completions takes more time than expected.
(icomplete-completions): Simplify.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Mon, 21 Mar 2005 19:19:15 +0000 |
parents | 2d1a165680f5 |
children | 1af19368d36d |
files | lisp/icomplete.el |
diffstat | 1 files changed, 57 insertions(+), 95 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/icomplete.el Mon Mar 21 19:15:03 2005 +0000 +++ b/lisp/icomplete.el Mon Mar 21 19:19:15 2005 +0000 @@ -1,7 +1,7 @@ ;;; icomplete.el --- minibuffer completion incremental feedback -;; Copyright (C) 1992, 1993, 1994, 1997, 1999, 2001 -;;; Free Software Foundation, Inc. +;; Copyright (C) 1992, 1993, 1994, 1997, 1999, 2001, 2005 +;; Free Software Foundation, Inc. ;; Author: Ken Manheimer <klm@i.am> ;; Maintainer: Ken Manheimer <klm@i.am> @@ -69,19 +69,6 @@ :prefix "icomplete-" :group 'minibuffer) -(defcustom icomplete-mode nil - "*Toggle incremental minibuffer completion. -As text is typed into the minibuffer, prospective completions are indicated -in the minibuffer. -Setting this variable directly does not take effect; -use either \\[customize] or the function `icomplete-mode'." - :set (lambda (symbol value) - (icomplete-mode (if value 1 -1))) - :initialize 'custom-initialize-default - :type 'boolean - :group 'icomplete - :require 'icomplete) - ;;;_* User Customization variables (defcustom icomplete-prospects-length 80 "*Length of string displaying the prospects." @@ -131,8 +118,8 @@ ;;;_* Initialization ;;;_ + Internal Variables -;;;_ = icomplete-eoinput 1 -(defvar icomplete-eoinput 1 +;;;_ = icomplete-eoinput nil +(defvar icomplete-eoinput nil "Point where minibuffer input ends and completion info begins.") (make-variable-buffer-local 'icomplete-eoinput) ;;;_ = icomplete-pre-command-hook @@ -173,18 +160,15 @@ ;;;_ > icomplete-mode (&optional prefix) ;;;###autoload -(defun icomplete-mode (&optional arg) +(define-minor-mode icomplete-mode "Toggle incremental minibuffer completion for this Emacs session. With a numeric argument, turn Icomplete mode on iff ARG is positive." - (interactive "P") - (let ((on-p (if (null arg) - (not icomplete-mode) - (> (prefix-numeric-value arg) 0)))) - (setq icomplete-mode on-p) - (when on-p + :global t :group 'icomplete + (if icomplete-mode ;; The following is not really necessary after first time - ;; no great loss. - (add-hook 'minibuffer-setup-hook 'icomplete-minibuffer-setup)))) + (add-hook 'minibuffer-setup-hook 'icomplete-minibuffer-setup) + (remove-hook 'minibuffer-setup-hook 'icomplete-minibuffer-setup))) ;;;_ > icomplete-simple-completing-p () (defun icomplete-simple-completing-p () @@ -193,29 +177,27 @@ Conditions are: the selected window is a minibuffer, and not in the middle of macro execution, - and minibuffer-completion-table is not a symbol (which would + and `minibuffer-completion-table' is not a symbol (which would indicate some non-standard, non-simple completion mechanism, like file-name and other custom-func completions)." (and (window-minibuffer-p (selected-window)) (not executing-kbd-macro) - (not (symbolp minibuffer-completion-table)))) + ;; (or minibuffer-completing-file-name + (not (functionp minibuffer-completion-table)))) ;; ) ;;;_ > icomplete-minibuffer-setup () -;;;###autoload (defun icomplete-minibuffer-setup () "Run in minibuffer on activation to establish incremental completion. Usually run by inclusion in `minibuffer-setup-hook'." - (cond ((and icomplete-mode (icomplete-simple-completing-p)) - (add-hook 'pre-command-hook - (function (lambda () - (run-hooks 'icomplete-pre-command-hook))) - nil t) - (add-hook 'post-command-hook - (function (lambda () - (run-hooks 'icomplete-post-command-hook))) - nil t) - (run-hooks 'icomplete-minibuffer-setup-hook)))) + (when (and icomplete-mode (icomplete-simple-completing-p)) + (add-hook 'pre-command-hook + (lambda () (run-hooks 'icomplete-pre-command-hook)) + nil t) + (add-hook 'post-command-hook + (lambda () (run-hooks 'icomplete-post-command-hook)) + nil t) + (run-hooks 'icomplete-minibuffer-setup-hook))) ; @@ -226,60 +208,47 @@ "Remove completions display \(if any) prior to new user input. Should be run in on the minibuffer `pre-command-hook'. See `icomplete-mode' and `minibuffer-setup-hook'." - (if (icomplete-simple-completing-p) - (if (and (boundp 'icomplete-eoinput) - icomplete-eoinput) + (when icomplete-eoinput - (if (> icomplete-eoinput (point-max)) - ;; Oops, got rug pulled out from under us - reinit: - (setq icomplete-eoinput (point-max)) - (let ((buffer-undo-list buffer-undo-list )) ; prevent entry - (delete-region icomplete-eoinput (point-max)))) + (unless (>= icomplete-eoinput (point-max)) + (let ((buffer-undo-list t)) ; prevent entry + (delete-region icomplete-eoinput (point-max)))) - ;; Reestablish the local variable 'cause minibuffer-setup is weird: - (make-local-variable 'icomplete-eoinput) - (setq icomplete-eoinput 1)))) + ;; Reestablish the safe value. + (setq icomplete-eoinput nil))) ;;;_ > icomplete-exhibit () (defun icomplete-exhibit () "Insert icomplete completions display. Should be run via minibuffer `post-command-hook'. See `icomplete-mode' and `minibuffer-setup-hook'." - (if (icomplete-simple-completing-p) - (let ((contents (buffer-substring (minibuffer-prompt-end)(point-max))) - (buffer-undo-list t)) - (save-excursion - (goto-char (point-max)) - ; Register the end of input, so we - ; know where the extra stuff - ; (match-status info) begins: - (if (not (boundp 'icomplete-eoinput)) - ;; In case it got wiped out by major mode business: - (make-local-variable 'icomplete-eoinput)) - (setq icomplete-eoinput (point)) + (when (icomplete-simple-completing-p) + (save-excursion + (goto-char (point-max)) + ;; Register the end of input, so we know where the extra stuff + ;; (match-status info) begins: + (setq icomplete-eoinput (point)) ; Insert the match-status information: - (if (and (> (point-max) (minibuffer-prompt-end)) - (or - ;; Don't bother with delay after certain number of chars: - (> (point-max) icomplete-max-delay-chars) - ;; Don't delay if alternatives number is small enough: - (if minibuffer-completion-table - (cond ((numberp minibuffer-completion-table) - (< minibuffer-completion-table - icomplete-delay-completions-threshold)) - ((sequencep minibuffer-completion-table) - (< (length minibuffer-completion-table) - icomplete-delay-completions-threshold)) - )) - ;; Delay - give some grace time for next keystroke, before - ;; embarking on computing completions: - (sit-for icomplete-compute-delay))) - (insert - (icomplete-completions contents - minibuffer-completion-table - minibuffer-completion-predicate - (not - minibuffer-completion-confirm)))))))) + (if (and (> (point-max) (minibuffer-prompt-end)) + buffer-undo-list ; Wait for some user input. + (or + ;; Don't bother with delay after certain number of chars: + (> (- (point) (field-beginning)) icomplete-max-delay-chars) + ;; Don't delay if alternatives number is small enough: + (and (sequencep minibuffer-completion-table) + (< (length minibuffer-completion-table) + icomplete-delay-completions-threshold)) + ;; Delay - give some grace time for next keystroke, before + ;; embarking on computing completions: + (sit-for icomplete-compute-delay))) + (let ((text (while-no-input + (icomplete-completions + (field-string) + minibuffer-completion-table + minibuffer-completion-predicate + (not minibuffer-completion-confirm)))) + (buffer-undo-list t)) + (if text (insert text))))))) ;;;_ > icomplete-completions (name candidates predicate require-match) (defun icomplete-completions (name candidates predicate require-match) @@ -322,9 +291,7 @@ (concat open-bracket-determined (substring most (length name)) close-bracket-determined))) - (open-bracket-prospects "{") - (close-bracket-prospects "}") - ;"-prospects" - more than one candidate + ;;"-prospects" - more than one candidate (prospects-len 0) prospects most-is-exact comp) (if (eq most-try t) @@ -338,30 +305,25 @@ prospects-len (+ (length comp) 1 prospects-len)))))) (if prospects (concat determ - open-bracket-prospects + "{" (and most-is-exact ",") (mapconcat 'identity (sort prospects (function string-lessp)) ",") (and comps ",...") - close-bracket-prospects) + "}") (concat determ " [Matched" (let ((keys (and icomplete-show-key-bindings (commandp (intern-soft most)) (icomplete-get-keys most)))) - (if keys - (concat "; " keys) - "")) + (if keys (concat "; " keys) "")) "]")))))) -(if icomplete-mode - (icomplete-mode 1)) - ;;;_* Local emacs vars. ;;;Local variables: ;;;outline-layout: (-2 :) ;;;End: -;;; arch-tag: 339ec25a-0741-4eb6-be63-997532e89b0f +;; arch-tag: 339ec25a-0741-4eb6-be63-997532e89b0f ;;; icomplete.el ends here