Просмотр исходного кода

functional results now working with org-babel-comint and org-babel-script

Eric Schulte 16 лет назад
Родитель
Сommit
f3da4d0321
3 измененных файлов с 57 добавлено и 25 удалено
  1. 39 13
      lisp/org-babel-script.el
  2. 3 3
      lisp/org-babel.el
  3. 15 9
      org-babel.org

+ 39 - 13
lisp/org-babel-script.el

@@ -59,6 +59,7 @@ executed through org-babel."
   "Pass BODY to INTERPRETER obeying any options set with PARAMS."
   (message (format "executing %s code block..." cmd))
   (let* ((vars (org-babel-ref-variables params))
+         (results-params (split-string (or (cdr (assoc :results params)) "")))
          (full-body (concat
                      (mapconcat ;; define any variables
                       (lambda (pair)
@@ -66,8 +67,18 @@ executed through org-babel."
                                 (car pair)
                                 (org-babel-script-var-to-ruby/python (cdr pair))))
                       vars "\n") body "\n"))) ;; then the source block body
-    (org-babel-script-input-command interpreter full-body)
-    (org-babel-script-table-or-results (org-babel-script-last-value interpreter))))
+    (org-babel-script-initiate-session interpreter)
+    (cond
+     ((member "script" results-params) ;; collect all output
+      (let ((tmp-file (make-temp-file "org-babel-R-script-output")))
+        (org-babel-comint-input-command org-babel-R-buffer (format "sink(%S)" tmp-file))
+        (org-babel-comint-input-command org-babel-R-buffer body)
+        (org-babel-comint-input-command org-babel-R-buffer "sink()")
+        (with-temp-buffer (insert-file-contents tmp-file) (buffer-string))))
+     ((member "last" results-params) ;; the value of the last statement
+      (org-babel-script-input-command interpreter full-body)
+      (org-babel-script-table-or-results
+       (org-babel-script-command-to-string interpreter "_"))))))
 
 (defun org-babel-script-var-to-ruby/python (var)
   "Convert an elisp var into a string of ruby or python source
@@ -93,21 +104,36 @@ Emacs-lisp table, otherwise return the results as a string."
      (org-babel-chomp results))))
 
 ;; functions for interacting with comint sessions
-(defvar org-babel-script-default-ruby-session "org-babel-ruby"
-  "variable to hold the default ruby session")
+(defvar org-babel-script-ruby-session nil)
+(defvar org-babel-script-python-session nil)
 
-(defvar org-babel-script-default-python-session "*org-babel-python*"
-  "variable to hold the current python session")
+(defun org-babel-script-session (interpreter)
+  (case (if (symbolp interpreter) interpreter (intern interpreter))
+          ('ruby 'org-babel-script-ruby-session)
+          ('python 'org-babel-script-python-session)))
 
-(defun org-babel-script-initiate-session (interpreter &optional session)
+(defun org-babel-script-initiate-session (interpreter)
   "If there is not a current inferior-process-buffer in SESSION
 then create.  Return the initialized session."
-  (save-window-excursion
-    (case (if (symbolp interpreter) interpreter (intern interpreter))
-      ('ruby
-       (setq session (or session org-babel-script-default-ruby-session))
-       (funcall #'run-ruby nil session))
-      ('python (funcall #'run-python)))))
+  (case (intern (format "%s" interpreter))
+    ('ruby
+     (setq org-babel-script-ruby-session (save-window-excursion
+                                            (funcall #'run-ruby nil)
+                                            (current-buffer))))
+    ('python
+     (setq org-babel-script-python-session (save-window-excursion
+                                             (funcall #'run-python)
+                                             (current-buffer))))))
+
+(defun org-babel-script-input-command (interpreter cmd)
+  (setq cmd (org-babel-chomp cmd))
+  (message (format "input = %S" cmd))
+  (org-babel-comint-input-command (eval (org-babel-script-session interpreter)) cmd))
+
+(defun org-babel-script-command-to-string (interpreter cmd)
+  (setq cmd (org-babel-chomp cmd))
+  (message (format "string = %S" cmd))
+  (org-babel-comint-command-to-string (eval (org-babel-script-session interpreter)) cmd))
 
 (provide 'org-babel-script)
 ;;; org-babel-script.el ends here

+ 3 - 3
lisp/org-babel.el

@@ -363,9 +363,9 @@ This is taken almost directly from `org-read-prop'."
   "Remove any trailing space or carriage returns characters from
 STRING.  Default regexp used is \"[ \f\t\n\r\v]\" but can be
 overwritten by specifying a regexp as a second argument."
-  (while (string-match "[ \f\t\n\r\v]" (substring results -1))
-    (setq results (substring results 0 -1)))
-  results)
+  (while (string-match "[ \f\t\n\r\v]" (substring string -1))
+    (setq string (substring string 0 -1)))
+  string)
 
 (provide 'org-babel)
 ;;; org-babel.el ends here

+ 15 - 9
org-babel.org

@@ -465,7 +465,7 @@ for the execution of source-code blocks.
              with the results (this implies the *script* =:results=
              argument as well)
 
-*** TODO rework evaluation lang-by-lang [1/4]
+*** TODO rework evaluation lang-by-lang [0/4]
 
 This should include...
 - functional results working with the comint buffer
@@ -478,11 +478,12 @@ This should include...
 
 - sessions in comint buffers
 
-**** DONE R [3/3]
+**** TODO R [3/3]
 
 - [X] functional results working with comint
 - [X] script results
 - [X] ensure callable by other source block
+- [ ] rename buffer after session
 
 To redirect output to a file, you can use the =sink()= command.
 
@@ -516,20 +517,25 @@ twoentyseven
 (setq debug-on-error t)
 #+end_src
 
-**** TODO Ruby [0/3]
+**** TODO Ruby [1/4]
 
-- [ ] functional results working with comint
+- [X] functional results working with comint
 - [ ] script results
 - [ ] ensure callable by other source block
+- [ ] rename buffer after session
 
 #+srcname: ruby-use-last-output
-#+begin_src ruby 
-a = 1
-b = 2
-c = 3
-(a + b) * c
+#+begin_src ruby :results replace last
+a = 2
+b = 4
+c = a + b
+c * (a + b)
 #+end_src
 
+#+resname: ruby-use-last-output
+: 36
+
+
 **** TODO Python
 
 **** TODO Shells