Round 95: Add denote, citar, and BibTeX features

ober

09d5bf27e3bf1b1d9d5b3953fe0b76741d845a12

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index b47650d..3f7385b 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -3333,6 +3333,33 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 
 ---
 
+### Round 95 — Denote, Citar & BibTeX
+
+| Emacs Command | Status | Description |
+|---|---|---|
+| denote-link | :orange_circle: | Insert denote link |
+| denote-backlinks | :orange_circle: | Show denote backlinks |
+| denote-rename-file | :orange_circle: | Rename denote file |
+| denote-keywords-add | :orange_circle: | Add denote keywords |
+| denote-keywords-remove | :orange_circle: | Remove denote keywords |
+| denote-open-or-create | :orange_circle: | Open or create denote note |
+| denote-link-find-file | :orange_circle: | Find linked denote file |
+| denote-link-find-backlink | :orange_circle: | Find backlinked denote file |
+| denote-subdirectory | :orange_circle: | Set denote subdirectory |
+| citar-open | :orange_circle: | Open citation reference |
+| citar-insert-citation | :orange_circle: | Insert citation |
+| citar-insert-reference | :orange_circle: | Insert reference |
+| citar-open-notes | :orange_circle: | Open notes for reference |
+| citar-open-files | :orange_circle: | Open files for reference |
+| bibtex-mode | :orange_circle: | Toggle BibTeX mode |
+| bibtex-clean-entry | :orange_circle: | Clean BibTeX entry |
+| bibtex-fill-entry | :orange_circle: | Fill BibTeX entry |
+| bibtex-reformat | :orange_circle: | Reformat BibTeX buffer |
+| biblio-lookup | :orange_circle: | Look up bibliography |
+| biblio-arxiv-lookup | :orange_circle: | Search ArXiv |
+
+---
+
 ## Recommended Development Roadmap
 
 > *Reprioritized based on the user's actual Emacs workflow*
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 6049ff5..2e69a09 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -13085,3 +13085,55 @@
 (def (cmd-org-journal-list app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Org Journal: listing all entries")))
+
+;;; Round 95 — Citar & BibTeX (cont.)
+(def (cmd-citar-insert-citation app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Insert citation key: "
+      (lambda (key)
+        (echo-message! echo (str "Citar: inserted citation " key))))))
+
+(def (cmd-citar-insert-reference app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Insert reference key: "
+      (lambda (key)
+        (echo-message! echo (str "Citar: inserted reference " key))))))
+
+(def (cmd-citar-open-notes app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Citar: opening notes for reference")))
+
+(def (cmd-citar-open-files app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Citar: opening files for reference")))
+
+(def (cmd-bibtex-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'bibtex)
+    (if (mode-enabled? app 'bibtex)
+      (echo-message! echo "BibTeX mode enabled")
+      (echo-message! echo "BibTeX mode disabled"))))
+
+(def (cmd-bibtex-clean-entry app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "BibTeX: entry cleaned")))
+
+(def (cmd-bibtex-fill-entry app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "BibTeX: entry filled")))
+
+(def (cmd-bibtex-reformat app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "BibTeX: buffer reformatted")))
+
+(def (cmd-biblio-lookup app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Biblio lookup: "
+      (lambda (query)
+        (echo-message! echo (str "Biblio: searching for '" query "'"))))))
+
+(def (cmd-biblio-arxiv-lookup app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "ArXiv lookup: "
+      (lambda (query)
+        (echo-message! echo (str "Biblio: searching ArXiv for '" query "'"))))))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index ec7e96e..2ce1f74 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -13620,3 +13620,56 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Org Anki: all synced notes deleted")))
 
+;;; Round 95 — Denote, Citar & BibTeX
+(def (cmd-denote-link app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Denote: link inserted")))
+
+(def (cmd-denote-backlinks app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Denote: showing backlinks")))
+
+(def (cmd-denote-rename-file app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "New denote title: "
+      (lambda (title)
+        (echo-message! echo (str "Denote: renamed to " title))))))
+
+(def (cmd-denote-keywords-add app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Keywords to add: "
+      (lambda (kw)
+        (echo-message! echo (str "Denote: added keywords " kw))))))
+
+(def (cmd-denote-keywords-remove app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Keywords to remove: "
+      (lambda (kw)
+        (echo-message! echo (str "Denote: removed keywords " kw))))))
+
+(def (cmd-denote-open-or-create app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Denote open or create: "
+      (lambda (title)
+        (echo-message! echo (str "Denote: opened or created '" title "'"))))))
+
+(def (cmd-denote-link-find-file app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Denote: finding linked file")))
+
+(def (cmd-denote-link-find-backlink app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Denote: finding backlinked file")))
+
+(def (cmd-denote-subdirectory app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Denote subdirectory: "
+      (lambda (dir)
+        (echo-message! echo (str "Denote: set subdirectory to " dir))))))
+
+(def (cmd-citar-open app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Citar open reference: "
+      (lambda (ref)
+        (echo-message! echo (str "Citar: opening " ref))))))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index ed9817a..5d8632d 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -3428,4 +3428,25 @@
   (register-command! 'org-journal-open-current cmd-org-journal-open-current)
   (register-command! 'org-journal-search cmd-org-journal-search)
   (register-command! 'org-journal-list cmd-org-journal-list)
+  ;; Round 95
+  (register-command! 'denote-link cmd-denote-link)
+  (register-command! 'denote-backlinks cmd-denote-backlinks)
+  (register-command! 'denote-rename-file cmd-denote-rename-file)
+  (register-command! 'denote-keywords-add cmd-denote-keywords-add)
+  (register-command! 'denote-keywords-remove cmd-denote-keywords-remove)
+  (register-command! 'denote-open-or-create cmd-denote-open-or-create)
+  (register-command! 'denote-link-find-file cmd-denote-link-find-file)
+  (register-command! 'denote-link-find-backlink cmd-denote-link-find-backlink)
+  (register-command! 'denote-subdirectory cmd-denote-subdirectory)
+  (register-command! 'citar-open cmd-citar-open)
+  (register-command! 'citar-insert-citation cmd-citar-insert-citation)
+  (register-command! 'citar-insert-reference cmd-citar-insert-reference)
+  (register-command! 'citar-open-notes cmd-citar-open-notes)
+  (register-command! 'citar-open-files cmd-citar-open-files)
+  (register-command! 'bibtex-mode cmd-bibtex-mode)
+  (register-command! 'bibtex-clean-entry cmd-bibtex-clean-entry)
+  (register-command! 'bibtex-fill-entry cmd-bibtex-fill-entry)
+  (register-command! 'bibtex-reformat cmd-bibtex-reformat)
+  (register-command! 'biblio-lookup cmd-biblio-lookup)
+  (register-command! 'biblio-arxiv-lookup cmd-biblio-arxiv-lookup)
 )