emacs: Fix 'guix-devel-setup-repl'.

Setting up guix ports needs to be done in Geiser REPL synchronously,
otherwise this operation may not be finished before the further
evaluating of guile code.

* emacs/guix-guile.el (guix-guile-prompt?): New function.
* emacs/guix-geiser.el (guix-geiser-eval-in-repl-synchronously): New
  function.
* emacs/guix-devel.el (guix-devel-setup-repl): Use it.
This commit is contained in:
Alex Kost 2015-10-06 20:30:16 +03:00
parent 7c786db4fb
commit 5a60d56975
3 changed files with 23 additions and 1 deletions

View file

@ -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))

View file

@ -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."

View file

@ -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