diff options
-rw-r--r-- | elisp/geiser-compile.el | 80 | ||||
-rw-r--r-- | elisp/geiser-mode.el | 12 | ||||
-rw-r--r-- | elisp/geiser-repl.el | 1 | ||||
-rw-r--r-- | scheme/guile/geiser/emacs.scm | 6 | ||||
-rw-r--r-- | scheme/guile/geiser/eval.scm | 11 |
5 files changed, 75 insertions, 35 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) diff --git a/scheme/guile/geiser/emacs.scm b/scheme/guile/geiser/emacs.scm index 318b07a..38ddc7c 100644 --- a/scheme/guile/geiser/emacs.scm +++ b/scheme/guile/geiser/emacs.scm @@ -27,11 +27,13 @@ (define-module (geiser emacs) #:re-export (ge:proc-args ge:completions - ge:compile-file) + ge:compile-file + ge:load-file) #:use-module ((geiser introspection) :renamer (symbol-prefix-proc 'ge:)) #:use-module ((geiser eval) - :select ((comp-file . ge:compile-file)))) + :select ((comp-file . ge:compile-file) + (load-file . ge:load-file)))) ;;; emacs.scm ends here diff --git a/scheme/guile/geiser/eval.scm b/scheme/guile/geiser/eval.scm index 530099d..1400566 100644 --- a/scheme/guile/geiser/eval.scm +++ b/scheme/guile/geiser/eval.scm @@ -25,7 +25,7 @@ ;;; Code: (define-module (geiser eval) - #:export (eval-in comp-file) + #:export (eval-in comp-file load-file) #:use-module (srfi srfi-1)) (define (eval-in form module-name) @@ -70,9 +70,12 @@ SUBR, MSG and REST." (current (getcwd))) (dynamic-wind (lambda () (chdir dest)) - (lambda () - (compile-file path) - (compile-and-load path)) + (lambda () (compile-file path)) (lambda () (chdir current))))) +(define (load-file path) + "Load file, given its full @var{path}." + (compile-and-load path)) + + ;;; eval.scm ends here |