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

    handle resuming in different buffers
    
    Lets isl recreate an iterator.
---
 isearch-light.el | 119 +++++++++++++++++++++++++++++++------------------------
 1 file changed, 67 insertions(+), 52 deletions(-)

diff --git a/isearch-light.el b/isearch-light.el
index 1feeb37c598..52c7f7da4cf 100644
--- a/isearch-light.el
+++ b/isearch-light.el
@@ -54,8 +54,9 @@
 
 ;; Internals
 (defvar isl-pattern "")
-(defvar isl-last-query nil)
-(defvar isl-last-object nil)
+(defvar-local isl-last-query nil)
+(defvar-local isl-last-object nil)
+(defvar isl-visited-buffers nil)
 (defvar isl-current-buffer nil)
 (defvar isl--item-overlays nil)
 (defvar isl--iterator nil)
@@ -828,52 +829,52 @@ appended at end."
 
 (defun isl-cleanup ()
   "Cleanup various things when `isl-search' exit."
-  (let* ((pos (and isl--last-overlay ; nil when quitting with no results.
-                   (overlay-end isl--last-overlay)))
-         (hs-show-hook (list (lambda () (and pos (goto-char pos))))))
-    (when (buffer-live-p (get-buffer isl-help-buffer-name))
-      (kill-buffer isl-help-buffer-name))
-    (setq isl-last-object
-          (lambda ()
-            (setq mode-line-format mode-line-format
-                  isl-last-query isl-pattern
-                  isl-initial-pos pos
-                  isl--yank-point isl--yank-point 
-                  isl--iterator isl--iterator 
-                  isl--number-results isl--number-results
-                  isl-case-fold-search isl-case-fold-search
-                  isl-search-function isl-search-function
-                  buffer-invisibility-spec buffer-invisibility-spec
-                  isl--hidding isl--hidding
-                  cursor-in-non-selected-windows 
cursor-in-non-selected-windows)))
-    (isl-delete-overlays)
-    (setq mode-line-format (default-value 'mode-line-format)
-          isl--yank-point nil
-          isl--iterator nil
-          isl--item-overlays nil
-          isl--last-overlay nil
-          isl--number-results nil
-          isl-case-fold-search (default-value 'isl-case-fold-search)
-          isl-search-function (default-value 'isl-search-function)
-          buffer-invisibility-spec isl--buffer-invisibility-spec
-          isl--hidding nil
-          cursor-in-non-selected-windows
-          (default-value 'cursor-in-non-selected-windows))
-    (remove-overlays nil nil 'isl-invisible t)
-    (if isl--quit
-        (setq isl--quit nil)
-      (condition-case-unless-debug _err
-        (cond ((eq major-mode 'org-mode)
-               (org-reveal))
-              ((eq major-mode 'outline-mode)
-               (outline-show-entry))
-              ((and (boundp 'hs-minor-mode)
-                    hs-minor-mode)
-               (hs-show-block))
-              ((and (boundp 'markdown-mode-map)
-                    (derived-mode-p 'markdown-mode))
-               (markdown-show-entry)))
-        (error nil)))))
+  (with-current-buffer isl-current-buffer
+    (let* ((pos (and isl--last-overlay ; nil when quitting with no results.
+                     (overlay-end isl--last-overlay)))
+           (hs-show-hook (list (lambda () (and pos (goto-char pos))))))
+      (when (buffer-live-p (get-buffer isl-help-buffer-name))
+        (kill-buffer isl-help-buffer-name))
+      (setq isl-last-object
+            `(lambda ()
+               (setq-local mode-line-format ',mode-line-format
+                           isl-last-query ,isl-pattern
+                           isl-initial-pos ,pos
+                           isl--yank-point ,isl--yank-point 
+                           isl--number-results ,isl--number-results
+                           isl-case-fold-search ',isl-case-fold-search
+                           isl-search-function ',isl-search-function
+                           buffer-invisibility-spec ,buffer-invisibility-spec
+                           isl--hidding ,isl--hidding
+                           cursor-in-non-selected-windows 
,cursor-in-non-selected-windows)))
+      (isl-delete-overlays)
+      (setq mode-line-format (default-value 'mode-line-format)
+            isl--yank-point nil
+            isl--iterator nil
+            isl--item-overlays nil
+            isl--last-overlay nil
+            isl--number-results nil
+            isl-case-fold-search (default-value 'isl-case-fold-search)
+            isl-search-function (default-value 'isl-search-function)
+            buffer-invisibility-spec isl--buffer-invisibility-spec
+            isl--hidding nil
+            cursor-in-non-selected-windows
+            (default-value 'cursor-in-non-selected-windows))
+      (remove-overlays nil nil 'isl-invisible t)
+      (if isl--quit
+          (setq isl--quit nil)
+        (condition-case-unless-debug _err
+            (cond ((eq major-mode 'org-mode)
+                   (org-reveal))
+                  ((eq major-mode 'outline-mode)
+                   (outline-show-entry))
+                  ((and (boundp 'hs-minor-mode)
+                        hs-minor-mode)
+                   (hs-show-block))
+                  ((and (boundp 'markdown-mode-map)
+                        (derived-mode-p 'markdown-mode))
+                   (markdown-show-entry)))
+          (error nil))))))
 
 
 (defun isl-search-1 (&optional resume)
@@ -884,11 +885,16 @@ appended at end."
           isl--direction 'forward
           isl-current-buffer (current-buffer)
           isl--buffer-invisibility-spec buffer-invisibility-spec
-          cursor-in-non-selected-windows nil))
+          cursor-in-non-selected-windows nil)
+    (setq isl-visited-buffers
+          (cons isl-current-buffer
+                (delete isl-current-buffer isl-visited-buffers))))
   (unwind-protect
       (condition-case-unless-debug nil
           (isl-read-from-minibuffer
-           "Search: " (when resume isl-last-query))
+           "Search: " (when resume
+                        (buffer-local-value
+                         'isl-last-query isl-current-buffer)))
         (quit
          (setq isl--quit t)
          (goto-char isl-initial-pos)))
@@ -906,9 +912,18 @@ appended at end."
         isl--point-max nil)
   (isl-search-1))
 
-(defun isl-resume ()
+(defun isl-resume (arg)
   "Resume previous isl session."
-  (interactive)
+  (interactive "P")
+  (when (and arg isl-current-buffer)
+    (setq isl-current-buffer
+          (get-buffer
+           (completing-read
+            "Resume from buffer: "
+            (mapcar 'buffer-name isl-visited-buffers)
+            nil t))))
+  (cl-assert isl-current-buffer
+             nil "No buffer handling an isl session found")
   (switch-to-buffer isl-current-buffer)
   (with-current-buffer isl-current-buffer
     (funcall isl-last-object)

Reply via email to