Round 97: Add terminal and detached session features

ober

ebb55f930a3d1a08e8574ea7622f9893a136e72b

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 7ebe23f..894d0ba 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -3387,6 +3387,33 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 
 ---
 
+### Round 97 — Terminal & Detached Sessions
+
+| Emacs Command | Status | Description |
+|---|---|---|
+| eat-project | :orange_circle: | Open eat terminal in project root |
+| eat-eshell-mode | :orange_circle: | Toggle eat eshell mode |
+| eat-line-mode | :orange_circle: | Switch eat to line mode |
+| eat-char-mode2 | :orange_circle: | Switch eat to char mode 2 |
+| multi-term | :orange_circle: | Create new multi-term terminal |
+| multi-term-next | :orange_circle: | Switch to next multi-term |
+| multi-term-prev | :orange_circle: | Switch to previous multi-term |
+| multi-term-dedicated-toggle | :orange_circle: | Toggle dedicated multi-term |
+| multi-term-dedicated-select | :orange_circle: | Select dedicated multi-term |
+| term-line-mode | :orange_circle: | Switch term to line mode |
+| term-char-mode | :orange_circle: | Switch term to char mode |
+| term-send-raw-string | :orange_circle: | Send raw string to term |
+| term-toggle-mode | :orange_circle: | Toggle term line/char mode |
+| comint-redirect-send-command | :orange_circle: | Redirect comint command output |
+| detached-compile | :orange_circle: | Compile in detached session |
+| detached-open-session | :orange_circle: | Open detached session |
+| detached-list-sessions | :orange_circle: | List detached sessions |
+| detached-view-session | :orange_circle: | View detached session output |
+| detached-attach | :orange_circle: | Attach to detached session |
+| detached-delete-session | :orange_circle: | Delete detached session |
+
+---
+
 ## 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 2ba63e0..e3185bd 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -13178,3 +13178,50 @@
 (def (cmd-cape-dabbrev app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Cape: dabbrev completion activated")))
+
+;;; Round 97 — Terminal & Detached (cont.)
+(def (cmd-term-char-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Term: switched to char mode")))
+
+(def (cmd-term-send-raw-string app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Send raw string: "
+      (lambda (str-val)
+        (echo-message! echo (str "Term: sent raw string"))))))
+
+(def (cmd-term-toggle-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Term: toggled between line and char mode")))
+
+(def (cmd-comint-redirect-send-command app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Redirect command: "
+      (lambda (cmd)
+        (echo-message! echo (str "Comint: redirecting output of " cmd))))))
+
+(def (cmd-detached-compile app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Detached compile command: "
+      (lambda (cmd)
+        (echo-message! echo (str "Detached: compiling with " cmd))))))
+
+(def (cmd-detached-open-session app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Detached: opening session")))
+
+(def (cmd-detached-list-sessions app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Detached: listing all sessions")))
+
+(def (cmd-detached-view-session app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Detached: viewing session output")))
+
+(def (cmd-detached-attach app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Detached: attaching to session")))
+
+(def (cmd-detached-delete-session app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Detached: session deleted")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index bb8573e..3d96718 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -13719,3 +13719,47 @@
       (lambda (sym)
         (echo-message! echo (str "Consult Eglot: searching for " sym))))))
 
+;;; Round 97 — Terminal & Detached
+(def (cmd-eat-project app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Eat: terminal opened in project root")))
+
+(def (cmd-eat-eshell-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'eat-eshell)
+    (if (mode-enabled? app 'eat-eshell)
+      (echo-message! echo "Eat eshell mode enabled")
+      (echo-message! echo "Eat eshell mode disabled"))))
+
+(def (cmd-eat-line-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Eat: switched to line mode")))
+
+(def (cmd-eat-char-mode2 app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Eat: switched to char mode 2")))
+
+(def (cmd-multi-term app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Multi-term: new terminal created")))
+
+(def (cmd-multi-term-next app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Multi-term: switched to next terminal")))
+
+(def (cmd-multi-term-prev app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Multi-term: switched to previous terminal")))
+
+(def (cmd-multi-term-dedicated-toggle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Multi-term: toggled dedicated terminal")))
+
+(def (cmd-multi-term-dedicated-select app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Multi-term: selected dedicated terminal")))
+
+(def (cmd-term-line-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Term: switched to line mode")))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 7532a8f..df5234d 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -3470,4 +3470,25 @@
   (register-command! 'eglot-stderr-buffer cmd-eglot-stderr-buffer)
   (register-command! 'cape-eglot cmd-cape-eglot)
   (register-command! 'cape-dabbrev cmd-cape-dabbrev)
+  ;; Round 97
+  (register-command! 'eat-project cmd-eat-project)
+  (register-command! 'eat-eshell-mode cmd-eat-eshell-mode)
+  (register-command! 'eat-line-mode cmd-eat-line-mode)
+  (register-command! 'eat-char-mode2 cmd-eat-char-mode2)
+  (register-command! 'multi-term cmd-multi-term)
+  (register-command! 'multi-term-next cmd-multi-term-next)
+  (register-command! 'multi-term-prev cmd-multi-term-prev)
+  (register-command! 'multi-term-dedicated-toggle cmd-multi-term-dedicated-toggle)
+  (register-command! 'multi-term-dedicated-select cmd-multi-term-dedicated-select)
+  (register-command! 'term-line-mode cmd-term-line-mode)
+  (register-command! 'term-char-mode cmd-term-char-mode)
+  (register-command! 'term-send-raw-string cmd-term-send-raw-string)
+  (register-command! 'term-toggle-mode cmd-term-toggle-mode)
+  (register-command! 'comint-redirect-send-command cmd-comint-redirect-send-command)
+  (register-command! 'detached-compile cmd-detached-compile)
+  (register-command! 'detached-open-session cmd-detached-open-session)
+  (register-command! 'detached-list-sessions cmd-detached-list-sessions)
+  (register-command! 'detached-view-session cmd-detached-view-session)
+  (register-command! 'detached-attach cmd-detached-attach)
+  (register-command! 'detached-delete-session cmd-detached-delete-session)
 )