Round 249: CUA ext, Password-store, EPA (20 commands)

ober

940b70035836f21ac4704a7f61c168461e3b2280

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 6d4a04a..b826836 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 249 — CUA ext, Password-store, EPA
+
+| Command | Status | Description |
+|---------|--------|-------------|
+| cua-rectangle-mark-mode | :orange_circle: | Toggle CUA rectangle mark mode |
+| cua-paste-pop | :orange_circle: | Cycle through kill ring (CUA) |
+| thing-at-point-url-at-point | :orange_circle: | Extract URL at point |
+| browse-url-of-region | :orange_circle: | Browse region as URL |
+| url-retrieve-synchronously | :orange_circle: | Retrieve URL synchronously |
+| url-copy-file | :orange_circle: | Download URL to file |
+| shr-toggle-images | :orange_circle: | Toggle SHR image display |
+| password-store-copy | :orange_circle: | Copy password from store |
+| password-store-generate | :orange_circle: | Generate new password |
+| password-store-insert | :orange_circle: | Insert password entry |
+| password-store-remove | :orange_circle: | Remove password entry |
+| password-store-edit | :orange_circle: | Edit password entry |
+| password-store-rename | :orange_circle: | Rename password entry |
+| password-store-url | :orange_circle: | Open URL for password entry |
+| epa-sign-file | :orange_circle: | Sign file with GPG |
+| epa-verify-file | :orange_circle: | Verify GPG signature |
+| epa-encrypt-region | :orange_circle: | Encrypt region with GPG |
+| epa-decrypt-region | :orange_circle: | Decrypt region with GPG |
+| epa-import-keys | :orange_circle: | Import GPG keys |
+| epa-export-keys | :orange_circle: | Export GPG keys |
+
 ### Round 248 — Xref ext, Project.el ext, Flymake ext, Eldoc ext
 
 | Command | Status | Description |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index d1dffbb..d135ae6 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -20464,3 +20464,58 @@
     (echo-read-string echo "Tag: "
       (lambda (tag)
         (echo-message! echo (str "Image-dired: tagged files with '" tag "'"))))))
+
+;; Round 249 — Password-store ext, EPA ext (10 in final)
+(def (cmd-password-store-remove app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Remove entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Password-store: removed " entry))))))
+
+(def (cmd-password-store-edit app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Edit entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Password-store: editing " entry))))))
+
+(def (cmd-password-store-rename app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Rename entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Password-store: renamed " entry))))))
+
+(def (cmd-password-store-url app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "URL for entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Password-store: opening URL for " entry))))))
+
+(def (cmd-epa-sign-file app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Sign file: "
+      (lambda (file)
+        (echo-message! echo (str "EPA: signing " file))))))
+
+(def (cmd-epa-verify-file app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Verify file: "
+      (lambda (file)
+        (echo-message! echo (str "EPA: verifying " file))))))
+
+(def (cmd-epa-encrypt-region app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EPA: encrypting region")))
+
+(def (cmd-epa-decrypt-region app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EPA: decrypting region")))
+
+(def (cmd-epa-import-keys app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Import keys from: "
+      (lambda (file)
+        (echo-message! echo (str "EPA: importing keys from " file))))))
+
+(def (cmd-epa-export-keys app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EPA: exporting keys")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 5630213..95b7f68 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -21101,3 +21101,60 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Tab bar: moved tab backward")))
 
+;; Round 249 — CUA ext, Password-store, EPA (10 in modes)
+(def (cmd-cua-rectangle-mark-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'cua-rectangle-mark)
+    (if (mode-enabled? app 'cua-rectangle-mark)
+      (echo-message! echo "CUA rectangle mark mode enabled")
+      (echo-message! echo "CUA rectangle mark mode disabled"))))
+
+(def (cmd-cua-paste-pop app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUA: paste pop (cycle kill ring)")))
+
+(def (cmd-thing-at-point-url-at-point app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Thing at point: extracted URL")))
+
+(def (cmd-browse-url-of-region app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Browse URL: opening region as URL")))
+
+(def (cmd-url-retrieve-synchronously app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "URL: "
+      (lambda (url)
+        (echo-message! echo (str "URL: retrieving " url " synchronously"))))))
+
+(def (cmd-url-copy-file app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "URL to download: "
+      (lambda (url)
+        (echo-message! echo (str "URL: copying " url " to file"))))))
+
+(def (cmd-shr-toggle-images app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'shr-images)
+    (if (mode-enabled? app 'shr-images)
+      (echo-message! echo "SHR: images enabled")
+      (echo-message! echo "SHR: images disabled"))))
+
+(def (cmd-password-store-copy app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Copy password for: "
+      (lambda (entry)
+        (echo-message! echo (str "Password-store: copied " entry))))))
+
+(def (cmd-password-store-generate app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Generate password for: "
+      (lambda (entry)
+        (echo-message! echo (str "Password-store: generated for " entry))))))
+
+(def (cmd-password-store-insert app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Insert password entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Password-store: inserted " entry))))))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 856ca4a..15b483f 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -6645,4 +6645,25 @@
   (register-command! 'use-package-autoload-keymap cmd-use-package-autoload-keymap)
   (register-command! 'sqlite-mode-open-file cmd-sqlite-mode-open-file)
   (register-command! 'image-dired-tag-files cmd-image-dired-tag-files)
+  ;; Round 249 — CUA ext, Password-store, EPA
+  (register-command! 'cua-rectangle-mark-mode cmd-cua-rectangle-mark-mode)
+  (register-command! 'cua-paste-pop cmd-cua-paste-pop)
+  (register-command! 'thing-at-point-url-at-point cmd-thing-at-point-url-at-point)
+  (register-command! 'browse-url-of-region cmd-browse-url-of-region)
+  (register-command! 'url-retrieve-synchronously cmd-url-retrieve-synchronously)
+  (register-command! 'url-copy-file cmd-url-copy-file)
+  (register-command! 'shr-toggle-images cmd-shr-toggle-images)
+  (register-command! 'password-store-copy cmd-password-store-copy)
+  (register-command! 'password-store-generate cmd-password-store-generate)
+  (register-command! 'password-store-insert cmd-password-store-insert)
+  (register-command! 'password-store-remove cmd-password-store-remove)
+  (register-command! 'password-store-edit cmd-password-store-edit)
+  (register-command! 'password-store-rename cmd-password-store-rename)
+  (register-command! 'password-store-url cmd-password-store-url)
+  (register-command! 'epa-sign-file cmd-epa-sign-file)
+  (register-command! 'epa-verify-file cmd-epa-verify-file)
+  (register-command! 'epa-encrypt-region cmd-epa-encrypt-region)
+  (register-command! 'epa-decrypt-region cmd-epa-decrypt-region)
+  (register-command! 'epa-import-keys cmd-epa-import-keys)
+  (register-command! 'epa-export-keys cmd-epa-export-keys)
 )