branch: elpa/isl
commit 9556242fa8cbd07a172db2a15371c50278d17fa2
Author: Thierry Volpiatto <[email protected]>
Commit: Thierry Volpiatto <[email protected]>

    Cache diff overlays and get rid of isl-closest-overlay
---
 isl.el | 22 +++++++---------------
 1 file changed, 7 insertions(+), 15 deletions(-)

diff --git a/isl.el b/isl.el
index 88769784800..986f3efaaf2 100644
--- a/isl.el
+++ b/isl.el
@@ -67,7 +67,7 @@
 
 ;; History
 (defvar isl-history nil)
-
+
 ;; Internals
 (defvar isl-pattern "")
 (defvar-local isl-last-query nil)
@@ -96,6 +96,7 @@
 (defvar isl--narrow-to-region nil)
 (defvar isl-search-invisible t)
 (defvar isl--buffer-tick nil)
+(defvar isl--closest-overlay nil)
 
 ;; User vars
 
@@ -416,11 +417,9 @@ It put overlay on current position, move to next overlay 
using
 (defun isl-goto-closest-from-start ()
   "Goto closest match from start."
   (interactive)
-  (let ((ov (isl-closest-overlay
-             isl--initial-pos isl--item-overlays)))
-    (if (eql ov isl--last-overlay)
-        (user-error "Already at closest occurence from start")
-      (isl--find-and-goto-overlay ov))))
+  (if (eql isl--closest-overlay isl--last-overlay)
+      (user-error "Already at closest occurence from start")
+    (isl--find-and-goto-overlay isl--closest-overlay)))
 (put 'isl-goto-closest-from-start 'no-helm-mx t)
 
 (defun isl-goto-next (&optional arg)
@@ -1051,6 +1050,7 @@ See `isl-requires-pattern'."
               (progn (setq isl--number-results 0)
                      (and isl--initial-pos (goto-char isl--initial-pos)))
             (setq isl--last-overlay (cdr (assq npos ovs-alist))
+                  isl--closest-overlay (cdr (assq npos ovs-alist))
                   isl--number-results (max (length isl--item-overlays) 0))
             (isl--highlight-last-overlay 'isl-on)
             (isl-make-or-update-iterator)
@@ -1145,15 +1145,6 @@ See `isl-requires-pattern'."
                                                 'help-echo 
"case-fold-search")))
                            " " mode-line-position)))))))
 
-(defun isl-closest-overlay (pos overlays)
-  "Return closest overlay from POS in OVERLAYS list."
-  (cl-loop for ov in overlays
-           for ovpos = (overlay-start ov)
-           for diff = (if (> pos ovpos) (- pos ovpos) (- ovpos pos))
-           collect (cons diff ov) into res
-           minimize diff into min
-           finally return (cdr (assq min res))))
-
 (defun isl-check-input ()
   "Check minibuffer input."
   (with-selected-window (minibuffer-window)
@@ -1212,6 +1203,7 @@ Arguments INITIAL-INPUT and DEFAULT are same as in 
`read-from-minibuffer'."
             isl--yank-point nil
             isl--iterator nil
             isl--item-overlays nil
+            isl--closest-overlay nil
             isl--last-overlay nil
             isl--number-results nil
             isl-case-fold-search (default-value 'isl-case-fold-search)

Reply via email to