Round 160: Add 20 Outline, Origami folding commands

ober

0e9e9e0c1ae44edbdf838379e36d7edf92697785

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 0acba61..27c254d 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 160 — Outline, Origami Folding
+
+| Feature | Status | Notes |
+|---|---|---|
+| `outline-minor-mode` | :orange_circle: | Outline minor mode |
+| `outline-hide-entry` | :orange_circle: | Hide entry body |
+| `outline-show-entry` | :orange_circle: | Show entry body |
+| `outline-hide-leaves` | :orange_circle: | Hide leaves |
+| `outline-show-branches` | :orange_circle: | Show branches |
+| `outline-hide-other` | :orange_circle: | Hide everything else |
+| `outline-show-children` | :orange_circle: | Show direct children |
+| `outline-mark-subtree` | :orange_circle: | Mark subtree |
+| `outline-move-subtree-up` | :orange_circle: | Move subtree up |
+| `outline-move-subtree-down` | :orange_circle: | Move subtree down |
+| `outline-promote` | :orange_circle: | Promote heading |
+| `outline-demote` | :orange_circle: | Demote heading |
+| `origami-toggle-node` | :orange_circle: | Toggle fold |
+| `origami-toggle-all-nodes` | :orange_circle: | Toggle all folds |
+| `origami-close-node` | :orange_circle: | Close fold |
+| `origami-open-node` | :orange_circle: | Open fold |
+| `origami-close-all-nodes` | :orange_circle: | Close all folds |
+| `origami-open-all-nodes` | :orange_circle: | Open all folds |
+| `origami-show-only-node` | :orange_circle: | Show only current |
+| `origami-next-fold` | :orange_circle: | Next fold |
+
 ### Round 159 — Magit, Git-link, Blamer, Smerge Extended
 
 | Feature | Status | Notes |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index a7f5ac7..f53b2d2 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -16220,3 +16220,47 @@
 (def (cmd-smerge-auto-leave app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Smerge: auto-leaving (no more conflicts)")))
+
+;; ============================================================
+;; Round 160 — Outline, Origami extended (batch 2)
+;; ============================================================
+
+(def (cmd-outline-promote app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: promoted heading")))
+
+(def (cmd-outline-demote app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: demoted heading")))
+
+(def (cmd-origami-toggle-node app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Origami: toggled fold at point")))
+
+(def (cmd-origami-toggle-all-nodes app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Origami: toggled all folds")))
+
+(def (cmd-origami-close-node app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Origami: closed fold at point")))
+
+(def (cmd-origami-open-node app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Origami: opened fold at point")))
+
+(def (cmd-origami-close-all-nodes app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Origami: closed all folds")))
+
+(def (cmd-origami-open-all-nodes app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Origami: opened all folds")))
+
+(def (cmd-origami-show-only-node app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Origami: showing only current node")))
+
+(def (cmd-origami-next-fold app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Origami: moved to next fold")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 4967357..a52afe9 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -16857,3 +16857,50 @@
 (def (cmd-blamer-show-commit-info app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Blamer: showing commit info for current line")))
+
+;; ============================================================
+;; Round 160 — Outline, Origami folding (batch 1)
+;; ============================================================
+
+(def (cmd-outline-minor-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'outline-minor)
+    (if (mode-enabled? app 'outline-minor)
+      (echo-message! echo "Outline minor mode enabled")
+      (echo-message! echo "Outline minor mode disabled"))))
+
+(def (cmd-outline-hide-entry app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: hid entry body")))
+
+(def (cmd-outline-show-entry app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: showed entry body")))
+
+(def (cmd-outline-hide-leaves app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: hid all leaves in subtree")))
+
+(def (cmd-outline-show-branches app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: showed all branches in subtree")))
+
+(def (cmd-outline-hide-other app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: hid everything except current entry")))
+
+(def (cmd-outline-show-children app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: showed direct children")))
+
+(def (cmd-outline-mark-subtree app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: marked subtree")))
+
+(def (cmd-outline-move-subtree-up app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: moved subtree up")))
+
+(def (cmd-outline-move-subtree-down app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Outline: moved subtree down")))
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index fbf654a..5a5d696 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -4793,4 +4793,25 @@
   (register-command! 'smerge-combine-with-next cmd-smerge-combine-with-next)
   (register-command! 'smerge-refine cmd-smerge-refine)
   (register-command! 'smerge-auto-leave cmd-smerge-auto-leave)
+  ;; Round 160
+  (register-command! 'outline-minor-mode cmd-outline-minor-mode)
+  (register-command! 'outline-hide-entry cmd-outline-hide-entry)
+  (register-command! 'outline-show-entry cmd-outline-show-entry)
+  (register-command! 'outline-hide-leaves cmd-outline-hide-leaves)
+  (register-command! 'outline-show-branches cmd-outline-show-branches)
+  (register-command! 'outline-hide-other cmd-outline-hide-other)
+  (register-command! 'outline-show-children cmd-outline-show-children)
+  (register-command! 'outline-mark-subtree cmd-outline-mark-subtree)
+  (register-command! 'outline-move-subtree-up cmd-outline-move-subtree-up)
+  (register-command! 'outline-move-subtree-down cmd-outline-move-subtree-down)
+  (register-command! 'outline-promote cmd-outline-promote)
+  (register-command! 'outline-demote cmd-outline-demote)
+  (register-command! 'origami-toggle-node cmd-origami-toggle-node)
+  (register-command! 'origami-toggle-all-nodes cmd-origami-toggle-all-nodes)
+  (register-command! 'origami-close-node cmd-origami-close-node)
+  (register-command! 'origami-open-node cmd-origami-open-node)
+  (register-command! 'origami-close-all-nodes cmd-origami-close-all-nodes)
+  (register-command! 'origami-open-all-nodes cmd-origami-open-all-nodes)
+  (register-command! 'origami-show-only-node cmd-origami-show-only-node)
+  (register-command! 'origami-next-fold cmd-origami-next-fold)
 )