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)") "(guix store)")
;; Without this workaround, the build output disappears. See ;; Without this workaround, the build output disappears. See
;; <https://github.com/jaor/geiser/issues/83> for details. ;; <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))" "(current-build-output-port (current-error-port))"
repl 'no-history 'no-display)) 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 (unless no-display
(geiser-repl--switch-to-buffer repl)))) (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) (defun guix-geiser-call (proc &rest args)
"Call (PROC ARGS ...) synchronously using the current Geiser REPL. "Call (PROC ARGS ...) synchronously using the current Geiser REPL.
PROC and ARGS should be strings." PROC and ARGS should be strings."

View file

@ -88,6 +88,11 @@ PROC and ARGS should be strings."
args 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) (provide 'guix-guile)
;;; guix-guile.el ends here ;;; guix-guile.el ends here