From: João Távora Date: Sun, 6 Sep 2020 07:35:53 +0000 (+0100) Subject: Don't resort Icomplete candidates when default already on top X-Git-Tag: emacs-28.0.90~6223 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=6fc502c1ef327ab357c971b9bffbbd7cb6a436f1;p=emacs.git Don't resort Icomplete candidates when default already on top Fixes: bug#43222 Icomplete mode re-sorts candidates, bubbling the default to top if it's found somewhere down the list. This is done according to two criteria: exact match and prefix match. Before this fix, it didn't take into account the possibility that the exact match for the default would already be on top, and would incorrectly bubble a prefixing completion down the list to the top. This commit fixes that. * lisp/icomplete.el (icomplete--sorted-completions): Rework. Recomment. --- diff --git a/lisp/icomplete.el b/lisp/icomplete.el index ba266cfbfe9..47d78a0bc82 100644 --- a/lisp/icomplete.el +++ b/lisp/icomplete.el @@ -469,6 +469,7 @@ Usually run by inclusion in `minibuffer-setup-hook'." with beg = (icomplete--field-beg) with end = (icomplete--field-end) with all = (completion-all-sorted-completions beg end) + ;; First, establish the "bubble up" predicates. for fn in (cond ((and minibuffer-default (stringp minibuffer-default) ; bug#38992 (= (icomplete--field-end) (icomplete--field-beg))) @@ -493,14 +494,18 @@ Usually run by inclusion in `minibuffer-setup-hook'." ;; what vanilla Emacs and `ido-mode' both do. `(,(lambda (comp) (string= "./" comp))))) - thereis (cl-loop - for l on all - while (consp (cdr l)) - for comp = (cadr l) - when (funcall fn comp) - do (setf (cdr l) (cddr l)) - and return - (completion--cache-all-sorted-completions beg end (cons comp all))) + ;; Now, look for a completion matching one of those predicates + ;; to bubble up (unless that completion is already on top). + thereis (or + (and (funcall fn (car all)) all) + (cl-loop + for l on all + while (consp (cdr l)) + for comp = (cadr l) + when (funcall fn comp) + do (setf (cdr l) (cddr l)) + and return + (completion--cache-all-sorted-completions beg end (cons comp all)))) finally return all)))