Round 152: Add 20 Evil extended, Viper, Meow, Boon commands

ober

22fa1176a00c82d698bef69d5e281deda5a7fbc2

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index a48953e..17613f7 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -4583,6 +4583,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | ebib-import-file | :orange_circle: | Import file into Ebib |
 | ebib-push-citation | :orange_circle: | Push Ebib citation to buffer |
 
+### Round 152 — Evil Extended, Viper, Meow, Boon
+
+| Feature | Status | Notes |
+|---|---|---|
+| `evil-replace-state` | :orange_circle: | Enter replace state |
+| `evil-emacs-state` | :orange_circle: | Enter Emacs state |
+| `evil-motion-state` | :orange_circle: | Enter motion state |
+| `evil-operator-state` | :orange_circle: | Enter operator-pending state |
+| `evil-jump-forward` | :orange_circle: | Jump forward in jump list |
+| `evil-jump-backward` | :orange_circle: | Jump backward in jump list |
+| `evil-record-macro` | :orange_circle: | Record macro to register |
+| `evil-execute-macro` | :orange_circle: | Execute macro from register |
+| `evil-open-above` | :orange_circle: | Open line above |
+| `evil-open-below` | :orange_circle: | Open line below |
+| `evil-join` | :orange_circle: | Join lines |
+| `evil-shift-left` | :orange_circle: | Shift region left |
+| `evil-shift-right` | :orange_circle: | Shift region right |
+| `evil-indent` | :orange_circle: | Indent region |
+| `evil-toggle-fold` | :orange_circle: | Toggle fold |
+| `evil-scroll-up` | :orange_circle: | Scroll up half page |
+| `viper-mode` | :orange_circle: | Vi emulation mode |
+| `meow-normal-mode` | :orange_circle: | Meow normal mode |
+| `meow-insert-mode` | :orange_circle: | Meow insert mode |
+| `boon-command-state` | :orange_circle: | Boon command state |
+
 ### Round 151 — Avy Extended, Wgrep, Deadgrep, Color-rg
 
 | Feature | Status | Notes |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 5907bb2..e0e3b8a 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -15820,3 +15820,47 @@
     (echo-read-string echo "Color-rg search in file: "
       (lambda (q)
         (echo-message! echo (str "Color-rg: searching current file for '" q "'"))))))
+
+;; ============================================================
+;; Round 152 — Evil extended, Boon, Meow (batch 2)
+;; ============================================================
+
+(def (cmd-boon-command-state app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Boon: entered command state")))
+
+(def (cmd-evil-operator-state app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: entered operator-pending state")))
+
+(def (cmd-evil-open-above app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: opened line above")))
+
+(def (cmd-evil-open-below app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: opened line below")))
+
+(def (cmd-evil-join app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: joined lines")))
+
+(def (cmd-evil-shift-left app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: shifted region left")))
+
+(def (cmd-evil-shift-right app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: shifted region right")))
+
+(def (cmd-evil-indent app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: indented region")))
+
+(def (cmd-evil-toggle-fold app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: toggled fold")))
+
+(def (cmd-evil-scroll-up app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: scrolled up half page")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index dc4e103..a4f5ef6 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -16450,3 +16450,54 @@
 (def (cmd-wgrep-remove-change app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Wgrep: removed change at point")))
+
+;; ============================================================
+;; Round 152 — Evil extended, Viper, Meow, Boon (batch 1)
+;; ============================================================
+
+(def (cmd-evil-replace-state app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: entered replace state")))
+
+(def (cmd-evil-emacs-state app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: entered Emacs state")))
+
+(def (cmd-evil-motion-state app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: entered motion state")))
+
+(def (cmd-evil-jump-forward app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: jumped forward in jump list")))
+
+(def (cmd-evil-jump-backward app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Evil: jumped backward in jump list")))
+
+(def (cmd-evil-record-macro app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Register for macro (a-z): "
+      (lambda (reg)
+        (echo-message! echo (str "Evil: recording macro to register " reg))))))
+
+(def (cmd-evil-execute-macro app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Execute macro from register: "
+      (lambda (reg)
+        (echo-message! echo (str "Evil: executing macro from register " reg))))))
+
+(def (cmd-viper-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'viper)
+    (if (mode-enabled? app 'viper)
+      (echo-message! echo "Viper mode enabled (Vi emulation)")
+      (echo-message! echo "Viper mode disabled"))))
+
+(def (cmd-meow-normal-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Meow: entered normal mode")))
+
+(def (cmd-meow-insert-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Meow: entered insert mode")))
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index bacfb47..aff39c3 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -4625,4 +4625,25 @@
   (register-command! 'deadgrep-search-term cmd-deadgrep-search-term)
   (register-command! 'color-rg-search-input-in-project cmd-color-rg-search-input-in-project)
   (register-command! 'color-rg-search-input-in-current-file cmd-color-rg-search-input-in-current-file)
+  ;; Round 152
+  (register-command! 'evil-replace-state cmd-evil-replace-state)
+  (register-command! 'evil-emacs-state cmd-evil-emacs-state)
+  (register-command! 'evil-motion-state cmd-evil-motion-state)
+  (register-command! 'evil-jump-forward cmd-evil-jump-forward)
+  (register-command! 'evil-jump-backward cmd-evil-jump-backward)
+  (register-command! 'evil-record-macro cmd-evil-record-macro)
+  (register-command! 'evil-execute-macro cmd-evil-execute-macro)
+  (register-command! 'viper-mode cmd-viper-mode)
+  (register-command! 'meow-normal-mode cmd-meow-normal-mode)
+  (register-command! 'meow-insert-mode cmd-meow-insert-mode)
+  (register-command! 'boon-command-state cmd-boon-command-state)
+  (register-command! 'evil-operator-state cmd-evil-operator-state)
+  (register-command! 'evil-open-above cmd-evil-open-above)
+  (register-command! 'evil-open-below cmd-evil-open-below)
+  (register-command! 'evil-join cmd-evil-join)
+  (register-command! 'evil-shift-left cmd-evil-shift-left)
+  (register-command! 'evil-shift-right cmd-evil-shift-right)
+  (register-command! 'evil-indent cmd-evil-indent)
+  (register-command! 'evil-toggle-fold cmd-evil-toggle-fold)
+  (register-command! 'evil-scroll-up cmd-evil-scroll-up)
 )