Round 156: Add 20 Popper, Shackle, Hydra, Transient extended commands

ober

f19d681afc55f7a2a26d97783704592968730aa5

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 7b6da67..64c8b1b 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 156 — Popper, Shackle, Hydra, Transient Extended
+
+| Feature | Status | Notes |
+|---|---|---|
+| `popper-toggle-latest` | :orange_circle: | Toggle latest popup |
+| `popper-cycle` | :orange_circle: | Cycle popups |
+| `popper-toggle-type` | :orange_circle: | Toggle popup type |
+| `popper-kill-latest-popup` | :orange_circle: | Kill latest popup |
+| `popper-raise-popup` | :orange_circle: | Raise popup to window |
+| `popper-lower-popup` | :orange_circle: | Lower window to popup |
+| `shackle-mode` | :orange_circle: | Window rule enforcement |
+| `shackle-last-popup-buffer` | :orange_circle: | Show last popup buffer |
+| `ace-popup-menu-mode` | :orange_circle: | Ace popup menu mode |
+| `hydra-zoom/body` | :orange_circle: | Zoom hydra menu |
+| `hydra-window/body` | :orange_circle: | Window hydra menu |
+| `hydra-navigate/body` | :orange_circle: | Navigation hydra menu |
+| `hydra-toggle/body` | :orange_circle: | Toggle hydra menu |
+| `hydra-apropos/body` | :orange_circle: | Apropos hydra menu |
+| `hydra-buffer-menu/body` | :orange_circle: | Buffer hydra menu |
+| `transient-history-prev` | :orange_circle: | Previous transient history |
+| `transient-history-next` | :orange_circle: | Next transient history |
+| `transient-suffix-put` | :orange_circle: | Modify suffix property |
+| `transient-toggle-level-limit` | :orange_circle: | Toggle level limit |
+| `transient-set-level` | :orange_circle: | Set transient level |
+
 ### Round 155 — Embark, Consult, Vertico, Corfu, Cape Extended
 
 | Feature | Status | Notes |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 398690a..173378a 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -16027,3 +16027,49 @@
 (def (cmd-vertico-quick-insert app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Vertico: quick insert candidate")))
+
+;; ============================================================
+;; Round 156 — Hydra, Transient extended (batch 2)
+;; ============================================================
+
+(def (cmd-hydra-window/body app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hydra: window management menu")))
+
+(def (cmd-hydra-navigate/body app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hydra: navigation menu")))
+
+(def (cmd-hydra-toggle/body app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hydra: toggle features menu")))
+
+(def (cmd-hydra-apropos/body app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hydra: apropos menu")))
+
+(def (cmd-hydra-buffer-menu/body app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hydra: buffer menu")))
+
+(def (cmd-transient-history-prev app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Transient: previous history entry")))
+
+(def (cmd-transient-history-next app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Transient: next history entry")))
+
+(def (cmd-transient-suffix-put app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Transient: modified suffix property")))
+
+(def (cmd-transient-toggle-level-limit app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Transient: toggled level limit")))
+
+(def (cmd-transient-set-level app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Set transient level: "
+      (lambda (lvl)
+        (echo-message! echo (str "Transient: set level to " lvl))))))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 533a9f3..ee92328 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -16654,3 +16654,53 @@
     (echo-read-string echo "Load from register: "
       (lambda (reg)
         (echo-message! echo (str "Consult: loaded register " reg))))))
+
+;; ============================================================
+;; Round 156 — Popper, Shackle, Hydra, Transient extended (batch 1)
+;; ============================================================
+
+(def (cmd-popper-toggle-latest app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Popper: toggled latest popup")))
+
+(def (cmd-popper-cycle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Popper: cycled to next popup")))
+
+(def (cmd-popper-toggle-type app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Popper: toggled popup type")))
+
+(def (cmd-popper-kill-latest-popup app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Popper: killed latest popup")))
+
+(def (cmd-popper-raise-popup app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Popper: raised popup to regular window")))
+
+(def (cmd-popper-lower-popup app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Popper: lowered window to popup")))
+
+(def (cmd-shackle-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'shackle)
+    (if (mode-enabled? app 'shackle)
+      (echo-message! echo "Shackle mode enabled (window rule enforcement)")
+      (echo-message! echo "Shackle mode disabled"))))
+
+(def (cmd-shackle-last-popup-buffer app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Shackle: showing last popup buffer")))
+
+(def (cmd-ace-popup-menu-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'ace-popup-menu)
+    (if (mode-enabled? app 'ace-popup-menu)
+      (echo-message! echo "Ace-popup-menu mode enabled")
+      (echo-message! echo "Ace-popup-menu mode disabled"))))
+
+(def (cmd-hydra-zoom/body app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hydra: zoom menu (+/-/0)")))
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 03a21ae..0ae5b6f 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -4709,4 +4709,25 @@
   (register-command! 'cape-ispell cmd-cape-ispell)
   (register-command! 'vertico-quick-jump cmd-vertico-quick-jump)
   (register-command! 'vertico-quick-insert cmd-vertico-quick-insert)
+  ;; Round 156
+  (register-command! 'popper-toggle-latest cmd-popper-toggle-latest)
+  (register-command! 'popper-cycle cmd-popper-cycle)
+  (register-command! 'popper-toggle-type cmd-popper-toggle-type)
+  (register-command! 'popper-kill-latest-popup cmd-popper-kill-latest-popup)
+  (register-command! 'popper-raise-popup cmd-popper-raise-popup)
+  (register-command! 'popper-lower-popup cmd-popper-lower-popup)
+  (register-command! 'shackle-mode cmd-shackle-mode)
+  (register-command! 'shackle-last-popup-buffer cmd-shackle-last-popup-buffer)
+  (register-command! 'ace-popup-menu-mode cmd-ace-popup-menu-mode)
+  (register-command! 'hydra-zoom/body cmd-hydra-zoom/body)
+  (register-command! 'hydra-window/body cmd-hydra-window/body)
+  (register-command! 'hydra-navigate/body cmd-hydra-navigate/body)
+  (register-command! 'hydra-toggle/body cmd-hydra-toggle/body)
+  (register-command! 'hydra-apropos/body cmd-hydra-apropos/body)
+  (register-command! 'hydra-buffer-menu/body cmd-hydra-buffer-menu/body)
+  (register-command! 'transient-history-prev cmd-transient-history-prev)
+  (register-command! 'transient-history-next cmd-transient-history-next)
+  (register-command! 'transient-suffix-put cmd-transient-suffix-put)
+  (register-command! 'transient-toggle-level-limit cmd-transient-toggle-level-limit)
+  (register-command! 'transient-set-level cmd-transient-set-level)
 )