Round 77: notmuch/notmuch-mua-send/new-mail/hello, mu4e/compose-new/headers-search/update-mail/compose-reply/forward, mu4e-mark-for-trash/move/delete/execute-all, mu4e-view-attachment/search-bookmark/headers-toggle-threading/mark-for-flag/view-save-attachment

ober

a1862d22b525cfff9e7322850dc918f2817e8416

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 17ffd29..1ba09a8 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -2850,6 +2850,30 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | titlecase-dwim | :orange_circle: | Smart title case |
 | logos-focus-mode | :orange_circle: | Page-based focused reading |
 
+### Round 77 — Notmuch & mu4e Mail
+
+| Feature | Status | Notes |
+|---|---|---|
+| notmuch | :orange_circle: | Open Notmuch mail client |
+| notmuch-mua-send | :orange_circle: | Send message via Notmuch |
+| notmuch-mua-new-mail | :orange_circle: | Compose new mail |
+| notmuch-hello | :orange_circle: | Notmuch hello screen |
+| mu4e | :orange_circle: | Open mu4e mail client |
+| mu4e-compose-new | :orange_circle: | Compose new mu4e message |
+| mu4e-headers-search | :orange_circle: | Search mail headers |
+| mu4e-update-mail-and-index | :orange_circle: | Fetch and index mail |
+| mu4e-compose-reply | :orange_circle: | Reply to message |
+| mu4e-compose-forward | :orange_circle: | Forward message |
+| mu4e-mark-for-trash | :orange_circle: | Mark for trash |
+| mu4e-mark-for-move | :orange_circle: | Mark for move to maildir |
+| mu4e-mark-for-delete | :orange_circle: | Mark for deletion |
+| mu4e-mark-execute-all | :orange_circle: | Execute all marks |
+| mu4e-view-attachment | :orange_circle: | View attachment |
+| mu4e-search-bookmark | :orange_circle: | Search by bookmark |
+| mu4e-headers-toggle-threading | :orange_circle: | Toggle message threading |
+| mu4e-headers-mark-for-flag | :orange_circle: | Flag message |
+| mu4e-view-save-attachment | :orange_circle: | Save attachment to file |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 418354e..b8791f1 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -12202,3 +12202,46 @@
     (if (mode-enabled? app 'logos-focus)
       (echo-message! echo "Logos focus mode enabled (page-based reading)")
       (echo-message! echo "Logos focus mode disabled"))))
+
+;; Round 77 — mu4e (batch 2)
+(def (cmd-mu4e-mark-for-trash app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: marked for trash")))
+
+(def (cmd-mu4e-mark-for-move app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Move to maildir: "
+      (lambda (dir)
+        (echo-message! echo (str "mu4e: marked for move to " dir))))))
+
+(def (cmd-mu4e-mark-for-delete app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: marked for deletion")))
+
+(def (cmd-mu4e-mark-execute-all app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: executed all pending marks")))
+
+(def (cmd-mu4e-view-attachment app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: viewing attachment")))
+
+(def (cmd-mu4e-search-bookmark app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "mu4e bookmark search: "
+      (lambda (bm)
+        (echo-message! echo (str "mu4e: running bookmark search '" bm "'"))))))
+
+(def (cmd-mu4e-headers-toggle-threading app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: toggled message threading")))
+
+(def (cmd-mu4e-headers-mark-for-flag app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: marked message as flagged")))
+
+(def (cmd-mu4e-view-save-attachment app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Save attachment to: "
+      (lambda (path)
+        (echo-message! echo (str "mu4e: attachment saved to " path))))))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index e3bee27..1778fb1 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -12746,3 +12746,46 @@
       (lambda (pat)
         (echo-message! echo (str "Dictionary: matching words for '" pat "'"))))))
 
+;; Round 77 — Notmuch & mu4e mail (batch 1)
+(def (cmd-notmuch app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Notmuch: opening mail client")))
+
+(def (cmd-notmuch-mua-send app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Notmuch: sending message")))
+
+(def (cmd-notmuch-mua-new-mail app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Notmuch: composing new mail")))
+
+(def (cmd-notmuch-hello app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Notmuch: showing hello screen")))
+
+(def (cmd-mu4e app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: opening mail client")))
+
+(def (cmd-mu4e-compose-new app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: composing new message")))
+
+(def (cmd-mu4e-headers-search app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "mu4e search: "
+      (lambda (query)
+        (echo-message! echo (str "mu4e: searching for '" query "'"))))))
+
+(def (cmd-mu4e-update-mail-and-index app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: updating mail and index")))
+
+(def (cmd-mu4e-compose-reply app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: replying to message")))
+
+(def (cmd-mu4e-compose-forward app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "mu4e: forwarding message")))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 6fe8f81..03ebdfd 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -3053,4 +3053,24 @@
   (register-command! 'jinx-languages cmd-jinx-languages)
   (register-command! 'titlecase-dwim cmd-titlecase-dwim)
   (register-command! 'logos-focus-mode cmd-logos-focus-mode)
+  ;; Round 77
+  (register-command! 'notmuch cmd-notmuch)
+  (register-command! 'notmuch-mua-send cmd-notmuch-mua-send)
+  (register-command! 'notmuch-mua-new-mail cmd-notmuch-mua-new-mail)
+  (register-command! 'notmuch-hello cmd-notmuch-hello)
+  (register-command! 'mu4e cmd-mu4e)
+  (register-command! 'mu4e-compose-new cmd-mu4e-compose-new)
+  (register-command! 'mu4e-headers-search cmd-mu4e-headers-search)
+  (register-command! 'mu4e-update-mail-and-index cmd-mu4e-update-mail-and-index)
+  (register-command! 'mu4e-compose-reply cmd-mu4e-compose-reply)
+  (register-command! 'mu4e-compose-forward cmd-mu4e-compose-forward)
+  (register-command! 'mu4e-mark-for-trash cmd-mu4e-mark-for-trash)
+  (register-command! 'mu4e-mark-for-move cmd-mu4e-mark-for-move)
+  (register-command! 'mu4e-mark-for-delete cmd-mu4e-mark-for-delete)
+  (register-command! 'mu4e-mark-execute-all cmd-mu4e-mark-execute-all)
+  (register-command! 'mu4e-view-attachment cmd-mu4e-view-attachment)
+  (register-command! 'mu4e-search-bookmark cmd-mu4e-search-bookmark)
+  (register-command! 'mu4e-headers-toggle-threading cmd-mu4e-headers-toggle-threading)
+  (register-command! 'mu4e-headers-mark-for-flag cmd-mu4e-headers-mark-for-flag)
+  (register-command! 'mu4e-view-save-attachment cmd-mu4e-view-save-attachment)
 )