Round 91: Add DAP and debugger features

ober

0cd845bd7c406480bbfc30397183ac2111922e75

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 651db20..69e8210 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -3226,6 +3226,33 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 
 ---
 
+### Round 91 — DAP & Debugger
+
+| Emacs Command | Status | Description |
+|---|---|---|
+| dap-breakpoint-delete-all | :orange_circle: | Delete all breakpoints |
+| dap-restart-frame | :orange_circle: | Restart current frame |
+| dap-ui-locals | :orange_circle: | Show local variables |
+| dap-ui-breakpoints | :orange_circle: | Show breakpoints panel |
+| dap-ui-sessions | :orange_circle: | Show debug sessions |
+| dap-hydra | :orange_circle: | Open debug hydra menu |
+| dap-ui-expressions-add | :orange_circle: | Add watch expression |
+| dap-tooltip-at-point | :orange_circle: | Show value at point |
+| dap-switch-stack-frame | :orange_circle: | Switch stack frame |
+| dap-switch-thread | :orange_circle: | Switch debug thread |
+| dap-toggle-breakpoint-condition | :orange_circle: | Set conditional breakpoint |
+| realgud-gdb | :orange_circle: | Debug with GDB (RealGUD) |
+| realgud-pdb | :orange_circle: | Debug with PDB (RealGUD) |
+| realgud-node-inspect | :orange_circle: | Debug with Node inspector |
+| realgud-lldb | :orange_circle: | Debug with LLDB (RealGUD) |
+| gdb-many-windows | :orange_circle: | GDB many-windows layout |
+| gud-gdb | :orange_circle: | Start GDB via GUD |
+| gud-break | :orange_circle: | Set GUD breakpoint |
+| gud-remove | :orange_circle: | Remove GUD breakpoint |
+| gud-step | :orange_circle: | GUD step into |
+
+---
+
 ## 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 190934f..eb2ce6b 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -12891,3 +12891,56 @@
     (echo-read-string echo "LSP workspace symbol: "
       (lambda (sym)
         (echo-message! echo (str "LSP: searching workspace for " sym))))))
+
+;;; Round 91 — Debugger (cont.)
+(def (cmd-dap-toggle-breakpoint-condition app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Breakpoint condition: "
+      (lambda (cond)
+        (echo-message! echo (str "DAP: conditional breakpoint set: " cond))))))
+
+(def (cmd-realgud-gdb app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "GDB debug program: "
+      (lambda (prog)
+        (echo-message! echo (str "RealGUD: debugging " prog " with GDB"))))))
+
+(def (cmd-realgud-pdb app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "PDB debug script: "
+      (lambda (script)
+        (echo-message! echo (str "RealGUD: debugging " script " with PDB"))))))
+
+(def (cmd-realgud-node-inspect app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Node inspect script: "
+      (lambda (script)
+        (echo-message! echo (str "RealGUD: debugging " script " with Node inspector"))))))
+
+(def (cmd-realgud-lldb app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "LLDB debug program: "
+      (lambda (prog)
+        (echo-message! echo (str "RealGUD: debugging " prog " with LLDB"))))))
+
+(def (cmd-gdb-many-windows app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GDB: many-windows layout opened")))
+
+(def (cmd-gud-gdb app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "GUD GDB command: "
+      (lambda (cmd)
+        (echo-message! echo (str "GUD: starting GDB with " cmd))))))
+
+(def (cmd-gud-break app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GUD: breakpoint set at current line")))
+
+(def (cmd-gud-remove app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GUD: breakpoint removed at current line")))
+
+(def (cmd-gud-step app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GUD: stepped into")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 81136a3..2eb49f3 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -13437,3 +13437,46 @@
       (echo-message! echo "LSP modeline diagnostics enabled")
       (echo-message! echo "LSP modeline diagnostics disabled"))))
 
+;;; Round 91 — DAP & Debugger
+(def (cmd-dap-breakpoint-delete-all app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: all breakpoints deleted")))
+
+(def (cmd-dap-restart-frame app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: restarted current frame")))
+
+(def (cmd-dap-ui-locals app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP UI: showing local variables")))
+
+(def (cmd-dap-ui-breakpoints app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP UI: showing breakpoints")))
+
+(def (cmd-dap-ui-sessions app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP UI: showing debug sessions")))
+
+(def (cmd-dap-hydra app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: debug hydra menu opened")))
+
+(def (cmd-dap-ui-expressions-add app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Watch expression: "
+      (lambda (expr)
+        (echo-message! echo (str "DAP: watching " expr))))))
+
+(def (cmd-dap-tooltip-at-point app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: showing value at point")))
+
+(def (cmd-dap-switch-stack-frame app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: switched stack frame")))
+
+(def (cmd-dap-switch-thread app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: switched thread")))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 2a42e51..390bfaf 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -3345,4 +3345,25 @@
   (register-command! 'lsp-toggle-trace-io cmd-lsp-toggle-trace-io)
   (register-command! 'lsp-avy-lens cmd-lsp-avy-lens)
   (register-command! 'lsp-ivy-workspace-symbol cmd-lsp-ivy-workspace-symbol)
+  ;; Round 91
+  (register-command! 'dap-breakpoint-delete-all cmd-dap-breakpoint-delete-all)
+  (register-command! 'dap-restart-frame cmd-dap-restart-frame)
+  (register-command! 'dap-ui-locals cmd-dap-ui-locals)
+  (register-command! 'dap-ui-breakpoints cmd-dap-ui-breakpoints)
+  (register-command! 'dap-ui-sessions cmd-dap-ui-sessions)
+  (register-command! 'dap-hydra cmd-dap-hydra)
+  (register-command! 'dap-ui-expressions-add cmd-dap-ui-expressions-add)
+  (register-command! 'dap-tooltip-at-point cmd-dap-tooltip-at-point)
+  (register-command! 'dap-switch-stack-frame cmd-dap-switch-stack-frame)
+  (register-command! 'dap-switch-thread cmd-dap-switch-thread)
+  (register-command! 'dap-toggle-breakpoint-condition cmd-dap-toggle-breakpoint-condition)
+  (register-command! 'realgud-gdb cmd-realgud-gdb)
+  (register-command! 'realgud-pdb cmd-realgud-pdb)
+  (register-command! 'realgud-node-inspect cmd-realgud-node-inspect)
+  (register-command! 'realgud-lldb cmd-realgud-lldb)
+  (register-command! 'gdb-many-windows cmd-gdb-many-windows)
+  (register-command! 'gud-gdb cmd-gud-gdb)
+  (register-command! 'gud-break cmd-gud-break)
+  (register-command! 'gud-remove cmd-gud-remove)
+  (register-command! 'gud-step cmd-gud-step)
 )