aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--emacs/guix-devel.el2
-rw-r--r--emacs/guix-geiser.el17
-rw-r--r--emacs/guix-guile.el5
3 files changed, 23 insertions, 1 deletions
diff --git a/emacs/guix-devel.el b/emacs/guix-devel.el
index 1f760b6ee5..b51fcee459 100644
--- a/emacs/guix-devel.el
+++ b/emacs/guix-devel.el
@@ -79,7 +79,7 @@ Interactively, use the module defined by the current scheme file."
"(guix store)")
;; Without this workaround, the build output disappears. See
;; <https://github.com/jaor/geiser/issues/83> for details.
- (guix-geiser-eval-in-repl
+ (guix-geiser-eval-in-repl-synchronously
"(current-build-output-port (current-error-port))"
repl 'no-history 'no-display))
diff --git a/emacs/guix-geiser.el b/emacs/guix-geiser.el
index eb449bcdb1..0e6cc03a84 100644
--- a/emacs/guix-geiser.el
+++ b/emacs/guix-geiser.el
@@ -80,6 +80,23 @@ If NO-DISPLAY is non-nil, do not switch to the REPL buffer."
(unless no-display
(geiser-repl--switch-to-buffer repl))))
+(defun guix-geiser-eval-in-repl-synchronously (str &optional repl
+ no-history no-display)
+ "Evaluate STR in Geiser REPL synchronously, i.e. wait until the
+REPL operation will be finished.
+See `guix-geiser-eval-in-repl' for the meaning of arguments."
+ (let* ((repl (if repl (get-buffer repl) (guix-geiser-repl)))
+ (running? nil)
+ (filter (lambda (output)
+ (setq running?
+ (and (get-buffer-process repl)
+ (not (guix-guile-prompt? output))))))
+ (comint-output-filter-functions
+ (cons filter comint-output-filter-functions)))
+ (guix-geiser-eval-in-repl str repl no-history no-display)
+ (while running?
+ (sleep-for 0.1))))
+
(defun guix-geiser-call (proc &rest args)
"Call (PROC ARGS ...) synchronously using the current Geiser REPL.
PROC and ARGS should be strings."
diff --git a/emacs/guix-guile.el b/emacs/guix-guile.el
index 63322d7ed8..cd6c54d87e 100644
--- a/emacs/guix-guile.el
+++ b/emacs/guix-guile.el
@@ -88,6 +88,11 @@ PROC and ARGS should be strings."
args
" ")))
+(defun guix-guile-prompt? (string)
+ "Return non-nil, if STRING contains a Guile prompt."
+ (or (string-match-p geiser-guile--prompt-regexp string)
+ (string-match-p geiser-guile--debugger-prompt-regexp string)))
+
(provide 'guix-guile)
;;; guix-guile.el ends here