summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elisp/geiser-compile.el80
-rw-r--r--elisp/geiser-mode.el12
-rw-r--r--elisp/geiser-repl.el1
3 files changed, 64 insertions, 29 deletions
diff --git a/elisp/geiser-compile.el b/elisp/geiser-compile.el
index f90c24d..a7a7daf 100644
--- a/elisp/geiser-compile.el
+++ b/elisp/geiser-compile.el
@@ -38,39 +38,69 @@
(geiser-popup--define compile "*Geiser compilation*" geiser-compile-mode)
-;;; Compile file command:
+;;; Auxiliary functions:
+
+(defun geiser-compile--buffer/path (&optional path)
+ (let ((path (or path (read-file-name "Scheme file: " nil nil t))))
+ (let ((buffer (find-file-noselect path)))
+ (when (and (buffer-modified-p buffer)
+ (y-or-n-p "Save buffer? "))
+ (save-buffer buffer))
+ (cons buffer path))))
+
+(defun geiser-compile--display-result (title ret)
+ (let ((err (geiser-eval--retort-error ret))
+ (output (geiser-eval--retort-output ret)))
+ (geiser-compile--with-buffer
+ (erase-buffer)
+ (insert title)
+ (newline)
+ (when output
+ (insert output)
+ (newline))
+ (when err
+ (insert "\n" (geiser-eval--error-msg err) "\n"))
+ (goto-char (point-min)))
+ (if (not err)
+ (message "%s %s" title (if (> 0 (length output))
+ (geiser--chomp output)
+ (or (geiser-eval--retort-result ret)
+ "OK!")))
+ (message "")
+ (geiser-compile--pop-to-buffer))))
+
+(defun geiser-compile--file-op (path op msg)
+ (let* ((b/p (geiser-compile--buffer/path path))
+ (buffer (car b/p))
+ (path (cdr b/p))
+ (msg (format "%s %s ..." msg path)))
+ (message msg)
+ (geiser-compile--display-result
+ msg (geiser-eval--send/wait `(:gs ((:ge ,op) ,path))))))
+
+
+;;; User commands::
-(defun geiser-compile-file (&optional path)
+(defun geiser-compile-file (path)
"Compile and load Scheme file."
- (interactive (or path (read-file-name "Scheme file: " nil nil t)))
- (let ((buffer (find-file-noselect path))
- (msg (format "Compiling %s ..." path)))
- (when (and (buffer-modified-p buffer)
- (y-or-n-p "Save buffer? "))
- (save-buffer buffer))
- (message msg)
- (let* ((ret (geiser-eval--send/wait `(:gs ((:ge compile-file) ,path))))
- (err (geiser-eval--retort-error ret))
- (output (geiser-eval--retort-output ret)))
- (geiser-compile--with-buffer
- (erase-buffer)
- (insert msg)
- (newline)
- (when output
- (insert output)
- (newline))
- (when err
- (insert "\n" (geiser-eval--error-str err) "\n")))
- (if (not err)
- (message "%s %s" msg (if output (geiser--chomp output) "OK!"))
- (message "")
- (geiser-compile--pop-to-buffer)))))
+ (interactive "FScheme file: ")
+ (geiser-compile--file-op path 'compile-file "Compiling"))
(defun geiser-compile-current-buffer ()
"Compile and load current Scheme file."
(interactive)
(geiser-compile-file (buffer-file-name (current-buffer))))
+(defun geiser-load-file (path)
+ "Load Scheme file."
+ (interactive "FScheme file: ")
+ (geiser-compile--file-op path 'load-file "Loading"))
+
+(defun geiser-load-current-buffer ()
+ "Load current Scheme file."
+ (interactive)
+ (geiser-load-file (buffer-file-name (current-buffer))))
+
(provide 'geiser-compile)
diff --git a/elisp/geiser-mode.el b/elisp/geiser-mode.el
index 18accb4..f5798e5 100644
--- a/elisp/geiser-mode.el
+++ b/elisp/geiser-mode.el
@@ -137,21 +137,25 @@ interacting with the Geiser REPL is at your disposal.
;;; Keys:
+(define-key geiser-mode-map "\C-c\C-z" 'switch-to-guile)
+(define-key geiser-mode-map "\C-c\C-l" 'geiser-load-current-buffer)
+(define-key geiser-mode-map "\C-c\C-k" 'geiser-compile-current-buffer)
+
(define-key geiser-mode-map (kbd "M-TAB") 'geiser-completion--complete-symbol)
+
(define-key geiser-mode-map "\M-\C-x" 'geiser-send-definition)
-(define-key geiser-mode-map "\C-c\C-a" 'geiser-autodoc-mode)
(define-key geiser-mode-map "\C-x\C-e" 'geiser-send-last-sexp)
(define-key geiser-mode-map "\C-c\C-e" 'geiser-send-definition)
(define-key geiser-mode-map "\C-c\M-e" 'geiser-send-definition-and-go)
(define-key geiser-mode-map "\C-c\C-r" 'geiser-send-region)
(define-key geiser-mode-map "\C-c\M-r" 'geiser-send-region-and-go)
+
+(define-key geiser-mode-map "\C-c\C-a" 'geiser-autodoc-mode)
+
(define-key geiser-mode-map "\C-c\M-c" 'geiser-compile-definition)
(define-key geiser-mode-map "\C-c\C-c" 'geiser-compile-definition-and-go)
(define-key geiser-mode-map "\C-c\C-t" 'geiser-trace-procedure)
(define-key geiser-mode-map "\C-c\C-x" 'geiser-expand-current-form)
-(define-key geiser-mode-map "\C-c\C-z" 'switch-to-guile)
-(define-key geiser-mode-map "\C-c\C-l" 'geiser-load-file)
-(define-key geiser-mode-map "\C-c\C-k" 'geiser-compile-current-buffer)
(provide 'geiser-mode)
diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el
index 3cb84b8..d757bef 100644
--- a/elisp/geiser-repl.el
+++ b/elisp/geiser-repl.el
@@ -143,6 +143,7 @@ the Geiser REPL buffer."
(define-key geiser-repl-mode-map "\C-a" 'geiser-repl--bol)
(define-key geiser-repl-mode-map "\C-ca" 'geiser-autodoc-mode)
(define-key geiser-repl-mode-map "\C-ck" 'geiser-compile-file)
+(define-key geiser-repl-mode-map "\C-cl" 'geiser-load-file)
(define-key geiser-repl-mode-map "\M-p" 'comint-previous-matching-input-from-input)
(define-key geiser-repl-mode-map "\M-n" 'comint-next-matching-input-from-input)