[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master f121b5d: Introduce a variable to control ecomplete
From: |
Lars Ingebrigtsen |
Subject: |
[Emacs-diffs] master f121b5d: Introduce a variable to control ecomplete sorting |
Date: |
Tue, 16 Jan 2018 18:17:26 -0500 (EST) |
branch: master
commit f121b5d7f3aef080d0019eb39a57de51015ceb39
Author: Lars Ingebrigtsen <address@hidden>
Commit: Lars Ingebrigtsen <address@hidden>
Introduce a variable to control ecomplete sorting
* lisp/ecomplete.el (ecomplete-sort-predicate): New variable.
(ecomplete-get-matches): Use it.
---
doc/misc/message.texi | 3 +++
etc/NEWS | 4 ++++
lisp/ecomplete.el | 31 +++++++++++++++++++++++++++++--
3 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/doc/misc/message.texi b/doc/misc/message.texi
index ca06de3..0d5f85f 100644
--- a/doc/misc/message.texi
+++ b/doc/misc/message.texi
@@ -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
address@hidden matches are sorted.
+
@node Spelling
@section Spelling
@cindex spelling
diff --git a/etc/NEWS b/etc/NEWS
index abbedcf..872bd31 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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
diff --git a/lisp/ecomplete.el b/lisp/ecomplete.el
index 43ab8e6..2197d95 100644
--- a/lisp/ecomplete.el
+++ b/lisp/ecomplete.el
@@ -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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master f121b5d: Introduce a variable to control ecomplete sorting,
Lars Ingebrigtsen <=