Round 71: compilation-next/previous-file, comint-send-input/eof/interrupt/stop/quit-subjob, comint-clear-buffer/history-isearch/dynamic-complete/previous-next-matching-input/run/show-output/truncate/write-output, shell-resync-dirs/dirtrack-mode, dirtrack-mode

ober

ba4f164084f959aa6d05a03f98c8d05c5d50117f

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 903883b..426dc4b 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -2702,6 +2702,30 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | insert-abbrevs | :orange_circle: | Insert abbrev table into buffer |
 | kill-all-abbrevs | :orange_circle: | Remove all abbreviations |
 
+### Round 71 — Compilation, Comint & Shell
+
+| Feature | Status | Notes |
+|---|---|---|
+| compilation-next-file | :orange_circle: | Next file in compilation output |
+| compilation-previous-file | :orange_circle: | Previous file in compilation output |
+| comint-send-input | :orange_circle: | Send input to subprocess |
+| comint-send-eof | :orange_circle: | Send EOF to subprocess |
+| comint-interrupt-subjob | :orange_circle: | Interrupt subprocess (C-c) |
+| comint-stop-subjob | :orange_circle: | Stop subprocess (C-z) |
+| comint-quit-subjob | :orange_circle: | Quit subprocess (C-\) |
+| comint-clear-buffer | :orange_circle: | Clear comint buffer |
+| comint-history-isearch-backward | :orange_circle: | Search history backward |
+| comint-dynamic-complete | :orange_circle: | Dynamic completion |
+| comint-previous-matching-input | :orange_circle: | Previous matching input |
+| comint-next-matching-input | :orange_circle: | Next matching input |
+| comint-run | :orange_circle: | Run command in comint buffer |
+| comint-show-output | :orange_circle: | Show last output |
+| shell-resync-dirs | :orange_circle: | Resync directory tracking |
+| shell-dirtrack-mode | :orange_circle: | Shell directory tracking |
+| dirtrack-mode | :orange_circle: | Directory tracking mode |
+| comint-truncate-buffer | :orange_circle: | Truncate comint buffer |
+| comint-write-output | :orange_circle: | Write output to file |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 6fc917b..2bf6893 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -11907,3 +11907,54 @@
 (def (cmd-kill-all-abbrevs app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "All abbreviations removed")))
+
+;; Round 71 — Comint, shell (batch 2)
+(def (cmd-comint-previous-matching-input app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Previous input matching: "
+      (lambda (pat)
+        (echo-message! echo (str "Comint: found previous input matching '" pat "'"))))))
+
+(def (cmd-comint-next-matching-input app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Next input matching: "
+      (lambda (pat)
+        (echo-message! echo (str "Comint: found next input matching '" pat "'"))))))
+
+(def (cmd-comint-run app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Run command in comint: "
+      (lambda (cmd)
+        (echo-message! echo (str "Comint: running " cmd))))))
+
+(def (cmd-comint-show-output app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: showing last output")))
+
+(def (cmd-shell-resync-dirs app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Shell: resynced directory tracking")))
+
+(def (cmd-shell-dirtrack-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'shell-dirtrack)
+    (if (mode-enabled? app 'shell-dirtrack)
+      (echo-message! echo "Shell: directory tracking enabled")
+      (echo-message! echo "Shell: directory tracking disabled"))))
+
+(def (cmd-dirtrack-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'dirtrack)
+    (if (mode-enabled? app 'dirtrack)
+      (echo-message! echo "Dirtrack mode enabled")
+      (echo-message! echo "Dirtrack mode disabled"))))
+
+(def (cmd-comint-truncate-buffer app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: buffer truncated")))
+
+(def (cmd-comint-write-output app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Write comint output to: "
+      (lambda (file)
+        (echo-message! echo (str "Comint: output written to " file))))))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 24835e9..6adecb9 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -12442,3 +12442,44 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Tempel: moved to next field")))
 
+;; Round 71 — Compilation, comint, shell (batch 1)
+(def (cmd-compilation-next-file app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Compilation: moved to next file")))
+
+(def (cmd-compilation-previous-file app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Compilation: moved to previous file")))
+
+(def (cmd-comint-send-input app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: sent input")))
+
+(def (cmd-comint-send-eof app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: sent EOF")))
+
+(def (cmd-comint-interrupt-subjob app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: interrupted subjob (C-c)")))
+
+(def (cmd-comint-stop-subjob app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: stopped subjob (C-z)")))
+
+(def (cmd-comint-quit-subjob app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: quit subjob (C-\\)")))
+
+(def (cmd-comint-clear-buffer app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: buffer cleared")))
+
+(def (cmd-comint-history-isearch-backward app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: searching history backward")))
+
+(def (cmd-comint-dynamic-complete app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Comint: dynamic completion")))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index ae77bc2..ae639f6 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -2929,4 +2929,24 @@
   (register-command! 'inverse-add-mode-abbrev cmd-inverse-add-mode-abbrev)
   (register-command! 'insert-abbrevs cmd-insert-abbrevs)
   (register-command! 'kill-all-abbrevs cmd-kill-all-abbrevs)
+  ;; Round 71
+  (register-command! 'compilation-next-file cmd-compilation-next-file)
+  (register-command! 'compilation-previous-file cmd-compilation-previous-file)
+  (register-command! 'comint-send-input cmd-comint-send-input)
+  (register-command! 'comint-send-eof cmd-comint-send-eof)
+  (register-command! 'comint-interrupt-subjob cmd-comint-interrupt-subjob)
+  (register-command! 'comint-stop-subjob cmd-comint-stop-subjob)
+  (register-command! 'comint-quit-subjob cmd-comint-quit-subjob)
+  (register-command! 'comint-clear-buffer cmd-comint-clear-buffer)
+  (register-command! 'comint-history-isearch-backward cmd-comint-history-isearch-backward)
+  (register-command! 'comint-dynamic-complete cmd-comint-dynamic-complete)
+  (register-command! 'comint-previous-matching-input cmd-comint-previous-matching-input)
+  (register-command! 'comint-next-matching-input cmd-comint-next-matching-input)
+  (register-command! 'comint-run cmd-comint-run)
+  (register-command! 'comint-show-output cmd-comint-show-output)
+  (register-command! 'shell-resync-dirs cmd-shell-resync-dirs)
+  (register-command! 'shell-dirtrack-mode cmd-shell-dirtrack-mode)
+  (register-command! 'dirtrack-mode cmd-dirtrack-mode)
+  (register-command! 'comint-truncate-buffer cmd-comint-truncate-buffer)
+  (register-command! 'comint-write-output cmd-comint-write-output)
 )