- ;; 'all-completions' doesn't like empty
- ;; minibuffer-completion-table's (ie: (nil))
- (if (and (listp candidates) (null (car candidates)))
- (setq candidates nil))
-
- (let ((comps (all-completions name candidates predicate))
- ; "-determined" - only one candidate
- (open-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)))
+ (let* ((non-essential t)
+ (comps (completion-all-sorted-completions))
+ (last (if (consp comps) (last comps)))
+ (base-size (cdr last))
+ (open-bracket (if require-match "(" "["))
+ (close-bracket (if require-match ")" "]")))
+ ;; `concat'/`mapconcat' is the slow part.
+ (if (not (consp comps))
+ (format " %sNo matches%s" open-bracket close-bracket)
+ (if last (setcdr last nil))
+ (let* ((most-try
+ (if (and base-size (> base-size 0))
+ (completion-try-completion
+ name candidates predicate (length name))
+ ;; If the `comps' are 0-based, the result should be
+ ;; the same with `comps'.
+ (completion-try-completion
+ name comps nil (length name))))
+ (most (if (consp most-try) (car most-try)
+ (if most-try (car comps) "")))
+ ;; Compare name and most, so we can determine if name is
+ ;; a prefix of most, or something else.
+ (compare (compare-strings name nil nil
+ most nil nil completion-ignore-case))
+ (determ (unless (or (eq t compare) (eq t most-try)
+ (= (setq compare (1- (abs compare)))
+ (length most)))
+ (concat open-bracket
+ (cond
+ ((= compare (length name))
+ ;; Typical case: name is a prefix.
+ (substring most compare))
+ ((< compare 5) most)
+ (t (concat "..." (substring most compare))))
+ close-bracket)))