Commit f121b5d7 authored by Lars Ingebrigtsen's avatar Lars Ingebrigtsen

Introduce a variable to control ecomplete sorting

* lisp/ecomplete.el (ecomplete-sort-predicate): New variable.
(ecomplete-get-matches): Use it.
parent b02a0631
......@@ -1485,6 +1485,9 @@ choose one of these completions, use the @kbd{M-n} command to move
down to the list. Use @kbd{M-n} and @kbd{M-p} to move down and up the
list, and @kbd{RET} to choose a completion.
The @code{ecomplete-sort-predicate} variable controls how
@code{ecomplete} matches are sorted.
@node Spelling
@section Spelling
@cindex spelling
......
......@@ -230,6 +230,10 @@ are implemented in C using the Jansson library.
It's a simple convenience function for looking up MIME types based on
file name extensions.
+++
** The ecomplete sorting has changed to a decay-based algorithm. This
can be controlled by the new `ecomplete-sort-predicate' variable.
* Changes in Emacs 27.1 on Non-Free Operating Systems
......
......@@ -70,6 +70,19 @@
:type '(symbol :tag "Coding system")
:group 'ecomplete)
(defcustom ecomplete-sort-predicate 'ecomplete-decay
"Predicate to use when sorting matched.
The predicate is called with two parameters that represent the
completion. Each parameter is a list where the first element is
the times the completion has been used, the second is the
timestamp of the most recent usage, and the third item is the
string that was matched."
:type '(radio (function-item :tag "Sort by usage and newness" ecomplete-decay)
(function-item :tag "Sort by times used" ecomplete-usage)
(function-item :tag "Sort by newness" ecomplete-newness)
(function :tag "Other"))
:group 'ecomplete)
;;; Internal variables.
(defvar ecomplete-database nil)
......@@ -122,8 +135,7 @@
(loop for (key count time text) in elems
when (string-match match text)
collect (list count time text))
(lambda (l1 l2)
(> (car l1) (car l2))))))
ecomplete-sort-predicate)))
(when (> (length candidates) 10)
(setcdr (nthcdr 10 candidates) nil))
(unless (zerop (length candidates))
......@@ -189,6 +201,21 @@ matches."
(forward-char 1)))
(buffer-string)))
(defun ecomplete-usage (l1 l2)
(> (car l1) (car l2)))
(defun ecomplete-newness (l1 l2)
(> (cadr l1) (cadr l2)))
(defun ecomplete-decay (l1 l2)
(> (ecomplete-decay-1 l1) (ecomplete-decay-1 l2)))
(defun ecomplete-decay-1 (elem)
;; We subtract 5% from the item for each week it hasn't been used.
(/ (car elem)
(expt 1.05 (/ (- (float-time) (cadr elem))
(* 7 24 60 60)))))
(provide 'ecomplete)
;;; ecomplete.el ends here
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment