Round 165: Add 20 CUA rectangles, Picture mode, Artist mode commands

ober

db54b945d9f04cbcc510eb48e1ca5808f57045a7

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index d65fd2c..6b95cb7 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 165 — CUA Rectangles, Picture Mode, Artist Mode
+
+| Feature | Status | Notes |
+|---|---|---|
+| `cua-sequence-rectangle` | :orange_circle: | Sequence rectangle |
+| `cua-fill-char-rectangle` | :orange_circle: | Fill rectangle with char |
+| `cua-incr-rectangle` | :orange_circle: | Increment rectangle values |
+| `cua-replace-in-rectangle` | :orange_circle: | Replace in rectangle |
+| `cua-rotate-rectangle` | :orange_circle: | Rotate rectangle |
+| `cua-open-rectangle` | :orange_circle: | Open rectangle |
+| `cua-close-rectangle` | :orange_circle: | Close rectangle |
+| `cua-copy-rectangle` | :orange_circle: | Copy rectangle |
+| `cua-cut-rectangle` | :orange_circle: | Cut rectangle |
+| `cua-paste-rectangle` | :orange_circle: | Paste rectangle |
+| `picture-forward-column` | :orange_circle: | Forward column |
+| `picture-backward-column` | :orange_circle: | Backward column |
+| `picture-open-line` | :orange_circle: | Open line |
+| `artist-mode` | :orange_circle: | ASCII drawing mode |
+| `artist-select-op-line` | :orange_circle: | Draw line |
+| `artist-select-op-rectangle` | :orange_circle: | Draw rectangle |
+| `artist-select-op-ellipse` | :orange_circle: | Draw ellipse |
+| `artist-select-op-circle` | :orange_circle: | Draw circle |
+| `artist-select-op-text` | :orange_circle: | Insert text |
+| `artist-select-op-spray-can` | :orange_circle: | Spray can |
+
 ### Round 164 — Abbrev, Skeleton, Tempo, Auto-insert, BS
 
 | Feature | Status | Notes |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index df0acc9..4012afb 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -16457,3 +16457,50 @@
 (def (cmd-electric-buffer-list app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Electric buffer list opened")))
+
+;; ============================================================
+;; Round 165 — Picture mode, Artist mode extended (batch 2)
+;; ============================================================
+
+(def (cmd-picture-forward-column app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Picture: moved forward one column")))
+
+(def (cmd-picture-backward-column app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Picture: moved backward one column")))
+
+(def (cmd-picture-open-line app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Picture: opened line")))
+
+(def (cmd-artist-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'artist)
+    (if (mode-enabled? app 'artist)
+      (echo-message! echo "Artist mode enabled (ASCII drawing)")
+      (echo-message! echo "Artist mode disabled"))))
+
+(def (cmd-artist-select-op-line app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Artist: selected line drawing operation")))
+
+(def (cmd-artist-select-op-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Artist: selected rectangle drawing operation")))
+
+(def (cmd-artist-select-op-ellipse app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Artist: selected ellipse drawing operation")))
+
+(def (cmd-artist-select-op-circle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Artist: selected circle drawing operation")))
+
+(def (cmd-artist-select-op-text app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Artist: selected text insertion operation")))
+
+(def (cmd-artist-select-op-spray-can app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Artist: selected spray can operation")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 6b5d789..b407352 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -17098,3 +17098,55 @@
     (echo-read-string echo "Insert template: "
       (lambda (name)
         (echo-message! echo (str "Tempo: inserted template " name))))))
+
+;; ============================================================
+;; Round 165 — CUA rectangles, Picture mode, Artist mode (batch 1)
+;; ============================================================
+
+(def (cmd-cua-sequence-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Sequence format: "
+      (lambda (fmt)
+        (echo-message! echo (str "CUA: sequenced rectangle with format " fmt))))))
+
+(def (cmd-cua-fill-char-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Fill character: "
+      (lambda (ch)
+        (echo-message! echo (str "CUA: filled rectangle with '" ch "'"))))))
+
+(def (cmd-cua-incr-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUA: incremented rectangle values")))
+
+(def (cmd-cua-replace-in-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Replace in rectangle: "
+      (lambda (from)
+        (echo-read-string echo "Replace with: "
+          (lambda (to)
+            (echo-message! echo (str "CUA: replaced '" from "' with '" to "' in rectangle"))))))))
+
+(def (cmd-cua-rotate-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUA: rotated rectangle")))
+
+(def (cmd-cua-open-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUA: opened rectangle (shifted text right)")))
+
+(def (cmd-cua-close-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUA: closed rectangle")))
+
+(def (cmd-cua-copy-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUA: copied rectangle to kill ring")))
+
+(def (cmd-cua-cut-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUA: cut rectangle to kill ring")))
+
+(def (cmd-cua-paste-rectangle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUA: pasted rectangle from kill ring")))
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 49aad1a..4ec0dec 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -4898,4 +4898,25 @@
   (register-command! 'bs-cycle-previous cmd-bs-cycle-previous)
   (register-command! 'buffer-menu-other-window cmd-buffer-menu-other-window)
   (register-command! 'electric-buffer-list cmd-electric-buffer-list)
+  ;; Round 165
+  (register-command! 'cua-sequence-rectangle cmd-cua-sequence-rectangle)
+  (register-command! 'cua-fill-char-rectangle cmd-cua-fill-char-rectangle)
+  (register-command! 'cua-incr-rectangle cmd-cua-incr-rectangle)
+  (register-command! 'cua-replace-in-rectangle cmd-cua-replace-in-rectangle)
+  (register-command! 'cua-rotate-rectangle cmd-cua-rotate-rectangle)
+  (register-command! 'cua-open-rectangle cmd-cua-open-rectangle)
+  (register-command! 'cua-close-rectangle cmd-cua-close-rectangle)
+  (register-command! 'cua-copy-rectangle cmd-cua-copy-rectangle)
+  (register-command! 'cua-cut-rectangle cmd-cua-cut-rectangle)
+  (register-command! 'cua-paste-rectangle cmd-cua-paste-rectangle)
+  (register-command! 'picture-forward-column cmd-picture-forward-column)
+  (register-command! 'picture-backward-column cmd-picture-backward-column)
+  (register-command! 'picture-open-line cmd-picture-open-line)
+  (register-command! 'artist-mode cmd-artist-mode)
+  (register-command! 'artist-select-op-line cmd-artist-select-op-line)
+  (register-command! 'artist-select-op-rectangle cmd-artist-select-op-rectangle)
+  (register-command! 'artist-select-op-ellipse cmd-artist-select-op-ellipse)
+  (register-command! 'artist-select-op-circle cmd-artist-select-op-circle)
+  (register-command! 'artist-select-op-text cmd-artist-select-op-text)
+  (register-command! 'artist-select-op-spray-can cmd-artist-select-op-spray-can)
 )