Round 145: Add 20 BBDB, Message mode, Newsticker, SMTP commands

ober

10fa7c89e7e5c11ea5c42de289e83801fdd40382

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 69687ea..2db5476 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 145 — BBDB, Message Mode, Newsticker, SMTP
+
+| Feature | Status | Notes |
+|---|---|---|
+| `bbdb-search-name` | :orange_circle: | Search BBDB by name |
+| `bbdb-search-organization` | :orange_circle: | Search BBDB by organization |
+| `bbdb-search-mail` | :orange_circle: | Search BBDB by email |
+| `bbdb-search-phone` | :orange_circle: | Search BBDB by phone |
+| `bbdb-search-notes` | :orange_circle: | Search BBDB by notes |
+| `bbdb-display-all-records` | :orange_circle: | Display all BBDB records |
+| `bbdb-mail` | :orange_circle: | Compose mail to BBDB record |
+| `bbdb-merge-records` | :orange_circle: | Merge duplicate records |
+| `bbdb-delete-field-or-record` | :orange_circle: | Delete field or record |
+| `message-send` | :orange_circle: | Send message |
+| `message-send-and-exit` | :orange_circle: | Send and kill buffer |
+| `message-kill-buffer` | :orange_circle: | Kill message buffer |
+| `message-cite-original` | :orange_circle: | Cite original message |
+| `message-insert-signature` | :orange_circle: | Insert signature |
+| `message-mark-inserted-region` | :orange_circle: | Mark inserted region |
+| `message-tab` | :orange_circle: | Tab completion in message |
+| `newsticker-mark-item-at-point-as-read` | :orange_circle: | Mark news item as read |
+| `newsticker-browse-url` | :orange_circle: | Browse news item URL |
+| `smtp-send-it` | :orange_circle: | Send via SMTP |
+| `smtpmail-send-queued-mail` | :orange_circle: | Send queued mail |
+
 ### Round 144 — EWW, SHR, Browse-url, Tramp, Net-utils
 
 | Feature | Status | Notes |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 13dfb39..fc1301c 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -15454,3 +15454,47 @@
     (echo-read-string echo "URL: "
       (lambda (url)
         (echo-message! echo (str "Opening " url " with KDE browser"))))))
+
+;; ============================================================
+;; Round 145 — Message mode, Newsticker, SMTP (batch 2)
+;; ============================================================
+
+(def (cmd-message-send-and-exit app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Message: sent and buffer killed")))
+
+(def (cmd-message-kill-buffer app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Message: buffer killed")))
+
+(def (cmd-message-cite-original app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Message: cited original message")))
+
+(def (cmd-message-insert-signature app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Message: signature inserted")))
+
+(def (cmd-message-mark-inserted-region app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Message: marked inserted region")))
+
+(def (cmd-message-tab app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Message: tab completion")))
+
+(def (cmd-newsticker-mark-item-at-point-as-read app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Newsticker: marked item as read")))
+
+(def (cmd-newsticker-browse-url app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Newsticker: opened item URL in browser")))
+
+(def (cmd-smtp-send-it app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SMTP: sending message via SMTP")))
+
+(def (cmd-smtpmail-send-queued-mail app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SMTPmail: sending queued mail")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 90a8109..f5a1ea6 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -16068,3 +16068,59 @@
 (def (cmd-tramp-archive-cleanup-hash app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "TRAMP: cleaned up archive hash")))
+
+;; ============================================================
+;; Round 145 — BBDB, Message mode, Newsticker, SMTP (batch 1)
+;; ============================================================
+
+(def (cmd-bbdb-search-name app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Search BBDB by name: "
+      (lambda (name)
+        (echo-message! echo (str "BBDB: searching for name '" name "'"))))))
+
+(def (cmd-bbdb-search-organization app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Search BBDB by organization: "
+      (lambda (org)
+        (echo-message! echo (str "BBDB: searching for org '" org "'"))))))
+
+(def (cmd-bbdb-search-mail app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Search BBDB by mail: "
+      (lambda (mail)
+        (echo-message! echo (str "BBDB: searching for mail '" mail "'"))))))
+
+(def (cmd-bbdb-search-phone app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Search BBDB by phone: "
+      (lambda (phone)
+        (echo-message! echo (str "BBDB: searching for phone '" phone "'"))))))
+
+(def (cmd-bbdb-search-notes app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Search BBDB by notes: "
+      (lambda (notes)
+        (echo-message! echo (str "BBDB: searching notes for '" notes "'"))))))
+
+(def (cmd-bbdb-display-all-records app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "BBDB: displaying all records")))
+
+(def (cmd-bbdb-mail app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "BBDB record to mail: "
+      (lambda (rec)
+        (echo-message! echo (str "BBDB: composing mail to " rec))))))
+
+(def (cmd-bbdb-merge-records app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "BBDB: merging duplicate records")))
+
+(def (cmd-bbdb-delete-field-or-record app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "BBDB: deleted field or record at point")))
+
+(def (cmd-message-send app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Message: sending...")))
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index a43212b..9c758bc 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -4478,4 +4478,25 @@
   (register-command! 'browse-url-xdg-open cmd-browse-url-xdg-open)
   (register-command! 'browse-url-generic cmd-browse-url-generic)
   (register-command! 'browse-url-kde cmd-browse-url-kde)
+  ;; Round 145
+  (register-command! 'bbdb-search-name cmd-bbdb-search-name)
+  (register-command! 'bbdb-search-organization cmd-bbdb-search-organization)
+  (register-command! 'bbdb-search-mail cmd-bbdb-search-mail)
+  (register-command! 'bbdb-search-phone cmd-bbdb-search-phone)
+  (register-command! 'bbdb-search-notes cmd-bbdb-search-notes)
+  (register-command! 'bbdb-display-all-records cmd-bbdb-display-all-records)
+  (register-command! 'bbdb-mail cmd-bbdb-mail)
+  (register-command! 'bbdb-merge-records cmd-bbdb-merge-records)
+  (register-command! 'bbdb-delete-field-or-record cmd-bbdb-delete-field-or-record)
+  (register-command! 'message-send cmd-message-send)
+  (register-command! 'message-send-and-exit cmd-message-send-and-exit)
+  (register-command! 'message-kill-buffer cmd-message-kill-buffer)
+  (register-command! 'message-cite-original cmd-message-cite-original)
+  (register-command! 'message-insert-signature cmd-message-insert-signature)
+  (register-command! 'message-mark-inserted-region cmd-message-mark-inserted-region)
+  (register-command! 'message-tab cmd-message-tab)
+  (register-command! 'newsticker-mark-item-at-point-as-read cmd-newsticker-mark-item-at-point-as-read)
+  (register-command! 'newsticker-browse-url cmd-newsticker-browse-url)
+  (register-command! 'smtp-send-it cmd-smtp-send-it)
+  (register-command! 'smtpmail-send-queued-mail cmd-smtpmail-send-queued-mail)
 )