]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't always resort in recently introduced icomplete--sorted-completions
authorJoão Távora <joaotavora@gmail.com>
Wed, 25 Dec 2019 19:18:17 +0000 (19:18 +0000)
committerJoão Távora <joaotavora@gmail.com>
Wed, 25 Dec 2019 19:18:17 +0000 (19:18 +0000)
Doing so breaks icomplete-forward-completions and
icomplete-backward-completions.

* lisp/icomplete.el (icomplete--sorted-completions): Don't always
resort.

lisp/icomplete.el

index 3b3cabb890e71f5bc32855c243c2fbf03c8a18ce..6bc75b39edbb5c4260a4c880dc0e7ea295eaa512 100644 (file)
@@ -442,36 +442,37 @@ Usually run by inclusion in `minibuffer-setup-hook'."
     (add-hook 'post-command-hook 'icomplete-post-command-hook nil t)))
 
 (defun icomplete--sorted-completions ()
-  (cl-loop
-   with beg = (icomplete--field-beg)
-   with end = (icomplete--field-end)
-   with all = (completion-all-sorted-completions beg end)
-   for fn in (cond ((and minibuffer-default
-                         (= (icomplete--field-end) (icomplete--field-beg)))
-                    ;; When we have a non-nil default and no input
-                    ;; whatsoever: we want to make sure that default
-                    ;; is bubbled to the top so that
-                    ;; `icomplete-force-complete-and-exit' will
-                    ;; select it (do that even if the match doesn't
-                    ;; match the completion perfectly.
-                    `(,(lambda (comp)
-                         (equal minibuffer-default comp))
-                      ,(lambda (comp)
-                         (string-prefix-p minibuffer-default comp))))
-                   ((and fido-mode
-                         (not minibuffer-default)
-                         (eq (icomplete--category) 'file))
-                    `(,(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)))
-   finally return all))
+  (or completion-all-sorted-completions
+      (cl-loop
+       with beg = (icomplete--field-beg)
+       with end = (icomplete--field-end)
+       with all = (completion-all-sorted-completions beg end)
+       for fn in (cond ((and minibuffer-default
+                             (= (icomplete--field-end) (icomplete--field-beg)))
+                        ;; When we have a non-nil default and no input
+                        ;; whatsoever: we want to make sure that default
+                        ;; is bubbled to the top so that
+                        ;; `icomplete-force-complete-and-exit' will
+                        ;; select it (do that even if the match doesn't
+                        ;; match the completion perfectly.
+                        `(,(lambda (comp)
+                             (equal minibuffer-default comp))
+                          ,(lambda (comp)
+                             (string-prefix-p minibuffer-default comp))))
+                       ((and fido-mode
+                             (not minibuffer-default)
+                             (eq (icomplete--category) 'file))
+                        `(,(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)))
+       finally return all)))
 
 \f