- (close-bracket-determined (if require-match ")" "]"))
- ;"-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)))))))
+ (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)))
+ ;;"-prospects" - more than one candidate
+ (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
+ "{"
+ (and most-is-exact ",")
+ (mapconcat 'identity
+ (sort prospects (function string-lessp))
+ ",")
+ (and comps ",...")
+ "}")
+ (concat determ
+ " [Matched"
+ (let ((keys (and icomplete-show-key-bindings
+ (commandp (intern-soft most))
+ (icomplete-get-keys most))))
+ (if keys (concat "; " keys) ""))
+ "]"))))))