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

    Initial commit
---
 isearch-light.el | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 127 insertions(+)

diff --git a/isearch-light.el b/isearch-light.el
new file mode 100644
index 00000000000..98b7dadeafa
--- /dev/null
+++ b/isearch-light.el
@@ -0,0 +1,127 @@
+;;; isearch-light.el --- simple incremental search in current-buffer -*- 
lexical-binding: t -*- 
+
+;      $Id: isearch-light.el,v 1.7 2021/01/06 16:05:31 thierry Exp thierry $   
+
+
+;;; Code:
+
+(require 'iterator)
+
+(defvar il-search-pattern "")
+(defvar il-search-current-buffer nil)
+(defvar il-search-item-overlays nil)
+(defvar il-search-iterator nil)
+(defvar il-search-last-overlay nil)
+(defvar il-search-direction nil)
+
+(defvar il-search-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map minibuffer-local-map)
+    (define-key map (kbd "C-z") 'il-search-goto-next)
+    (define-key map (kbd "M-z") 'il-search-goto-prev)
+    (define-key map (kbd "RET") 'il-search-exit-at-point)
+    map))
+
+
+;;; Actions
+;;
+(defun il-search-goto-next-1 ()
+  (with-selected-window (get-buffer-window il-search-current-buffer)
+    (when il-search-last-overlay
+      (overlay-put il-search-last-overlay 'face '(:background "brown")))
+    (when il-search-iterator
+      (let ((ov (iterator:next il-search-iterator)))
+        (if ov
+            (progn
+              (setq il-search-last-overlay ov)
+              (overlay-put ov 'face '(:background "green"))
+              (goto-char (overlay-start ov)))
+          (message "no more occurences of %s" il-search-pattern)
+          (sit-for 0.5)
+          (setq il-search-iterator (iterator:list (reverse 
il-search-item-overlays)))
+          )))))
+
+(defun il-search-goto-next ()
+  (interactive)
+  (when (eq il-search-direction 'backward)
+    (setq il-search-direction 'forward
+          il-search-pattern ""
+          il-search-last-overlay nil)
+    (il-search-check-input))
+  (il-search-goto-next-1))
+
+(defun il-search-goto-prev ()
+  (interactive)
+  (when (eq il-search-direction 'forward)
+    (setq il-search-direction 'backward
+          il-search-pattern ""
+          il-search-last-overlay nil)
+    (il-search-check-input))
+  (il-search-goto-next-1))
+
+(defun il-search-exit-at-point ()
+  (interactive)
+  (exit-minibuffer))
+
+(defun il-search-delete-overlays ()
+  (when il-search-item-overlays
+    (mapc 'delete-overlay il-search-item-overlays)
+    (setq il-search-item-overlays nil)))
+
+(defun il-search-update-overlays (direction)
+  (with-selected-window (get-buffer-window il-search-current-buffer)
+    (il-search-delete-overlays)
+    (let (ov
+          (fn (cl-case direction
+                (forward #'re-search-forward)
+                (backward #'re-search-backward))))
+      (with-local-quit
+        (save-excursion
+          (while (funcall fn il-search-pattern nil t)
+            (setq ov (make-overlay (match-beginning 0) (match-end 0)))
+            (push ov il-search-item-overlays)
+            (overlay-put ov 'face '(:background "brown")))
+          (setq il-search-iterator (iterator:list (reverse 
il-search-item-overlays))))))))
+
+(defun il-search-check-input ()
+  (let ((input (minibuffer-contents)))
+    (when (not (string= input il-search-pattern))
+      (setq il-search-pattern input)
+      (il-search-update-overlays il-search-direction))))
+
+(defun il-search-read-from-minibuffer (prompt)
+  (let (timer)
+    (unwind-protect
+        (minibuffer-with-setup-hook
+            (lambda ()
+              (setq timer (run-with-idle-timer
+                           0.1 'repeat #'il-search-check-input)))
+          (read-from-minibuffer prompt nil il-search-map))
+      (cancel-timer timer))))
+
+(defun il-search-1 ()
+  (setq il-search-item-overlays nil
+        il-search-pattern ""
+        il-search-current-buffer (current-buffer))
+  (condition-case-unless-debug nil
+      (unwind-protect
+          (il-search-read-from-minibuffer "test: ")
+        (il-search-delete-overlays))
+    (quit nil)))
+
+;;;###autoload
+(defun il-search-forward ()
+  (interactive)
+  (setq il-search-direction 'forward)
+  (il-search-1))
+
+;;;###autoload
+(defun il-search-backward ()
+  (interactive)
+  (setq il-search-direction 'backward)
+  (il-search-1))
+
+
+(provide 'isearch-light)
+
+;;; isearch-light.el ends here

Reply via email to