summaryrefslogtreecommitdiff
path: root/elisp/geiser-debug.el
diff options
context:
space:
mode:
Diffstat (limited to 'elisp/geiser-debug.el')
-rw-r--r--elisp/geiser-debug.el69
1 files changed, 39 insertions, 30 deletions
diff --git a/elisp/geiser-debug.el b/elisp/geiser-debug.el
index e1f37b7..f73b6cd 100644
--- a/elisp/geiser-debug.el
+++ b/elisp/geiser-debug.el
@@ -107,45 +107,57 @@ all ANSI sequences."
(buffer-disable-undo)
(set-syntax-table scheme-mode-syntax-table)
(setq next-error-function 'geiser-edit--open-next)
+ (compilation-minor-mode 1)
(setq buffer-read-only t))
-(defun geiser-debug--button-p (nextp)
- (let ((m (funcall (if nextp 'next-button 'previous-button) (point))))
- (and m (funcall (if nextp '< '>) (point) (marker-position m)))))
-
(defvar-local geiser-debug--debugger-active-p nil)
(defvar-local geiser-debug--sender-buffer nil)
(geiser-menu--defmenu debug geiser-debug-mode-map
- ("Next error" "n" forward-button :enable (geiser-debug--button-p t))
- ("Previous error" "p" backward-button :enable (geiser-debug--button-p t))
- ("Debugger command" ","
- geiser-debug--debugger-transient :enable geiser-debug--debugger-active-p)
+ ("Next error" "n" compilation-next-error)
+ ("Previous error" "p" compilation-previous-error)
+ ("Debugger command" "," geiser-debug--debugger-transient
+ :enable geiser-debug--debugger-active-p)
+ ("Source buffer" ("z" (kbd "C-c C-z")) geiser-debug-switch-to-buffer)
--
("Quit" nil View-quit))
(defun geiser-debug--send-to-repl (thing)
- (unless geiser-debug--sender-buffer (error "Debugger not active"))
- (with-current-buffer geiser-debug--sender-buffer
- (let* ((ret (geiser-eval--send/wait (list :debug thing)))
- (res (geiser-eval--retort-result-str ret nil)))
- (geiser-debug--display-retort "" ret res))))
+ (unless (and geiser-debug--debugger-active-p geiser-debug--sender-buffer)
+ (error "Debugger not active"))
+ (save-window-excursion
+ (with-current-buffer geiser-debug--sender-buffer
+ (let* ((ret (geiser-eval--send/wait (cons :debug thing)))
+ (res (geiser-eval--retort-result-str ret nil)))
+ (geiser-debug--display-retort (format ",%s" thing) ret res)))))
+
+(defun geiser-debug-switch-to-buffer ()
+ "Return to the scheme buffer that pooped this debug window."
+ (interactive)
+ (when geiser-debug--sender-buffer
+ (geiser-repl--switch-to-buffer geiser-debug--sender-buffer)))
(defun geiser-debug-debugger-quit ()
"Quit the current debugging session level"
(interactive)
- (geiser-debug--send-to-repl ",q"))
+ (geiser-debug--send-to-repl 'quit))
(defun geiser-debug-debugger-backtrace ()
"Quit the current debugging session level"
(interactive)
- (geiser-debug--send-to-repl ",bt"))
+ (geiser-debug--send-to-repl 'bt))
(transient-define-prefix geiser-debug--debugger-transient ()
"Debugging meta-commands"
- ["Debugger"
+ [:description (lambda () (format "%s debugger" (geiser-impl--impl-str)))
+ :if (lambda () geiser-debug--debugger-active-p)
("q" "Quit current debugger level" geiser-debug-debugger-quit)
- ("bt" "Display backtrace" geiser-debug-debugger-quit)])
+ ("bt" "Display backtrace" geiser-debug-debugger-backtrace)])
+
+
+;;; Implementation-dependent functionality
+(geiser-impl--define-caller geiser-debug--clean-up-output clean-up-output (output)
+ "Clean up output from an evaluation for display.")
;;; Buffer for displaying evaluation results:
@@ -188,31 +200,28 @@ buffer.")
(declare-function switch-to-geiser "geiser-repl")
-(defun geiser-debug--remove-prompt (impl str)
- (replace-regexp-in-string (or (geiser-repl--debugger-prompt-regexp impl) "^$")
- ""
- str))
-
(defun geiser-debug--display-retort (what ret &optional res auto-p)
(let* ((err (geiser-eval--retort-error ret))
(key (geiser-eval--error-key err))
- (output (geiser-eval--retort-output ret))
- (output (and (stringp output) (not (string= output "")) output))
+ (debug (alist-get 'debug ret))
(impl geiser-impl--implementation)
+ (output (geiser-eval--retort-output ret))
+ (output (and (stringp output)
+ (not (string= output ""))
+ (or (geiser-debug--clean-up-output impl output) output)))
(module (geiser-eval--get-module))
(img nil)
(dir default-directory)
(buffer (current-buffer))
- (debug (eq key 'geiser-debugger))
- (output (if debug (geiser-debug--remove-prompt impl output) output))
- (debug-entered (when debug
- (switch-to-geiser nil nil buffer)
- (geiser-debug--enter-debugger impl)))
+ (debug-entered (when debug (geiser-debug--enter-debugger impl)))
(after (geiser-debug--display-after what)))
(unless debug-entered
(geiser-debug--with-buffer
+ (when (and (not debug) geiser-debug--debugger-active-p)
+ (message "Debugger exited"))
(setq geiser-debug--debugger-active-p debug
- geiser-debug--sender-buffer buffer)
+ geiser-debug--sender-buffer buffer
+ geiser-impl--implementation impl)
(erase-buffer)
(when dir (setq default-directory dir))
(unless after (insert what "\n\n"))