Round 51: pdf-view (mode/goto/next/prev/fit/search/midnight), nov-mode, djvu-mode, notmuch-search/show/tree, wanderlust, mew, vm-visit-folder, bbdb/search, ebdb

ober

9d8859cd6fda4f83ce8bca2441e2376c4e7018ca

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 01a7ec3..f385156 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -2207,6 +2207,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | General define key | :orange_circle: | Define key with general.el |
 | Use package report | :orange_circle: | Report loaded packages |
 
+### Round 51
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| PDF view mode | :orange_circle: | PDF document viewer |
+| PDF view goto page | :orange_circle: | Jump to specific page |
+| PDF view next page | :orange_circle: | Next PDF page |
+| PDF view previous page | :orange_circle: | Previous PDF page |
+| PDF view fit page | :orange_circle: | Fit page to window |
+| PDF view search | :orange_circle: | Search within PDF |
+| PDF view midnight mode | :orange_circle: | Dark mode for PDF viewing |
+| Nov mode | :orange_circle: | EPUB reader |
+| Nov next document | :orange_circle: | Next EPUB chapter |
+| Nov previous document | :orange_circle: | Previous EPUB chapter |
+| DjVu mode | :orange_circle: | DjVu document viewer |
+| Notmuch search | :orange_circle: | Search notmuch mail |
+| Notmuch show | :orange_circle: | Show notmuch message |
+| Notmuch tree | :orange_circle: | Threaded mail view |
+| Wanderlust | :orange_circle: | Mail/news reader |
+| Mew | :orange_circle: | Mail environment |
+| VM visit folder | :orange_circle: | Visit VM mail folder |
+| BBDB | :orange_circle: | Contact database |
+| BBDB search | :orange_circle: | Search contacts |
+| EBDB | :orange_circle: | Enhanced contact database |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index c14ebc9..ae62157 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -10783,3 +10783,87 @@
            "(No packages loaded via use-package)"))
     (switch-to-buffer frame new-buf)
     (echo-message! echo "Use-package report")))
+
+;;; Round 51 batch 2: djvu-mode, notmuch-search, notmuch-show, notmuch-tree,
+;;; wanderlust, mew, vm-visit-folder, bbdb, bbdb-search, ebdb
+
+(def (cmd-djvu-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DjVu mode: document viewer (not available)")))
+
+(def (cmd-notmuch-search app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Notmuch search: "
+      (lambda (query)
+        (when (and query (not (string-empty? query)))
+          (let* ((frame (app-state-frame app))
+                 (new-buf (make-buffer "*notmuch-search*")))
+            (buffer-content-set! new-buf
+              (str "Notmuch Search: " query "\n\n"
+                   "(No mail database available)"))
+            (switch-to-buffer frame new-buf)
+            (echo-message! echo (str "Notmuch: " query))))))))
+
+(def (cmd-notmuch-show app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Notmuch show: no message to display")))
+
+(def (cmd-notmuch-tree app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Notmuch tree: threaded mail view")))
+
+(def (cmd-wanderlust app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*wanderlust*")))
+    (buffer-content-set! new-buf
+      (str "Wanderlust -- mail/news reader\n\n"
+           "No folders configured.\n"
+           "Add folders to ~/.wl to get started."))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Wanderlust (no folders)")))
+
+(def (cmd-mew app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*mew*")))
+    (buffer-content-set! new-buf
+      (str "Mew -- mail environment\n\n"
+           "No mail configuration found."))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Mew (not configured)")))
+
+(def (cmd-vm-visit-folder app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "VM folder: "
+      (lambda (folder)
+        (when (and folder (not (string-empty? folder)))
+          (echo-message! echo (str "VM: " folder " (not available)")))))))
+
+(def (cmd-bbdb app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*BBDB*")))
+    (buffer-content-set! new-buf
+      (str "BBDB -- Big Brother Database\n\n"
+           "Contact database is empty.\n"
+           "Use bbdb-create to add contacts."))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "BBDB: empty database")))
+
+(def (cmd-bbdb-search app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "BBDB search: "
+      (lambda (query)
+        (when (and query (not (string-empty? query)))
+          (echo-message! echo (str "BBDB: no matches for '" query "'")))))))
+
+(def (cmd-ebdb app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*EBDB*")))
+    (buffer-content-set! new-buf
+      (str "EBDB -- Insidious Big Brother Database\n\n"
+           "Contact database is empty."))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "EBDB: empty database")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index a4c4926..1fd4872 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -11321,3 +11321,56 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Evil: quit (use C-x C-c to exit editor)")))
 
+;;; Round 51 batch 1: pdf-view-mode, pdf-view-goto-page, pdf-view-next-page,
+;;; pdf-view-previous-page, pdf-view-fit-page, pdf-view-search,
+;;; pdf-view-midnight-mode, nov-mode, nov-next-document, nov-previous-document
+
+(def (cmd-pdf-view-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PDF view mode (pdf-tools required)")))
+
+(def (cmd-pdf-view-goto-page app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Go to page: "
+      (lambda (page)
+        (when (and page (not (string-empty? page)))
+          (echo-message! echo (str "PDF: page " page)))))))
+
+(def (cmd-pdf-view-next-page app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PDF: next page")))
+
+(def (cmd-pdf-view-previous-page app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PDF: previous page")))
+
+(def (cmd-pdf-view-fit-page app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PDF: fit page to window")))
+
+(def (cmd-pdf-view-search app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "PDF search: "
+      (lambda (query)
+        (when (and query (not (string-empty? query)))
+          (echo-message! echo (str "PDF search: " query)))))))
+
+(def (cmd-pdf-view-midnight-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "pdf-midnight")
+    (if (mode-enabled? app "pdf-midnight")
+      (echo-message! echo "PDF midnight mode enabled (dark background)")
+      (echo-message! echo "PDF midnight mode disabled"))))
+
+(def (cmd-nov-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Nov mode: EPUB reader")))
+
+(def (cmd-nov-next-document app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Nov: next chapter")))
+
+(def (cmd-nov-previous-document app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Nov: previous chapter")))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 4ec8057..a3ce9f8 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -2514,4 +2514,25 @@
   (register-command! 'which-key-show-major-mode cmd-which-key-show-major-mode)
   (register-command! 'general-define-key cmd-general-define-key)
   (register-command! 'use-package-report cmd-use-package-report)
+  ;; Round 51
+  (register-command! 'pdf-view-mode cmd-pdf-view-mode)
+  (register-command! 'pdf-view-goto-page cmd-pdf-view-goto-page)
+  (register-command! 'pdf-view-next-page cmd-pdf-view-next-page)
+  (register-command! 'pdf-view-previous-page cmd-pdf-view-previous-page)
+  (register-command! 'pdf-view-fit-page cmd-pdf-view-fit-page)
+  (register-command! 'pdf-view-search cmd-pdf-view-search)
+  (register-command! 'pdf-view-midnight-mode cmd-pdf-view-midnight-mode)
+  (register-command! 'nov-mode cmd-nov-mode)
+  (register-command! 'nov-next-document cmd-nov-next-document)
+  (register-command! 'nov-previous-document cmd-nov-previous-document)
+  (register-command! 'djvu-mode cmd-djvu-mode)
+  (register-command! 'notmuch-search cmd-notmuch-search)
+  (register-command! 'notmuch-show cmd-notmuch-show)
+  (register-command! 'notmuch-tree cmd-notmuch-tree)
+  (register-command! 'wanderlust cmd-wanderlust)
+  (register-command! 'mew cmd-mew)
+  (register-command! 'vm-visit-folder cmd-vm-visit-folder)
+  (register-command! 'bbdb cmd-bbdb)
+  (register-command! 'bbdb-search cmd-bbdb-search)
+  (register-command! 'ebdb cmd-ebdb)
 )