Make icomplete-forward-completions O(1) when icomplete-scroll is t

In particular, this makes the recently added
icomplete-vertical-goto-last (bug#49005) be O(n) instead of O(n^2).
That used to be almost unbearably slow for large n.

* lisp/icomplete.el (icomplete-forward-completions):  don't call last
unless needed.
This commit is contained in:
João Távora 2021-08-19 23:54:51 +01:00
parent a3df92f483
commit fb81c8c3ad

View file

@ -258,14 +258,14 @@ Return non-nil iff something was stepped."
(interactive)
(let* ((beg (icomplete--field-beg))
(end (icomplete--field-end))
(comps (completion-all-sorted-completions beg end))
(last (last comps)))
(comps (completion-all-sorted-completions beg end)))
(when (consp (cdr comps))
(cond (icomplete-scroll
(push (pop comps) icomplete--scrolled-past)
(setq icomplete--scrolled-completions comps))
(t
(setcdr (last comps) (cons (pop comps) (cdr last)))))
(let ((last (last comps)))
(setcdr (last comps) (cons (pop comps) (cdr last))))))
(completion--cache-all-sorted-completions beg end comps))))
(defun icomplete-backward-completions ()