emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 6fc502c: Don't resort Icomplete candidates when default already o


From: Joo Tvora
Subject: master 6fc502c: Don't resort Icomplete candidates when default already on top
Date: Sun, 6 Sep 2020 03:37:05 -0400 (EDT)

branch: master
commit 6fc502c1ef327ab357c971b9bffbbd7cb6a436f1
Author: João Távora <joaotavora@gmail.com>
Commit: João Távora <joaotavora@gmail.com>

    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.
---
 lisp/icomplete.el | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index ba266cf..47d78a0 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)))
 
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]