summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjao <jao@gnu.org>2021-12-29 16:16:21 +0000
committerjao <jao@gnu.org>2021-12-29 16:17:20 +0000
commite4175e7b2c012fbefdabad1ee4e96ff8cc25df4e (patch)
treeeecf0b0940b1546d7decb81ff3044aa495431f22
parenta910c7f80418fd12058dce3d6c348a752fada032 (diff)
downloadgeiser-e4175e7b2c012fbefdabad1ee4e96ff8cc25df4e.tar.gz
geiser-e4175e7b2c012fbefdabad1ee4e96ff8cc25df4e.tar.bz2
New function geiser-eval-region/wait
-rw-r--r--elisp/geiser-debug.el14
-rw-r--r--elisp/geiser-mode.el10
2 files changed, 23 insertions, 1 deletions
diff --git a/elisp/geiser-debug.el b/elisp/geiser-debug.el
index f5b98a3..f761c8b 100644
--- a/elisp/geiser-debug.el
+++ b/elisp/geiser-debug.el
@@ -286,6 +286,12 @@ buffer.")
str))
(defun geiser-debug--send-region (compile start end and-go wrap &optional nomsg)
+ "Evaluate (or COMPILE) the region delimited by START and END.
+The result of the evaluation is reported asynchronously, so this
+call is not blocking. If AND-GO is t, also jump to the repl
+buffer. If WRAP is t, the region's content is wrapped in a begin
+form. The flag NOMSG can be used to avoid reporting of the
+result in the minibuffer."
(let* ((str (buffer-substring-no-properties start end))
(wrapped (if wrap (geiser-debug--wrap-region str) str))
(code `(,(if compile :comp :eval) (:scm ,wrapped)))
@@ -306,6 +312,14 @@ buffer.")
(geiser-debug--display-retort scstr ret res)))))
(geiser-eval--send code cont (current-buffer))))
+(defun geiser-debug--send-region/wait (compile start end timeout)
+ "Synchronous version of `geiser-debug--send-region', waiting and returning its result."
+ (let* ((str (buffer-substring-no-properties start end))
+ (wrapped (geiser-debug--wrap-region str))
+ (code `(,(if compile :comp :eval) (:scm ,wrapped))))
+ (message "evaluating: %s" code)
+ (geiser-eval--send/wait code timeout)))
+
(defun geiser-debug--expand-region (start end all wrap)
(let* ((str (buffer-substring-no-properties start end))
(wrapped (if wrap (geiser-debug--wrap-region str) str))
diff --git a/elisp/geiser-mode.el b/elisp/geiser-mode.el
index b1df1b6..9ea4d60 100644
--- a/elisp/geiser-mode.el
+++ b/elisp/geiser-mode.el
@@ -110,7 +110,9 @@ individual sexps."
With prefix, goes to the REPL buffer afterwards (as
`geiser-eval-region-and-go'). The evaluation is performed
asynchronously: this function's return value can be used to wait
-for its completion using `geiser-eval-wait'."
+for its completion using `geiser-eval-wait'. See also
+`geiser-eval-region/wait' if you just need to eval a region
+programmatically in a synchronous way."
(interactive "rP")
(save-restriction
(narrow-to-region start end)
@@ -122,6 +124,12 @@ for its completion using `geiser-eval-wait'."
(not raw)
nomsg))
+(defun geiser-eval-region/wait (start end &optional timeout)
+ "Like `geiser-eval-region', but waiting for the evaluation to finish.
+Returns its raw result, rather than displaying it. TIMEOUT is the
+number of seconds to wait for the evaluation to finish."
+ (geiser-debug--send-region/wait nil start end (* 1000 (or timeout 10))))
+
(defun geiser-eval-region-and-go (start end)
"Eval the current region in the Geiser REPL and visit it afterwads."
(interactive "r")