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

    Prevent errors with iterator when search haven't yet started
    
    and user hit isl commands like isl-goto-next.
---
 isl.el | 65 +++++++++++++++++++++++++++++++++++------------------------------
 1 file changed, 35 insertions(+), 30 deletions(-)

diff --git a/isl.el b/isl.el
index 827d6cf984b..3da73d88e9d 100644
--- a/isl.el
+++ b/isl.el
@@ -387,12 +387,13 @@ It put overlay on current position, move to next overlay 
using
 (defun isl--find-and-goto-overlay (overlay)
   "Consume iterator up to OVERLAY and jump to it."
   (with-selected-window (minibuffer-selected-window)
-    (let (ov)
-      (while (not (eql (setq ov (isl-iter-next isl--iterator))
-                       overlay)))
-      (isl--highlight-last-overlay 'isl-match)
-      (and ov (isl--goto-overlay ov)))
-    (isl-setup-mode-line)))
+    (when isl--iterator
+      (let (ov)
+        (while (not (eql (setq ov (isl-iter-next isl--iterator))
+                         overlay)))
+        (isl--highlight-last-overlay 'isl-match)
+        (and ov (isl--goto-overlay ov)))
+      (isl-setup-mode-line))))
 
 (defun isl-goto-first ()
   "Goto first match."
@@ -425,7 +426,8 @@ It put overlay on current position, move to next overlay 
using
 (defun isl-goto-next (&optional arg)
   "Go to next ARG match."
   (interactive "p")
-  (when (eq (isl-iterator--direction isl--iterator) 'left)
+  (when (and isl--iterator
+             (eq (isl-iterator--direction isl--iterator) 'left))
     (isl-iterator-reverse isl--iterator))
   (isl-goto-next-1 arg))
 (put 'isl-goto-next 'no-helm-mx t)
@@ -433,7 +435,8 @@ It put overlay on current position, move to next overlay 
using
 (defun isl-goto-prev (&optional arg)
   "Go to previous ARG matches."
   (interactive "p")
-  (when (eq (isl-iterator--direction isl--iterator) 'right)
+  (when (and isl--iterator
+             (eq (isl-iterator--direction isl--iterator) 'right))
     (isl-iterator-reverse isl--iterator))
   (isl-goto-next-1 arg))
 (put 'isl-goto-prev 'no-helm-mx t)
@@ -442,28 +445,29 @@ It put overlay on current position, move to next overlay 
using
   "Exit minibuffer and jump at current position."
   (interactive)
   (with-selected-window (minibuffer-selected-window)
-    ;; Ensure user haven't scrolled to another place.
-    (let ((end (overlay-end isl--last-overlay))
-          (lp (overlay-get isl--last-overlay 'line-prefix)))
-      (goto-char (if (or isl-multi-search-in-line lp)
-                     (1- end) end)))
-    (when isl-multi-search-in-line
-      (let* ((ovs     (overlays-in (pos-bol) (pos-eol)))
-             (matches (cl-loop for ov in ovs
-                               when (overlay-get ov 'isl-matches)
-                               collect ov)))
-        (when matches
-          (goto-char (overlay-end (car matches))))))
-    (when isl-save-pos-to-mark-ring
-      (set-marker (mark-marker) isl--initial-pos)
-      (push-mark isl--initial-pos 'nomsg))
-    (let ((ov (make-overlay (pos-bol) (1+ (pos-eol)))))
-      (overlay-put ov 'face 'isl-line)
-      (sit-for 0.2)
-      (delete-overlay ov))
-    ;; Save `window-start' position before exiting minibuffer and
-    ;; restore it after in `isl-cleanup' to avoid a moving screen.
-    (setq isl--window-start (window-start)))
+    (when isl--last-overlay
+      ;; Ensure user haven't scrolled to another place.
+      (let ((end (overlay-end isl--last-overlay))
+            (lp (overlay-get isl--last-overlay 'line-prefix)))
+        (goto-char (if (or isl-multi-search-in-line lp)
+                       (1- end) end)))
+      (when isl-multi-search-in-line
+        (let* ((ovs     (overlays-in (pos-bol) (pos-eol)))
+               (matches (cl-loop for ov in ovs
+                                 when (overlay-get ov 'isl-matches)
+                                 collect ov)))
+          (when matches
+            (goto-char (overlay-end (car matches))))))
+      (when isl-save-pos-to-mark-ring
+        (set-marker (mark-marker) isl--initial-pos)
+        (push-mark isl--initial-pos 'nomsg))
+      (let ((ov (make-overlay (pos-bol) (1+ (pos-eol)))))
+        (overlay-put ov 'face 'isl-line)
+        (sit-for 0.2)
+        (delete-overlay ov))
+      ;; Save `window-start' position before exiting minibuffer and
+      ;; restore it after in `isl-cleanup' to avoid a moving screen.
+      (setq isl--window-start (window-start))))
   ;; Call `exit-minibuffer' out of the `with-selected-window' block to
   ;; avoid error with the emacs-28 version.
   (exit-minibuffer))
@@ -768,6 +772,7 @@ Numeric prefix ARG is applied to the SPACING arg of 
`align-regexp'.
 Quitting undo all the align actions done in current session, to valid
 all align operations you have to exit with RET."
   (interactive "p")
+  (cl-assert isl--item-overlays nil "Nothing yet to align")
   (cl-assert isl--narrow-to-region nil "No region found")
   (cl-assert (not (cdr (isl-split-string isl-pattern))) nil
              "Can't align with a multi match expression")

Reply via email to