1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-24 15:22:26 -07:00

Introduce a variable to control ecomplete sorting

* lisp/ecomplete.el (ecomplete-sort-predicate): New variable.
(ecomplete-get-matches): Use it.
This commit is contained in:
Lars Ingebrigtsen 2018-01-16 15:22:11 +01:00
parent b02a06317b
commit f121b5d7f3
3 changed files with 36 additions and 2 deletions

View file

@ -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

View file

@ -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

View file

@ -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