summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elisp/geiser-connection.el24
-rw-r--r--elisp/geiser-guile.el6
-rw-r--r--elisp/geiser-repl.el14
3 files changed, 38 insertions, 6 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-guile.el b/elisp/geiser-guile.el
index 7fae364..91a316b 100644
--- a/elisp/geiser-guile.el
+++ b/elisp/geiser-guile.el
@@ -65,6 +65,8 @@ This function uses `geiser-guile-init-file' if it exists."
(defconst geiser-guile--prompt-regexp "^[^() \n]+@([^)]*?)> ")
(defconst geiser-guile--debugger-prompt-regexp
"^[^() \n]+@([^)]*?) \\[[0-9]+\\]> ")
+(defconst geiser-guile--debugger-preamble-regexp
+ "^Entering a new prompt\\. ")
;;; Evaluation support:
@@ -140,7 +142,7 @@ This function uses `geiser-guile-init-file' if it exists."
(defun geiser-guile--display-error (module key msg)
(if (eq key 'geiser-debugger)
(progn
- (comint-send-string nil "0\n")
+ (comint-send-string nil ",locals\n")
(accept-process-output nil 0.01)
(when msg
(goto-char (point-max))
@@ -198,6 +200,7 @@ This function uses `geiser-guile-init-file' if it exists."
("^ *\\([0-9]+\\): +" nil 1)
("at \\(/[^:\n]+\\):\\([[:digit:]]+\\):\\([[:digit:]]+\\)" 1 2 3)))
(setq geiser-guile--load-path (geiser-guile--load-path))
+ (setq geiser-con--debugging-inhibits-eval nil)
(compilation-setup t)
(font-lock-add-keywords nil
`((,geiser-guile--path-rx 1
@@ -212,6 +215,7 @@ This function uses `geiser-guile-init-file' if it exists."
(startup geiser-guile--startup)
(prompt-regexp geiser-guile--prompt-regexp)
(debugger-prompt-regexp geiser-guile--debugger-prompt-regexp)
+ (debugger-preamble-regexp geiser-guile--debugger-preamble-regexp)
(marshall-procedure geiser-guile--geiser-procedure)
(find-module geiser-guile--get-module)
(enter-command geiser-guile--enter-command)
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: