branch: master
commit b4c4a7ff0f0850686992915eb09ebaf3e03ac4f4
Author: Oleh Krehel <ohwoeo...@gmail.com>
Commit: Oleh Krehel <ohwoeo...@gmail.com>

    swiper.el (swiper--isearch-next-item): Extract
    
    Re #2154
    Re #2155
---
 swiper.el | 54 ++++++++++++++++++++++++++----------------------------
 1 file changed, 26 insertions(+), 28 deletions(-)

diff --git a/swiper.el b/swiper.el
index f5a09dc..ea3d145 100644
--- a/swiper.el
+++ b/swiper.el
@@ -1301,50 +1301,48 @@ See `ivy-format-functions-alist' for further 
information."
 (defvar swiper--isearch-start-point nil)
 
 (defun swiper--isearch-function-1 (re backward)
-  (let ((idx 0)
-        cands idx-found)
+  (let (cands)
     (save-excursion
       (goto-char (if backward (point-max) (point-min)))
       (while (funcall (if backward #'re-search-backward #'re-search-forward) 
re nil t)
         (when (swiper-match-usable-p)
-          (unless idx-found
-            (when (if backward
-                      (or (<= (match-end 0) swiper--isearch-start-point)
-                          (and (< (match-beginning 0) 
swiper--isearch-start-point)
-                               (let ((mb-match
-                                      (string-match-p
-                                       re
-                                       (buffer-substring-no-properties
-                                        (match-beginning 0)
-                                        swiper--isearch-start-point))))
-                                 (eq mb-match 0))))
-                    (>= (match-beginning 0) swiper--isearch-start-point))
-              (setq idx-found idx)))
-          (cl-incf idx)
           (let ((pos (if (or backward swiper-goto-start-of-match)
                          (match-beginning 0)
                        (point))))
             (push pos cands)))))
-    (cons
-     (if idx-found
-         (if backward
-             (- (length cands) idx-found 1)
-           idx-found)
+    (if backward
+        cands
+      (nreverse cands))))
+
+(defun swiper--isearch-next-item (re cands)
+  (if swiper--isearch-backward
+      (or
+       (cl-position-if
+        (lambda (x)
+          (and
+           (< x swiper--isearch-start-point)
+           (eq 0 (string-match-p
+                  re
+                  (buffer-substring-no-properties
+                   x swiper--isearch-start-point)))))
+        cands
+        :from-end t)
        0)
-     (if backward
-         cands
-       (nreverse cands)))))
+    (or
+     (cl-position-if
+      (lambda (x) (> x swiper--isearch-start-point))
+      cands)
+     0)))
 
 (defun swiper--isearch-function (str)
   (let ((re-full (funcall ivy--regex-function str)))
     (unless (equal re-full "")
       (let* ((case-fold-search (ivy--case-fold-p str))
              (re (ivy-re-to-str re-full))
-             (res (swiper--isearch-function-1 re swiper--isearch-backward))
-             (idx-found (car res))
-             (cands (cdr res)))
+             (cands (swiper--isearch-function-1 re swiper--isearch-backward))
+             (idx (swiper--isearch-next-item re cands)))
         (setq ivy--old-re re)
-        (ivy-set-index idx-found)
+        (ivy-set-index idx)
         (setq ivy--old-cands cands)))))
 
 (defcustom swiper-isearch-highlight-delay '(2 0.2)

Reply via email to