summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elisp/geiser-connection.el24
-rw-r--r--elisp/geiser-repl.el14
2 files changed, 33 insertions, 5 deletions
diff --git a/elisp/geiser-connection.el b/elisp/geiser-connection.el
index 577ca97..dfdb21d 100644
--- a/elisp/geiser-connection.el
+++ b/elisp/geiser-connection.el
@@ -126,8 +126,15 @@
(make-variable-buffer-local
(defvar geiser-con--debugging-prompt-regexp nil))
+(make-variable-buffer-local
+ (defvar geiser-con--debugging-inhibits-eval t))
+
+(make-variable-buffer-local
+ (defvar geiser-con--debugging-preamble-regexp nil))
+
(defun geiser-con--is-debugging ()
(and geiser-con--debugging-prompt-regexp
+ geiser-con--debugging-inhibits-eval
comint-last-prompt-overlay
(string-match-p geiser-con--debugging-prompt-regexp
(buffer-substring (overlay-start
@@ -135,16 +142,25 @@
(overlay-end
comint-last-prompt-overlay)))))
+(defsubst geiser-con--has-entered-debugger ()
+ (and geiser-con--debugging-prompt-regexp
+ (re-search-backward geiser-con--debugging-prompt-regexp nil t)
+ (or (null geiser-con--debugging-preamble-regexp)
+ (save-excursion
+ (re-search-backward geiser-con--debugging-preamble-regexp nil t)))))
+
(defun geiser-con--cleanup-connection (c)
(geiser-con--connection-cancel-timer c))
(defun geiser-con--setup-connection (buffer
prompt-regexp
- &optional debug-prompt-regexp)
+ &optional debug-prompt-regexp
+ debug-preamble-regexp)
(with-current-buffer buffer
(when geiser-con--connection
(geiser-con--cleanup-connection geiser-con--connection))
(setq geiser-con--debugging-prompt-regexp debug-prompt-regexp)
+ (setq geiser-con--debugging-preamble-regexp debug-preamble-regexp)
(setq geiser-con--connection (geiser-con--make-connection buffer))
(geiser-con--setup-comint prompt-regexp debug-prompt-regexp)
(geiser-con--connection-start-timer geiser-con--connection)
@@ -169,8 +185,7 @@
(defun geiser-con--comint-buffer-form ()
(with-current-buffer (geiser-con--comint-buffer)
(goto-char (point-max))
- (if (and geiser-con--debugging-prompt-regexp
- (re-search-backward geiser-con--debugging-prompt-regexp nil t))
+ (if (geiser-con--has-entered-debugger)
`((error (key . geiser-debugger))
(output . ,(buffer-substring (point-min) (point))))
(condition-case nil
@@ -188,6 +203,8 @@
(let* ((buffer (geiser-con--connection-buffer con))
(debug-prompt (with-current-buffer buffer
geiser-con--debugging-prompt-regexp))
+ (debug-preamble (with-current-buffer buffer
+ geiser-con--debugging-preamble-regexp))
(req (geiser-con--connection-pop-request con))
(str (and req (geiser-con--request-string req)))
(cbuf (geiser-con--comint-buffer)))
@@ -197,6 +214,7 @@
(with-current-buffer cbuf
(setq comint-redirect-echo-input nil)
(setq geiser-con--debugging-prompt-regexp debug-prompt)
+ (setq geiser-con--debugging-preamble-regexp debug-preamble)
(delete-region (point-min) (point-max)))
(set-buffer buffer)
(if (geiser-con--is-debugging)
diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el
index f1da27f..694f21b 100644
--- a/elisp/geiser-repl.el
+++ b/elisp/geiser-repl.el
@@ -149,6 +149,11 @@ expression for this implementation's scheme prompt.")
"A variable (or thunk returning a value) giving the regular
expression for this implementation's debugging prompt.")
+(geiser-impl--define-caller
+ geiser-repl--debugger-preamble-regexp debugger-preamble-regexp ()
+ "A variable (or thunk returning a value) used to determine whether
+the REPL has entered debugging mode.")
+
(geiser-impl--define-caller geiser-repl--startup startup ()
"Function taking no parameters that is called after the REPL
has been initialised. All Geiser functionality is available to
@@ -161,6 +166,7 @@ you at that point.")
(args (geiser-repl--arglist impl))
(prompt-rx (geiser-repl--prompt-regexp impl))
(deb-prompt-rx (geiser-repl--debugger-prompt-regexp impl))
+ (deb-preamble-rx (geiser-repl--debugger-preamble-regexp impl))
(cname (geiser-repl--repl-name impl)))
(unless (and binary prompt-rx)
(error "Sorry, I don't know how to start a REPL for %s" impl))
@@ -169,7 +175,10 @@ you at that point.")
`(,cname ,(current-buffer) ,binary nil ,@args))
(geiser-repl--wait-for-prompt 10000)
(geiser-repl--history-setup)
- (geiser-con--setup-connection (current-buffer) prompt-rx deb-prompt-rx)
+ (geiser-con--setup-connection (current-buffer)
+ prompt-rx
+ deb-prompt-rx
+ deb-preamble-rx)
(add-to-list 'geiser-repl--repls (current-buffer))
(geiser-repl--set-this-buffer-repl (current-buffer))
(geiser-repl--startup impl)))
@@ -279,7 +288,8 @@ module command as a string")
(comint-redirect-cleanup)
(geiser-con--setup-connection (current-buffer)
comint-prompt-regexp
- geiser-con--debugging-prompt-regexp))
+ geiser-con--debugging-prompt-regexp
+ geiser-con--debugging-preamble-regexp))
;;; REPL history and clean-up: