Round 47: DAP debugger (debug, breakpoint, continue, step, eval, inspect, disconnect, REPL), flycheck-list/next/prev-errors, flycheck-verify/select/describe-checker, flymake-show-diagnostics

ober

9ce18f45712b25bef0ebb866f5607976c739f6ec

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index b8b79b8..fd81bd1 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -2107,6 +2107,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | LSP diagnostics list | :orange_circle: | List all diagnostics |
 | LSP toggle on type formatting | :orange_circle: | Toggle format-as-you-type |
 
+### Round 47
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| DAP debug | :orange_circle: | Start debug session |
+| DAP breakpoint toggle | :orange_circle: | Toggle breakpoint at line |
+| DAP breakpoint delete | :orange_circle: | Delete all breakpoints |
+| DAP continue | :orange_circle: | Continue execution |
+| DAP next | :orange_circle: | Step over |
+| DAP step in | :orange_circle: | Step into function |
+| DAP step out | :orange_circle: | Step out of function |
+| DAP eval | :orange_circle: | Evaluate expression in debug |
+| DAP UI inspect | :orange_circle: | Inspect variable |
+| DAP disconnect | :orange_circle: | Disconnect debugger |
+| DAP UI REPL | :orange_circle: | Debug REPL buffer |
+| Next error follow minor mode | :orange_circle: | Auto-follow next-error |
+| Flymake show buffer diagnostics | :orange_circle: | List buffer diagnostics |
+| Flymake show project diagnostics | :orange_circle: | List project diagnostics |
+| Flycheck list errors | :orange_circle: | List all flycheck errors |
+| Flycheck next error | :orange_circle: | Jump to next error |
+| Flycheck previous error | :orange_circle: | Jump to previous error |
+| Flycheck verify setup | :orange_circle: | Verify checker configuration |
+| Flycheck select checker | :orange_circle: | Select syntax checker |
+| Flycheck describe checker | :orange_circle: | Describe checker details |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 8c81ad7..2e9d5ab 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -10486,3 +10486,102 @@
     (if (mode-enabled? app "lsp-on-type-formatting")
       (echo-message! echo "LSP on-type formatting enabled")
       (echo-message! echo "LSP on-type formatting disabled"))))
+
+;;; Round 47 batch 2: dap-ui-repl, next-error-follow-minor-mode,
+;;; flymake-show-buffer-diagnostics, flymake-show-project-diagnostics,
+;;; flycheck-list-errors, flycheck-next-error, flycheck-previous-error,
+;;; flycheck-verify-setup, flycheck-select-checker, flycheck-describe-checker
+
+(def (cmd-dap-ui-repl app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*DAP REPL*")))
+    (buffer-content-set! new-buf
+      (str "DAP Debug REPL\n\n"
+           "(No active debug session)\n"
+           "> "))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "DAP REPL")))
+
+(def (cmd-next-error-follow-minor-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "next-error-follow")
+    (if (mode-enabled? app "next-error-follow")
+      (echo-message! echo "Next-error follow mode enabled")
+      (echo-message! echo "Next-error follow mode disabled"))))
+
+(def (cmd-flymake-show-buffer-diagnostics app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (buf (current-buffer frame))
+         (new-buf (make-buffer "*Flymake diagnostics*")))
+    (buffer-content-set! new-buf
+      (str "Flymake Diagnostics: " (buffer-name buf) "\n\n"
+           "No diagnostics."))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Flymake: no diagnostics")))
+
+(def (cmd-flymake-show-project-diagnostics app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*Flymake project diagnostics*")))
+    (buffer-content-set! new-buf
+      (str "Flymake Project Diagnostics\n\n"
+           "No project-wide diagnostics."))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Flymake: no project diagnostics")))
+
+(def (cmd-flycheck-list-errors app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*Flycheck errors*")))
+    (buffer-content-set! new-buf
+      (str "Flycheck Errors\n\n"
+           "  Line  Col  Level  Message\n"
+           "  ----  ---  -----  -------\n"
+           "  (no errors)"))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Flycheck: no errors")))
+
+(def (cmd-flycheck-next-error app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Flycheck: no more errors")))
+
+(def (cmd-flycheck-previous-error app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Flycheck: no previous errors")))
+
+(def (cmd-flycheck-verify-setup app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*Flycheck verify*")))
+    (buffer-content-set! new-buf
+      (str "Flycheck Setup Verification\n\n"
+           "Checker: none selected\n"
+           "Status: not running\n"
+           "Executable: N/A\n\n"
+           "No syntax checker configured for this buffer."))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Flycheck: verify setup")))
+
+(def (cmd-flycheck-select-checker app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Select checker: "
+      (lambda (checker)
+        (when (and checker (not (string-empty? checker)))
+          (echo-message! echo (str "Selected checker: " checker)))))))
+
+(def (cmd-flycheck-describe-checker app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Describe checker: "
+      (lambda (checker)
+        (when (and checker (not (string-empty? checker)))
+          (let* ((frame (app-state-frame app))
+                 (new-buf (make-buffer (str "*Flycheck: " checker "*"))))
+            (buffer-content-set! new-buf
+              (str "Flycheck Checker: " checker "\n\n"
+                   "Description: Syntax checker\n"
+                   "Executable: " checker "\n"
+                   "Status: not available"))
+            (switch-to-buffer frame new-buf)
+            (echo-message! echo (str "Described: " checker))))))))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 5fc861d..6d004e0 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -11092,3 +11092,54 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "LSP: no signature help available")))
 
+;;; Round 47 batch 1: dap-debug, dap-breakpoint-toggle, dap-breakpoint-delete,
+;;; dap-continue, dap-next, dap-step-in, dap-step-out, dap-eval,
+;;; dap-ui-inspect, dap-disconnect
+
+(def (cmd-dap-debug app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: starting debug session (no debug adapter configured)")))
+
+(def (cmd-dap-breakpoint-toggle app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (win (current-window frame))
+         (ed (edit-window-editor win))
+         (line (editor-get-current-line-number ed)))
+    (echo-message! echo (str "DAP: toggled breakpoint at line " line))))
+
+(def (cmd-dap-breakpoint-delete app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: all breakpoints deleted")))
+
+(def (cmd-dap-continue app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: continue (no active debug session)")))
+
+(def (cmd-dap-next app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: step over (no active debug session)")))
+
+(def (cmd-dap-step-in app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: step in (no active debug session)")))
+
+(def (cmd-dap-step-out app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: step out (no active debug session)")))
+
+(def (cmd-dap-eval app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "DAP eval: "
+      (lambda (expr)
+        (when (and expr (not (string-empty? expr)))
+          (echo-message! echo (str "DAP eval: " expr " (no debug session)")))))))
+
+(def (cmd-dap-ui-inspect app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: inspect (no variables to inspect)")))
+
+(def (cmd-dap-disconnect app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "DAP: disconnected from debug session")))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index c9dcc74..966ad80 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -2430,4 +2430,25 @@
   (register-command! 'lsp-lens-mode cmd-lsp-lens-mode)
   (register-command! 'lsp-diagnostics-list cmd-lsp-diagnostics-list)
   (register-command! 'lsp-toggle-on-type-formatting cmd-lsp-toggle-on-type-formatting)
+  ;; Round 47
+  (register-command! 'dap-debug cmd-dap-debug)
+  (register-command! 'dap-breakpoint-toggle cmd-dap-breakpoint-toggle)
+  (register-command! 'dap-breakpoint-delete cmd-dap-breakpoint-delete)
+  (register-command! 'dap-continue cmd-dap-continue)
+  (register-command! 'dap-next cmd-dap-next)
+  (register-command! 'dap-step-in cmd-dap-step-in)
+  (register-command! 'dap-step-out cmd-dap-step-out)
+  (register-command! 'dap-eval cmd-dap-eval)
+  (register-command! 'dap-ui-inspect cmd-dap-ui-inspect)
+  (register-command! 'dap-disconnect cmd-dap-disconnect)
+  (register-command! 'dap-ui-repl cmd-dap-ui-repl)
+  (register-command! 'next-error-follow-minor-mode cmd-next-error-follow-minor-mode)
+  (register-command! 'flymake-show-buffer-diagnostics cmd-flymake-show-buffer-diagnostics)
+  (register-command! 'flymake-show-project-diagnostics cmd-flymake-show-project-diagnostics)
+  (register-command! 'flycheck-list-errors cmd-flycheck-list-errors)
+  (register-command! 'flycheck-next-error cmd-flycheck-next-error)
+  (register-command! 'flycheck-previous-error cmd-flycheck-previous-error)
+  (register-command! 'flycheck-verify-setup cmd-flycheck-verify-setup)
+  (register-command! 'flycheck-select-checker cmd-flycheck-select-checker)
+  (register-command! 'flycheck-describe-checker cmd-flycheck-describe-checker)
 )