From 1934dbf4c9d4105df42ed3f8a1981b17c7d1dbfa Mon Sep 17 00:00:00 2001 From: Gerd Moellmann Date: Sun, 21 Nov 1999 13:44:26 +0000 Subject: [PATCH] (icomplete-completions): Use an explicit variable `icomplete-prospects-length', obviating the need to use an apparently faulty throw/catch arrangement. --- lisp/ChangeLog | 16 +++-- lisp/icomplete.el | 156 ++++++++++++++++++++-------------------------- 2 files changed, 78 insertions(+), 94 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 9a7ec62d43..24ec6d40c1 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +1999-11-21 Ken Manheimer + + * icomplete.el (icomplete-completions): Use an explicit variable + `icomplete-prospects-length', obviating the need to use an + apparently faulty throw/catch arrangement. + 1999-11-21 Eli Zaretskii * term/internal.el (IT-display-table-setup): Don't overstep @@ -10,13 +16,13 @@ 1999-11-19 Stefan Monnier - * scroll-bar.el (scroll-bar-toolkit-scroll): add handling of the `ratio' - event for Xaw and Xaw3d(without arrows) scrollbars. + * scroll-bar.el (scroll-bar-toolkit-scroll): Add handling of the + `ratio' event for Xaw and Xaw3d(without arrows) scrollbars. - * files.el (auto-mode-alist): add patterns for diff-mode. + * files.el (auto-mode-alist): Add patterns for diff-mode. - * complete.el (PC-do-complete-and-exit): use minibuffer-prompt-end to - detect an empty prompt. + * complete.el (PC-do-complete-and-exit): Use minibuffer-prompt-end + to detect an empty prompt. 1999-11-18 Dave Love diff --git a/lisp/icomplete.el b/lisp/icomplete.el index 0452971a18..aba6ab4994 100644 --- a/lisp/icomplete.el +++ b/lisp/icomplete.el @@ -1,10 +1,11 @@ -;;; icomplete.el --- minibuffer completion incremental feedback +;;;_+ icomplete.el - minibuffer completion incremental feedback ;; Copyright (C) 1992, 1993, 1994, 1997 Free Software Foundation, Inc. -;; Author: Ken Manheimer -;; Maintainer: Ken Manheimer -;; Created: Mar 1993 klm@nist.gov - first release to usenet +;; Author: Ken Manheimer +;; Maintainer: Ken Manheimer +;; Created: Mar 1993 Ken Manheimer, klm@nist.gov - first release to usenet +;; Last update: Ken Manheimer , 11/18/1999. ;; Keywords: help, abbrev ;; This file is part of GNU Emacs. @@ -38,19 +39,14 @@ ;; customize icomplete setup for interoperation with other ;; minibuffer-oriented packages. -;; To activate icomplete mode, simply add the following to .emacs: -;; (icomplete-mode) -;; You can subsequently deactivate it by invoking the function -;; icomplete-mode with a negative prefix-arg (C-U -1 ESC-x -;; icomplete-mode). Also, you can prevent activation of the mode -;; during package load by first setting the variable `icomplete-mode' -;; to nil. Icompletion can be enabled any time after the package is -;; loaded by invoking icomplete-mode without a prefix arg. - -;; This version of icomplete runs on Emacs 19.18 and later. (It -;; depends on the incorporation of minibuffer-setup-hook.) The elisp -;; archives, ftp://archive.cis.ohio-state.edu/pub/gnu/emacs/elisp-archive, -;; probably still has a version that works in GNU Emacs v18. +;; To activate icomplete mode, load the package and use the +;; `icomplete-mode' function. You can subsequently deactivate it by +;; invoking the function icomplete-mode with a negative prefix-arg +;; (C-U -1 ESC-x icomplete-mode). Also, you can prevent activation of +;; the mode during package load by first setting the variable +;; `icomplete-mode' to nil. Icompletion can be enabled any time after +;; the package is loaded by invoking icomplete-mode without a prefix +;; arg. ;; Thanks to everyone for their suggestions for refinements of this ;; package. I particularly have to credit Michael Cook, who @@ -72,9 +68,8 @@ :prefix "icomplete-" :group 'minibuffer) -;;;_* User Customization variables (defcustom icomplete-mode nil - "Toggle incremental minibuffer completion. + "*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; @@ -86,6 +81,12 @@ use either \\[customize] or the function `icomplete-mode'." :group 'icomplete :require 'icomplete) +;;;_* User Customization variables +(defcustom icomplete-prospects-length 80 + "*Length of string displaying the prospects." + :type 'integer + :group 'icomplete) + (defcustom icomplete-compute-delay .3 "*Completions-computation stall, used only with large-number completions - see `icomplete-delay-completions-threshold'." @@ -215,7 +216,9 @@ Usually run by inclusion in `minibuffer-setup-hook'." (run-hooks 'icomplete-post-command-hook))) nil t) (run-hooks 'icomplete-minibuffer-setup-hook)))) - +; + + ;;;_* Completion ;;;_ > icomplete-tidy () @@ -306,76 +309,51 @@ are exhibited within the square braces.)" (let ((comps (all-completions name candidates predicate)) ; "-determined" - only one candidate (open-bracket-determined (if require-match "(" "[")) - (close-bracket-determined (if require-match ")" "]")) + (close-bracket-determined (if require-match ")" "]"))) + ;; `concat'/`mapconcat' is the slow part. With the introduction of + ;; `icomplete-prospects-length', there is no need for `catch'/`throw'. + (if (null comps) (format " %sNo matches%s" + open-bracket-determined + close-bracket-determined) + (let* ((most-try (try-completion name (mapcar (function list) comps))) + (most (if (stringp most-try) most-try (car comps))) + (most-len (length most)) + (determ (and (> most-len (length name)) + (concat open-bracket-determined + (substring most (length name)) + close-bracket-determined))) + (open-bracket-prospects "{") + (close-bracket-prospects "}") ;"-prospects" - more than one candidate - (open-bracket-prospects "{") - (close-bracket-prospects "}") - ) - (catch 'input - (cond ((null comps) (format " %sNo matches%s" - open-bracket-determined - close-bracket-determined)) - ((null (cdr comps)) ;one match - (concat (if (and (> (length (car comps)) - (length name))) - (concat open-bracket-determined - (substring (car comps) (length name)) - close-bracket-determined) - "") - " [Matched" - (let ((keys (and icomplete-show-key-bindings - (commandp (intern-soft (car comps))) - (icomplete-get-keys (car comps))))) - (if keys - (concat "; " keys) - "")) - "]")) - (t ;multiple matches - (let* ((most - (try-completion name candidates - (and predicate - ;; Wrap predicate in impatience - ie, - ;; `throw' up when pending input is - ;; noticed. Adds some overhead to - ;; predicate, but should be worth it. - (function - (lambda (item) - (if (input-pending-p) - (throw 'input "") - (apply predicate - item nil))))))) - (most-len (length most)) - most-is-exact - (alternatives - (substring - (apply (function concat) - (mapcar (function - (lambda (com) - (if (input-pending-p) - (throw 'input "")) - (if (= (length com) most-len) - ;; Most is one exact match, - ;; note that and leave out - ;; for later indication: - (progn - (setq most-is-exact t) - ()) - (concat "," - (substring com - most-len))))) - comps)) - 1))) - (concat (and (> most-len (length name)) - (concat open-bracket-determined - (substring most (length name)) - close-bracket-determined)) - open-bracket-prospects - (if most-is-exact - ;; Add a ',' at the front to indicate "complete but - ;; not unique": - (concat "," alternatives) - alternatives) - close-bracket-prospects))))))) + (prospects-len 0) + prospects most-is-exact comp) + (if (eq most-try t) + (setq prospects nil) + (while (and comps (< prospects-len icomplete-prospects-length)) + (setq comp (substring (car comps) most-len) + comps (cdr comps)) + (cond ((string-equal comp "") (setq most-is-exact t)) + ((member comp prospects)) + (t (setq prospects (cons comp prospects) + 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 icomplete-mode (icomplete-mode 1)) -- 2.20.1