Round 40: erc, erc-tls, elfeed, debbugs-gnu, bug-hunter, type-break-mode, display-line-numbers-relative, tab-bar-history, icomplete-vertical, savehist-toggle, tramp-cleanup, auto-save-visited-mode, clone-frame, undelete-frame

ober

bdfa8574afcc4527d9f28111a5f87f70d1b4e537

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 2c43d90..fad777a 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -1932,6 +1932,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | Package refresh no confirm | :orange_circle: | Refresh package archives |
 | Report emacs bug | :orange_circle: | Compose bug report |
 
+### Round 40
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| ERC | :orange_circle: | IRC client |
+| ERC TLS | :orange_circle: | IRC client with TLS |
+| Elfeed | :orange_circle: | RSS/Atom feed reader |
+| Debbugs GNU | :orange_circle: | GNU bug tracker browser |
+| Bug hunter | :orange_circle: | Bisect init file for errors |
+| Type break mode | :orange_circle: | Typing break reminders |
+| Display line numbers relative | :orange_circle: | Relative line number display |
+| Tab bar history back | :orange_circle: | Navigate tab history backward |
+| Tab bar history forward | :orange_circle: | Navigate tab history forward |
+| Icomplete vertical mode | :orange_circle: | Vertical minibuffer completion |
+| Savehist mode toggle | :orange_circle: | Toggle minibuffer history saving |
+| Winner undo redo | :orange_circle: | Undo/redo window configurations |
+| Emacsclient mail | :orange_circle: | Compose mail via emacsclient |
+| TRAMP cleanup all connections | :orange_circle: | Clean all remote connections |
+| TRAMP cleanup this connection | :orange_circle: | Clean current remote connection |
+| Auto save visited mode | :orange_circle: | Auto-save to visited file |
+| Delete auto save files | :orange_circle: | Delete auto-save files |
+| Make frame on monitor | :orange_circle: | Create frame on specific monitor |
+| Clone frame | :orange_circle: | Clone current frame |
+| Undelete frame | :orange_circle: | Restore deleted frame |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index dc2a762..6913ad1 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -10000,3 +10000,62 @@
            "Actual behavior:\n"))
     (switch-to-buffer frame new-buf)
     (echo-message! echo "Composing bug report")))
+
+;;; Round 40 batch 2: savehist-mode-toggle, winner-undo-redo, emacsclient-mail,
+;;; tramp-cleanup-all-connections, tramp-cleanup-this-connection,
+;;; auto-save-visited-mode, delete-auto-save-files, make-frame-on-monitor,
+;;; clone-frame, undelete-frame
+
+(def (cmd-savehist-mode-toggle app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "savehist")
+    (if (mode-enabled? app "savehist")
+      (echo-message! echo "Savehist mode enabled (minibuffer history saved)")
+      (echo-message! echo "Savehist mode disabled"))))
+
+(def (cmd-winner-undo-redo app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Winner: no window configuration history")))
+
+(def (cmd-emacsclient-mail app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*mail*")))
+    (buffer-content-set! new-buf
+      (str "To: \n"
+           "Subject: \n"
+           "Cc: \n"
+           "--text follows this line--\n\n"))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Composing mail via emacsclient")))
+
+(def (cmd-tramp-cleanup-all-connections app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "All TRAMP connections cleaned up")))
+
+(def (cmd-tramp-cleanup-this-connection app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "No active TRAMP connection to clean up")))
+
+(def (cmd-auto-save-visited-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "auto-save-visited")
+    (if (mode-enabled? app "auto-save-visited")
+      (echo-message! echo "Auto-save visited mode enabled (saves to visited file)")
+      (echo-message! echo "Auto-save visited mode disabled"))))
+
+(def (cmd-delete-auto-save-files app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Auto-save files deleted")))
+
+(def (cmd-make-frame-on-monitor app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Make frame on monitor (multi-monitor not available)")))
+
+(def (cmd-clone-frame app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Frame cloned (single-frame mode)")))
+
+(def (cmd-undelete-frame app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "No deleted frame to restore")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 7182ce0..29ae8f4 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -10534,3 +10534,96 @@
             (switch-to-buffer frame new-buf)
             (echo-message! echo (str "Described: " lang))))))))
 
+;;; Round 40 batch 1: erc, erc-tls, elfeed, debbugs-gnu, bug-hunter,
+;;; type-break-mode, display-line-numbers-mode-relative,
+;;; tab-bar-history-back, tab-bar-history-forward, icomplete-vertical-mode
+
+(def (cmd-erc app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "IRC server: "
+      (lambda (server)
+        (when (and server (not (string-empty? server)))
+          (let* ((frame (app-state-frame app))
+                 (new-buf (make-buffer (str "*erc: " server "*"))))
+            (buffer-content-set! new-buf
+              (str "ERC -- IRC client\n\n"
+                   "Connecting to " server "...\n"
+                   "(Network access not available)\n\n"
+                   "Type /join #channel to join a channel\n"
+                   "Type /quit to disconnect"))
+            (switch-to-buffer frame new-buf)
+            (echo-message! echo (str "ERC: " server " (not connected)"))))))))
+
+(def (cmd-erc-tls app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "IRC server (TLS): "
+      (lambda (server)
+        (when (and server (not (string-empty? server)))
+          (let* ((frame (app-state-frame app))
+                 (new-buf (make-buffer (str "*erc: " server "*"))))
+            (buffer-content-set! new-buf
+              (str "ERC -- IRC client (TLS)\n\n"
+                   "Connecting to " server " via TLS...\n"
+                   "(Network access not available)"))
+            (switch-to-buffer frame new-buf)
+            (echo-message! echo (str "ERC TLS: " server " (not connected)"))))))))
+
+(def (cmd-elfeed app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*elfeed-search*")))
+    (buffer-content-set! new-buf
+      (str "Elfeed -- RSS/Atom Feed Reader\n\n"
+           "No feeds configured.\n\n"
+           "Add feeds to elfeed-feeds variable:\n"
+           "  (setq elfeed-feeds '(\"https://example.com/feed\"))\n\n"
+           "g = refresh, s = search, b = browse, q = quit"))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Elfeed: no feeds configured")))
+
+(def (cmd-debbugs-gnu app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*Debbugs*")))
+    (buffer-content-set! new-buf
+      (str "GNU Bug Tracker\n\n"
+           "Severity: normal\n"
+           "Package: emacs\n\n"
+           "(No bugs fetched - network not available)\n\n"
+           "Use debbugs-gnu to browse GNU bug reports."))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Debbugs: network not available")))
+
+(def (cmd-bug-hunter app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Bug hunter: bisecting init file for errors (not applicable)")))
+
+(def (cmd-type-break-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "type-break")
+    (if (mode-enabled? app "type-break")
+      (echo-message! echo "Type break mode enabled (reminds you to take breaks)")
+      (echo-message! echo "Type break mode disabled"))))
+
+(def (cmd-display-line-numbers-mode-relative app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "relative-line-numbers")
+    (if (mode-enabled? app "relative-line-numbers")
+      (echo-message! echo "Relative line numbers enabled")
+      (echo-message! echo "Relative line numbers disabled"))))
+
+(def (cmd-tab-bar-history-back app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Tab bar history: no previous state")))
+
+(def (cmd-tab-bar-history-forward app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Tab bar history: no next state")))
+
+(def (cmd-icomplete-vertical-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "icomplete-vertical")
+    (if (mode-enabled? app "icomplete-vertical")
+      (echo-message! echo "Icomplete vertical mode enabled")
+      (echo-message! echo "Icomplete vertical mode disabled"))))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index ba98311..a2f9043 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -2283,4 +2283,25 @@
   (register-command! 'package-autoremove cmd-package-autoremove)
   (register-command! 'package-refresh-no-confirm cmd-package-refresh-no-confirm)
   (register-command! 'report-emacs-bug cmd-report-emacs-bug)
+  ;; Round 40
+  (register-command! 'erc cmd-erc)
+  (register-command! 'erc-tls cmd-erc-tls)
+  (register-command! 'elfeed cmd-elfeed)
+  (register-command! 'debbugs-gnu cmd-debbugs-gnu)
+  (register-command! 'bug-hunter cmd-bug-hunter)
+  (register-command! 'type-break-mode cmd-type-break-mode)
+  (register-command! 'display-line-numbers-mode-relative cmd-display-line-numbers-mode-relative)
+  (register-command! 'tab-bar-history-back cmd-tab-bar-history-back)
+  (register-command! 'tab-bar-history-forward cmd-tab-bar-history-forward)
+  (register-command! 'icomplete-vertical-mode cmd-icomplete-vertical-mode)
+  (register-command! 'savehist-mode-toggle cmd-savehist-mode-toggle)
+  (register-command! 'winner-undo-redo cmd-winner-undo-redo)
+  (register-command! 'emacsclient-mail cmd-emacsclient-mail)
+  (register-command! 'tramp-cleanup-all-connections cmd-tramp-cleanup-all-connections)
+  (register-command! 'tramp-cleanup-this-connection cmd-tramp-cleanup-this-connection)
+  (register-command! 'auto-save-visited-mode cmd-auto-save-visited-mode)
+  (register-command! 'delete-auto-save-files cmd-delete-auto-save-files)
+  (register-command! 'make-frame-on-monitor cmd-make-frame-on-monitor)
+  (register-command! 'clone-frame cmd-clone-frame)
+  (register-command! 'undelete-frame cmd-undelete-frame)
 )