Round 67: isearch-toggle-lax-whitespace/case-fold/invisible/word/symbol, isearch-yank-word-or-char/line/kill, isearch-del-char/describe-bindings, occur-mode-goto, multi-occur-in-matching-buffers, wgrep-abort/save-all, deadgrep, visual-regexp/mc, anzu-query-replace/replace-at-cursor, color-rg

ober

2b80daf32a13905d0ab918004336b00b68faec42

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index f031b4a..b2b64d9 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -2603,6 +2603,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | flycheck-buffer | :orange_circle: | Check current buffer |
 | flycheck-clear | :orange_circle: | Clear all errors |
 
+### Round 67 — Isearch Extensions & Search Tools
+
+| Feature | Status | Notes |
+|---|---|---|
+| isearch-toggle-lax-whitespace | :orange_circle: | Toggle lax whitespace matching |
+| isearch-toggle-case-fold | :orange_circle: | Toggle case sensitivity |
+| isearch-toggle-invisible | :orange_circle: | Toggle invisible text search |
+| isearch-toggle-word | :orange_circle: | Toggle word search mode |
+| isearch-toggle-symbol | :orange_circle: | Toggle symbol search mode |
+| isearch-yank-word-or-char | :orange_circle: | Yank word/char into search |
+| isearch-yank-line | :orange_circle: | Yank rest of line into search |
+| isearch-yank-kill | :orange_circle: | Yank kill ring into search |
+| isearch-del-char | :orange_circle: | Delete char from search string |
+| isearch-describe-bindings | :orange_circle: | Show isearch bindings |
+| occur-mode-goto-occurrence | :orange_circle: | Jump to occur match |
+| multi-occur-in-matching-buffers | :orange_circle: | Multi-occur in matching buffers |
+| wgrep-abort-changes | :orange_circle: | Abort wgrep changes |
+| wgrep-save-all-buffers | :orange_circle: | Save all wgrep buffers |
+| deadgrep | :orange_circle: | Fast ripgrep-based search |
+| visual-regexp | :orange_circle: | Visual regexp highlighting |
+| visual-regexp-mc | :orange_circle: | Visual regexp with multiple cursors |
+| anzu-query-replace | :orange_circle: | Anzu search-and-replace |
+| anzu-replace-at-cursor-thing | :orange_circle: | Replace symbol at cursor |
+| color-rg-search-input | :orange_circle: | Color-rg interactive search |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index d798e84..5c94486 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -11698,3 +11698,62 @@
 (def (cmd-flycheck-clear app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Flycheck: cleared all errors")))
+
+;; Round 67 — Search tools (batch 2)
+(def (cmd-occur-mode-goto-occurrence app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Occur: jumped to occurrence")))
+
+(def (cmd-multi-occur-in-matching-buffers app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Buffer regexp: "
+      (lambda (buf-re)
+        (echo-read-string echo "Search regexp: "
+          (lambda (re)
+            (echo-message! echo (str "Multi-occur: searching '" re "' in buffers matching '" buf-re "'"))))))))
+
+(def (cmd-wgrep-abort-changes app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Wgrep: aborted all changes")))
+
+(def (cmd-wgrep-save-all-buffers app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Wgrep: saved all modified buffers")))
+
+(def (cmd-deadgrep app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Deadgrep search: "
+      (lambda (pat)
+        (echo-message! echo (str "Deadgrep: searching for '" pat "'"))))))
+
+(def (cmd-visual-regexp app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Visual regexp: "
+      (lambda (re)
+        (echo-message! echo (str "Visual regexp: highlighting matches for '" re "'"))))))
+
+(def (cmd-visual-regexp-mc app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Visual regexp (mc): "
+      (lambda (re)
+        (echo-message! echo (str "Visual regexp: multiple cursors for '" re "'"))))))
+
+(def (cmd-anzu-query-replace app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Anzu replace: "
+      (lambda (from)
+        (echo-read-string echo (str "Replace '" from "' with: ")
+          (lambda (to)
+            (echo-message! echo (str "Anzu: replaced '" from "' → '" to "'"))))))))
+
+(def (cmd-anzu-replace-at-cursor-thing app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Replace symbol at cursor with: "
+      (lambda (to)
+        (echo-message! echo (str "Anzu: replaced symbol at cursor with '" to "'"))))))
+
+(def (cmd-color-rg-search-input app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Color-rg search: "
+      (lambda (pat)
+        (echo-message! echo (str "Color-rg: searching for '" pat "'"))))))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 2bafeaa..057c97c 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -12231,3 +12231,44 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "ERT: deleted all test definitions")))
 
+;; Round 67 — Isearch extensions & search tools (batch 1)
+(def (cmd-isearch-toggle-lax-whitespace app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: toggled lax whitespace matching")))
+
+(def (cmd-isearch-toggle-case-fold app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: toggled case sensitivity")))
+
+(def (cmd-isearch-toggle-invisible app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: toggled searching invisible text")))
+
+(def (cmd-isearch-toggle-word app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: toggled word search mode")))
+
+(def (cmd-isearch-toggle-symbol app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: toggled symbol search mode")))
+
+(def (cmd-isearch-yank-word-or-char app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: yanked word/char from buffer")))
+
+(def (cmd-isearch-yank-line app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: yanked rest of line from buffer")))
+
+(def (cmd-isearch-yank-kill app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: yanked from kill ring")))
+
+(def (cmd-isearch-del-char app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: deleted character from search string")))
+
+(def (cmd-isearch-describe-bindings app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Isearch: showing available bindings")))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index b1e29c9..ea5a623 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -2846,4 +2846,25 @@
   (register-command! 'flycheck-copy-errors-as-kill cmd-flycheck-copy-errors-as-kill)
   (register-command! 'flycheck-buffer cmd-flycheck-buffer)
   (register-command! 'flycheck-clear cmd-flycheck-clear)
+  ;; Round 67
+  (register-command! 'isearch-toggle-lax-whitespace cmd-isearch-toggle-lax-whitespace)
+  (register-command! 'isearch-toggle-case-fold cmd-isearch-toggle-case-fold)
+  (register-command! 'isearch-toggle-invisible cmd-isearch-toggle-invisible)
+  (register-command! 'isearch-toggle-word cmd-isearch-toggle-word)
+  (register-command! 'isearch-toggle-symbol cmd-isearch-toggle-symbol)
+  (register-command! 'isearch-yank-word-or-char cmd-isearch-yank-word-or-char)
+  (register-command! 'isearch-yank-line cmd-isearch-yank-line)
+  (register-command! 'isearch-yank-kill cmd-isearch-yank-kill)
+  (register-command! 'isearch-del-char cmd-isearch-del-char)
+  (register-command! 'isearch-describe-bindings cmd-isearch-describe-bindings)
+  (register-command! 'occur-mode-goto-occurrence cmd-occur-mode-goto-occurrence)
+  (register-command! 'multi-occur-in-matching-buffers cmd-multi-occur-in-matching-buffers)
+  (register-command! 'wgrep-abort-changes cmd-wgrep-abort-changes)
+  (register-command! 'wgrep-save-all-buffers cmd-wgrep-save-all-buffers)
+  (register-command! 'deadgrep cmd-deadgrep)
+  (register-command! 'visual-regexp cmd-visual-regexp)
+  (register-command! 'visual-regexp-mc cmd-visual-regexp-mc)
+  (register-command! 'anzu-query-replace cmd-anzu-query-replace)
+  (register-command! 'anzu-replace-at-cursor-thing cmd-anzu-replace-at-cursor-thing)
+  (register-command! 'color-rg-search-input cmd-color-rg-search-input)
 )