summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elisp/geiser-compile.el18
-rw-r--r--elisp/geiser-mode.el4
-rw-r--r--elisp/geiser-repl.el23
3 files changed, 35 insertions, 10 deletions
diff --git a/elisp/geiser-compile.el b/elisp/geiser-compile.el
index e05459c..b1a07ff 100644
--- a/elisp/geiser-compile.el
+++ b/elisp/geiser-compile.el
@@ -16,8 +16,7 @@
(require 'geiser-autodoc)
(require 'geiser-eval)
(require 'geiser-base)
-
-(declare-function geiser-restart-repl "geiser-mode" ())
+(require 'geiser-repl)
;;; Auxiliary functions:
@@ -46,6 +45,12 @@
(geiser-autodoc--clean-cache)
(geiser-eval--send code cont)))
+(defun geiser-compile--ensure-repl (force)
+ (when (or force
+ (and (not (geiser-repl--repl-buffer-p))
+ (yes-or-no-p "No REPL is running: start it?")))
+ (geiser-repl-restart-repl)))
+
;;; User commands:
@@ -54,25 +59,26 @@
(interactive "FScheme file: ")
(geiser-compile--file-op path t "Compiling"))
-(defun geiser-compile-current-buffer (&optional restart-p)
+(defun geiser-compile-current-buffer (&optional restart)
"Compile and load current Scheme file.
With prefix, restart REPL before compiling the file."
(interactive "P")
- (when restart-p (geiser-restart-repl))
+ (geiser-compile--ensure-repl restart)
(geiser-compile-file (buffer-file-name (current-buffer))))
(defun geiser-load-file (path)
"Load Scheme file."
(interactive "FScheme file: ")
+ (geiser-compile--ensure-repl nil)
(geiser-compile--file-op (file-local-name (expand-file-name path)) nil "Loading"))
-(defun geiser-load-current-buffer (&optional restart-p)
+(defun geiser-load-current-buffer (&optional restart)
"Load current Scheme file.
With prefix, restart REPL before loading the file."
(interactive "P")
- (when restart-p (geiser-restart-repl))
+ (geiser-compile--ensure-repl restart)
(geiser-load-file (buffer-file-name (current-buffer))))
;;;###autoload
diff --git a/elisp/geiser-mode.el b/elisp/geiser-mode.el
index 615bbdd..bc074f0 100644
--- a/elisp/geiser-mode.el
+++ b/elisp/geiser-mode.el
@@ -267,9 +267,7 @@ With prefix, recursively macro-expand the resulting expression."
With prefix, try to enter the current buffer's module."
(interactive "P")
- (if arg
- (switch-to-geiser-module (geiser-eval--get-module) (current-buffer))
- (switch-to-geiser nil nil (current-buffer))))
+ (geiser-repl--switch-to-repl arg))
(defun geiser-mode-switch-to-repl-and-enter ()
"Switches to Geiser REPL and enters current buffer's module."
diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el
index 0a1f544..22fbf28 100644
--- a/elisp/geiser-repl.el
+++ b/elisp/geiser-repl.el
@@ -18,7 +18,6 @@
(require 'geiser-syntax)
(require 'geiser-impl)
(require 'geiser-eval)
-(require 'geiser-compile)
(require 'geiser-connection)
(require 'geiser-menu)
(require 'geiser-image)
@@ -1058,6 +1057,28 @@ If no REPL is running, execute `run-geiser' to start a fresh one."
(switch-to-geiser nil nil (or buffer (current-buffer))))
(geiser-repl--send cmd)))
+(defun geiser-repl--switch-to-repl (arg)
+ (if arg
+ (switch-to-geiser-module (geiser-eval--get-module) (current-buffer))
+ (switch-to-geiser nil nil (current-buffer))))
+
+(defun geiser-repl--repl-buffer-p ()
+ (and (buffer-live-p geiser-repl--repl) geiser-repl--repl))
+
+(defun geiser-repl-restart-repl ()
+ "Restarts the REPL associated with the current buffer."
+ (interactive)
+ (let ((b (current-buffer))
+ (impl geiser-impl--implementation))
+ (when (geiser-repl--repl-buffer-p)
+ (geiser-repl--switch-to-repl nil)
+ (comint-kill-subjob)
+ (sit-for 0.1)) ;; ugly hack; but i don't care enough to fix it
+ (run-geiser impl)
+ (sit-for 0.2)
+ (goto-char (point-max))
+ (pop-to-buffer b)))
+
(defun geiser-repl-import-module (&optional module)
"Import a given module in the current namespace of the REPL."
(interactive)