From 66ab485b27daad2126080439f79a664c157ff62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20F=C3=A9lix=20Rezende=20Ribeiro?= Date: Mon, 5 Aug 2013 19:38:48 -0300 Subject: [PATCH] Babel Scheme: * lisp/ob-scheme.el (org-babel-scheme-make-session-name): remove wrap around code to be evaluated and get evaluation result directly from eiser-eval-region' respecting evaluation error messages and restoring frame's window configuration after it. (org-babel-scheme-get-repl): Restore frame's window configuration after asking Geiser to run the REPL. These changes fix: - a major regression from the older implementation that prevents code with top-level definitions from being correctly evaluated. - the mechanism of communication with Geiser (before did over the echo area). - a bug of reference to a nonexistent echo area message that occurred whenever debugging (edebug) rg-babel-scheme-make-session-name'. - the report of evaluation errors. - the intrusive creation of REPL windows. --- lisp/ob-scheme.el | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lisp/ob-scheme.el b/lisp/ob-scheme.el index f979640..d002c93 100644 --- a/lisp/ob-scheme.el +++ b/lisp/ob-scheme.el @@ -91,15 +91,18 @@ (defun org-babel-scheme-get-repl (impl name) "Switch to a scheme REPL, creating it if it doesn't exist:" - (let ((buffer (org-babel-scheme-get-session-buffer name))) + (let ((buffer (org-babel-scheme-get-session-buffer name)) + (window-cfg (current-window-configuration))) (or buffer (progn (run-geiser impl) + (setq buffer (current-buffer)) (if name (progn (rename-buffer name t) - (org-babel-scheme-set-session-buffer name (current-buffer)))) - (current-buffer))))) + (org-babel-scheme-set-session-buffer name buffer))) + (set-window-configuration window-cfg) + buffer)))) (defun org-babel-scheme-make-session-name (buffer name impl) "Generate a name for the session buffer. @@ -127,9 +130,7 @@ is true; otherwise returns the last value." (with-temp-buffer (insert (format ";; -*- geiser-scheme-implementation: %s -*-" impl)) (newline) - (insert (if output - (format "(with-output-to-string (lambda () %s))" code) - code)) + (insert code) (geiser-mode) (let ((repl-buffer (save-current-buffer (org-babel-scheme-get-repl impl repl)))) @@ -141,11 +142,16 @@ is true; otherwise returns the last value." (current-buffer))))) (setq geiser-repl--repl repl-buffer) (setq geiser-impl--implementation nil) - (geiser-eval-region (point-min) (point-max)) (setq result - (if (equal (substring (current-message) 0 3) "=> ") - (replace-regexp-in-string "^=> " "" (current-message)) - "\"An error occurred.\"")) + (let ((window-cfg (current-window-configuration)) + (pre-result (geiser-eval-region (point-min) + (point-max)))) + (set-window-configuration window-cfg) + (if (or (assq 'error pre-result) + output) + (format "\"%s\"" + (cdr (assq 'output pre-result))) + (cadr (assq 'result pre-result))))) (when (not repl) (save-current-buffer (set-buffer repl-buffer) (geiser-repl-exit)) -- 1.7.9.6