summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoão Távora <joaotavora@gmail.com>2019-02-12 21:55:34 +0000
committerJoão Távora <joaotavora@gmail.com>2019-02-12 21:55:34 +0000
commit0daf79c64acce7dc0371e611e090184a90648ec1 (patch)
tree1f195242cbc143332065afb41a27feb39ea3abb9
parent8b44a4bffcba71da16bf909aae6f550a5374bee1 (diff)
downloademacs-scratch/new-flex-completion-style.tar.gz
Score flex-style completions according to match tightnessscratch/new-flex-completion-style
The new completion style needs to score completion matches so that we can use it later on when sorting the completions. This is because, in the flex style, "foo" can now match "foobar", "frodo" and "barfromsober" but we probably want "foobar" to appear at the top of the completion list. This change makes the new flex completion style add sort-order hints under the completion string's `completion-style-sort-order' property. * lisp/minibuffer.el (completion-pcm--hilit-commonality): Propertize completion with 'completion-pcm-commonality-score. (completion-flx-all-completions): Propertize completion with completion-style-sort-order and completion-style-annotation.
-rw-r--r--lisp/minibuffer.el37
1 files changed, 30 insertions, 7 deletions
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index cf626b3f32d..8ea70b14f12 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -3056,20 +3056,38 @@ PATTERN is as returned by `completion-pcm--string->pattern'."
(let* ((pos (if point-idx (match-beginning point-idx) (match-end 0)))
(md (match-data))
(start (pop md))
- (end (pop md)))
+ (end (pop md))
+ (len (length str))
+ (score-numerator 0)
+ (score-denominator 0)
+ (aux 0)
+ (update-score
+ (lambda (a b)
+ "Update score variables given match range (A B)."
+ (setq
+ score-numerator (+ score-numerator (- b a))
+ score-denominator (+ score-denominator (expt (- a aux) 1.5))
+ aux b))))
+ (funcall update-score 0 start)
(while md
- (put-text-property start (pop md)
+ (funcall update-score start (car md))
+ (put-text-property start
+ (pop md)
'font-lock-face 'completions-common-part
str)
(setq start (pop md)))
(put-text-property start end
'font-lock-face 'completions-common-part
str)
+ (funcall update-score start end)
(if (> (length str) pos)
(put-text-property pos (1+ pos)
- 'font-lock-face 'completions-first-difference
- str)))
- str)
+ 'font-lock-face 'completions-first-difference
+ str))
+ (put-text-property
+ 0 1 'completion-pcm-commonality-score
+ (/ score-numerator (* len (1+ score-denominator)) 1.0) str))
+ str)
completions))))
(defun completion-pcm--find-all-completions (string table pred point
@@ -3440,8 +3458,13 @@ which is at the core of flex logic. The extra
string table pred point
#'completion-flex--make-flex-pattern)))
(when all
- (nconc (completion-pcm--hilit-commonality pattern all)
- (length prefix)))))
+ (let ((hilighted (completion-pcm--hilit-commonality pattern all)))
+ (mapc
+ (lambda (comp)
+ (let ((score (get-text-property 0 'completion-pcm-commonality-score comp)))
+ (put-text-property 0 1 'completion-style-sort-order (- score) comp)))
+ hilighted)
+ (nconc hilighted (length prefix))))))
;; Initials completion
;; Complete /ums to /usr/monnier/src or lch to list-command-history.