(defun icomplete--sorted-completions ()
(let ((all (completion-all-sorted-completions
(icomplete--field-beg) (icomplete--field-end))))
- (if (and fido-mode
- (window-minibuffer-p)
- (not minibuffer-default)
- (eq (icomplete--category) 'file))
- (cl-loop for l on all
- while (listp (cdr l))
- for comp = (cadr l)
- when (string= comp "./")
- do (setf (cdr l) (cddr l))
- and return
- (setq completion-all-sorted-completions (cons comp all))
- finally return all)
- all)))
+ (cl-loop
+ 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
+ (setq completion-all-sorted-completions (cons comp all)))
+ finally return all)))
\f
;; JT@2019-12-23: FIXME: this is still wrong. What
;; we need to test here is "some input that actually
;; leads to flex filtering", not "something after
- ;; the minibuffer prompt". The latter is always
- ;; true for file searches, meaning the next clauses
- ;; will be ignored.
+ ;; the minibuffer prompt". Among other
+ ;; inconsistencies, the latter is always true for
+ ;; file searches, meaning the next clauses will be
+ ;; ignored.
(> (point-max) (minibuffer-prompt-end)))
(sort
pre-sorted
(let ((s1 (get-text-property 0 'completion-score c1))
(s2 (get-text-property 0 'completion-score c2)))
(> (or s1 0) (or s2 0))))))
- (minibuffer-default
- ;; If we have an empty pattern and a non-nil default, we
- ;; want to make sure that default is bubbled to the top
- ;; so that a "force-completion" operation will select
- ;; it. We want that to happen even if it doesn't match
- ;; the completion perfectly.
- (cl-loop
- ;; JT@2019-12-23: FIXME: ideally, we want to use
- ;; flex-matching itself on the default itself, not
- ;; `equal' or `string-prefix-p'.
- for fn in '(equal string-prefix-p)
- thereis (cl-loop
- for l on pre-sorted
- for comp = (cadr l)
- when (funcall fn minibuffer-default comp)
- do (setf (cdr l) (cddr l))
- and return (cons comp pre-sorted))
- finally return pre-sorted))
- (t
- pre-sorted))))))
+ (t pre-sorted))))))
`(metadata
(display-sort-function
. ,(compose-flex-sort-fn