summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoão Távora <joaotavora@gmail.com>2020-09-06 08:35:53 +0100
committerJoão Távora <joaotavora@gmail.com>2020-09-06 08:36:39 +0100
commit6fc502c1ef327ab357c971b9bffbbd7cb6a436f1 (patch)
tree965314c564fbdff4f5bbe123fed1707058ae9a0a
parent669b46e6a39bb5ba5d2ed14baebd585af6130ec9 (diff)
downloademacs-6fc502c1ef327ab357c971b9bffbbd7cb6a436f1.tar.gz
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.
-rw-r--r--lisp/icomplete.el21
1 files changed, 13 insertions, 8 deletions
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)))