|
|
|
@ -80,7 +80,7 @@ then run `org-babel-pop-to-session'."
|
|
|
|
|
(add-hook 'org-metadown-hook 'org-babel-pop-to-session-maybe)
|
|
|
|
|
|
|
|
|
|
(defvar org-babel-default-header-args
|
|
|
|
|
'((:session . "none") (:results . "replace") (:exports . "code"))
|
|
|
|
|
'((:session . "none") (:results . "replace") (:exports . "code") (:nocache))
|
|
|
|
|
"Default arguments to use when evaluating a source block.")
|
|
|
|
|
|
|
|
|
|
(defvar org-babel-default-inline-header-args
|
|
|
|
@ -93,22 +93,34 @@ then run `org-babel-pop-to-session'."
|
|
|
|
|
(defvar org-babel-inline-src-block-regexp nil
|
|
|
|
|
"Regexp used to test when on an inline org-babel src-block")
|
|
|
|
|
|
|
|
|
|
(defvar org-babel-result-regexp
|
|
|
|
|
"#\\+res\\(ults\\|name\\)\\(\\[\\([[:alnum:]]+\\)\\]\\)?\\:"
|
|
|
|
|
"Regular expression used to match result lines. If the
|
|
|
|
|
results are associated with a hash key then the hash will be
|
|
|
|
|
saved in the second match data.")
|
|
|
|
|
|
|
|
|
|
(defvar org-babel-source-name-regexp
|
|
|
|
|
"#\\+\\(srcname\\|source\\|function\\):[ \t]*"
|
|
|
|
|
"Regular expression used to match a source name line.")
|
|
|
|
|
|
|
|
|
|
(defvar org-babel-min-lines-for-block-output 10
|
|
|
|
|
"If number of lines of output is equal to or exceeds this
|
|
|
|
|
value, the output is placed in a
|
|
|
|
|
#+begin_example...#+end_example block. Otherwise the output is
|
|
|
|
|
marked as literal by inserting colons at the starts of the
|
|
|
|
|
lines. This variable only takes effect if the :results output
|
|
|
|
|
option is in effect.")
|
|
|
|
|
value, the output is placed in a #+begin_example...#+end_example
|
|
|
|
|
block. Otherwise the output is marked as literal by inserting
|
|
|
|
|
colons at the starts of the lines. This variable only takes
|
|
|
|
|
effect if the :results output option is in effect.")
|
|
|
|
|
|
|
|
|
|
(defvar org-babel-noweb-error-langs nil
|
|
|
|
|
"List of language for which errors should be raised when the
|
|
|
|
|
source code block satisfying a noweb reference in this language
|
|
|
|
|
can not be resolved.")
|
|
|
|
|
source code block satisfying a noweb reference in this language
|
|
|
|
|
can not be resolved.")
|
|
|
|
|
|
|
|
|
|
(defvar org-babel-hash-show 4
|
|
|
|
|
"Number of initial characters to show of a hidden results hash.")
|
|
|
|
|
|
|
|
|
|
(defun org-babel-named-src-block-regexp-for-name (name)
|
|
|
|
|
"Regexp used to match named src block."
|
|
|
|
|
(concat "#\\+srcname:[ \t]*" (regexp-quote name) "[ \t\n]*"
|
|
|
|
|
(concat org-babel-source-name-regexp (regexp-quote name) "[ \t\n]*"
|
|
|
|
|
(substring org-babel-src-block-regexp 1)))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-set-interpreters (var value)
|
|
|
|
@ -164,23 +176,27 @@ lisp code use the `org-babel-add-interpreter' function."
|
|
|
|
|
|
|
|
|
|
;;; functions
|
|
|
|
|
(defun org-babel-execute-src-block (&optional arg info params)
|
|
|
|
|
"Execute the current source code block, and dump the results
|
|
|
|
|
into the buffer immediately following the block. Results are
|
|
|
|
|
commented by `org-toggle-fixed-width-section'. With optional
|
|
|
|
|
prefix don't dump results into buffer but rather return the
|
|
|
|
|
results in raw elisp (this is useful for automated execution of a
|
|
|
|
|
source block).
|
|
|
|
|
"Execute the current source code block, and insert the results
|
|
|
|
|
into the buffer. Source code execution and the collection and
|
|
|
|
|
formatting of results can be controlled through a variety of
|
|
|
|
|
header arguments.
|
|
|
|
|
|
|
|
|
|
Optionally supply a value for INFO in the form returned by
|
|
|
|
|
`org-babel-get-src-block-info'.
|
|
|
|
|
|
|
|
|
|
Optionally supply a value for PARAMS which will be merged with
|
|
|
|
|
the header arguments specified at the source code block."
|
|
|
|
|
the header arguments specified at the front of the source code
|
|
|
|
|
block."
|
|
|
|
|
(interactive)
|
|
|
|
|
;; (message "supplied params=%S" params) ;; debugging
|
|
|
|
|
(let* ((info (or info (org-babel-get-src-block-info)))
|
|
|
|
|
(lang (first info))
|
|
|
|
|
(params (setf (third info) (org-babel-merge-params (third info) params)))
|
|
|
|
|
(params (setf (third info)
|
|
|
|
|
(sort (org-babel-merge-params (third info) params)
|
|
|
|
|
(lambda (el1 el2) (string< (symbol-name (car el1))
|
|
|
|
|
(symbol-name (car el2)))))))
|
|
|
|
|
(new-hash (unless (assoc :nocache params) (org-babel-sha1-hash info)))
|
|
|
|
|
(old-hash (org-babel-result-hash info))
|
|
|
|
|
(body (setf (second info)
|
|
|
|
|
(if (assoc :noweb params)
|
|
|
|
|
(org-babel-expand-noweb-references info) (second info))))
|
|
|
|
@ -193,16 +209,21 @@ the header arguments specified at the source code block."
|
|
|
|
|
;; (message "params=%S" params) ;; debugging
|
|
|
|
|
(unless (member lang org-babel-interpreters)
|
|
|
|
|
(error "Language is not in `org-babel-interpreters': %s" lang))
|
|
|
|
|
(when arg (setq result-params (cons "silent" result-params)))
|
|
|
|
|
(setq result (funcall cmd body params))
|
|
|
|
|
(if (eq result-type 'value)
|
|
|
|
|
(setq result (if (and (or (member "vector" result-params)
|
|
|
|
|
(member "table" result-params))
|
|
|
|
|
(not (listp result)))
|
|
|
|
|
(list (list result))
|
|
|
|
|
result)))
|
|
|
|
|
(org-babel-insert-result result result-params info)
|
|
|
|
|
result))
|
|
|
|
|
(if (and (not arg) new-hash (equal new-hash old-hash))
|
|
|
|
|
(save-excursion ;; return cached result
|
|
|
|
|
(goto-char (org-babel-where-is-src-block-result nil info))
|
|
|
|
|
(move-end-of-line 1) (forward-char 1)
|
|
|
|
|
(setq result (org-babel-read-result))
|
|
|
|
|
(message (replace-regexp-in-string "%" "%%" (format "%S" result))) result)
|
|
|
|
|
(setq result (funcall cmd body params))
|
|
|
|
|
(if (eq result-type 'value)
|
|
|
|
|
(setq result (if (and (or (member "vector" result-params)
|
|
|
|
|
(member "table" result-params))
|
|
|
|
|
(not (listp result)))
|
|
|
|
|
(list (list result))
|
|
|
|
|
result)))
|
|
|
|
|
(org-babel-insert-result result result-params info new-hash)
|
|
|
|
|
result)))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-load-in-session (&optional arg info)
|
|
|
|
|
"Load the body of the current source-code block. Evaluate the
|
|
|
|
@ -302,15 +323,16 @@ added to the header-arguments-alist."
|
|
|
|
|
(goto-char head)
|
|
|
|
|
(setq info (org-babel-parse-src-block-match))
|
|
|
|
|
(forward-line -1)
|
|
|
|
|
(when (looking-at "#\\+srcname:[ \t]*\\([^ ()\f\t\n\r\v]+\\)\\(\(\\(.*\\)\)\\|\\)")
|
|
|
|
|
(setq info (append info (list (org-babel-clean-text-properties (match-string 1)))))
|
|
|
|
|
(when (looking-at (concat org-babel-source-name-regexp
|
|
|
|
|
"\\([^ ()\f\t\n\r\v]+\\)\\(\(\\(.*\\)\)\\|\\)"))
|
|
|
|
|
(setq info (append info (list (org-babel-clean-text-properties (match-string 2)))))
|
|
|
|
|
;; Note that e.g. "name()" and "name( )" result in ((:var . "")).
|
|
|
|
|
;; We maintain that behaviour, and the resulting non-nil sixth
|
|
|
|
|
;; element is relied upon in org-babel-exp-code to detect a functional-style
|
|
|
|
|
;; block in those cases. However, "name" without any
|
|
|
|
|
;; parentheses would result in the same thing, so we
|
|
|
|
|
;; explicitly avoid that.
|
|
|
|
|
(if (setq args (match-string 3))
|
|
|
|
|
(if (setq args (match-string 4))
|
|
|
|
|
(setq info (append info (list (mapcar (lambda (ref) (cons :var ref))
|
|
|
|
|
(org-babel-ref-split-args args))))))
|
|
|
|
|
(unless header-vars-only
|
|
|
|
@ -323,6 +345,136 @@ added to the header-arguments-alist."
|
|
|
|
|
(org-babel-parse-inline-src-block-match)
|
|
|
|
|
nil)))) ;; indicate that no source block was found
|
|
|
|
|
|
|
|
|
|
(defun org-babel-sha1-hash (&optional info)
|
|
|
|
|
(interactive)
|
|
|
|
|
(let* ((info (or info (org-babel-get-src-block-info)))
|
|
|
|
|
(hash (sha1 (format "%s-%s" (mapconcat (lambda (arg) (format "%S" arg))
|
|
|
|
|
(third info) ":")
|
|
|
|
|
(second info)))))
|
|
|
|
|
(when (interactive-p) (message hash))
|
|
|
|
|
hash))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-result-hash (&optional info)
|
|
|
|
|
(org-babel-where-is-src-block-result nil info)
|
|
|
|
|
(org-babel-clean-text-properties (match-string 3)))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-hide-hash ()
|
|
|
|
|
"Hide the hash in the current results line. Only the initial
|
|
|
|
|
`org-babel-hash-show' characters of the hash will remain
|
|
|
|
|
visible."
|
|
|
|
|
(org-add-to-invisibility-spec '(org-babel-hide-hash . t))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(when (and (re-search-forward org-babel-result-regexp nil t)
|
|
|
|
|
(match-string 3))
|
|
|
|
|
(let* ((start (match-beginning 3))
|
|
|
|
|
(hide-start (+ org-babel-hash-show start))
|
|
|
|
|
(end (match-end 3))
|
|
|
|
|
(hash (match-string 3))
|
|
|
|
|
ov1 ov2)
|
|
|
|
|
(setq ov1 (org-make-overlay start hide-start))
|
|
|
|
|
(setq ov2 (org-make-overlay hide-start end))
|
|
|
|
|
(org-overlay-put ov2 'invisible 'org-babel-hide-hash)
|
|
|
|
|
(org-overlay-put ov1 'babel-hash hash)))))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-hide-all-hashes ()
|
|
|
|
|
"Hide the hash in the current buffer. Only the initial
|
|
|
|
|
`org-babel-hash-show' characters of each hash will remain
|
|
|
|
|
visible. This function should be called as part of the
|
|
|
|
|
`org-mode-hook'."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(while (re-search-forward org-babel-result-regexp nil t)
|
|
|
|
|
(goto-char (match-beginning 0))
|
|
|
|
|
(org-babel-hide-hash)
|
|
|
|
|
(goto-char (match-end 0)))))
|
|
|
|
|
(add-hook 'org-mode-hook 'org-babel-hide-all-hashes)
|
|
|
|
|
|
|
|
|
|
(defun org-babel-hash-at-point (&optional point)
|
|
|
|
|
"Return the value of the hash at `point'. The hash is also
|
|
|
|
|
added as the last element of the kill ring. This can be called
|
|
|
|
|
with C-c C-c."
|
|
|
|
|
(interactive)
|
|
|
|
|
(let ((hash (car (delq nil (mapcar
|
|
|
|
|
(lambda (ol) (org-overlay-get ol 'babel-hash))
|
|
|
|
|
(org-overlays-at (or point (point))))))))
|
|
|
|
|
(when hash (kill-new hash) (message hash))))
|
|
|
|
|
(add-hook 'org-ctrl-c-ctrl-c-hook 'org-babel-hash-at-point)
|
|
|
|
|
|
|
|
|
|
(defun org-babel-result-hide-spec ()
|
|
|
|
|
(org-add-to-invisibility-spec '(org-babel-hide-result . t)))
|
|
|
|
|
(add-hook 'org-mode-hook 'org-babel-result-hide-spec)
|
|
|
|
|
|
|
|
|
|
(defvar org-babel-hide-result-overlays nil
|
|
|
|
|
"Overlays hiding results.")
|
|
|
|
|
|
|
|
|
|
(defun org-babel-result-hide-all ()
|
|
|
|
|
"Fold all results in the current buffer."
|
|
|
|
|
(interactive)
|
|
|
|
|
(org-babel-show-result-all)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(while (re-search-forward org-babel-result-regexp nil t)
|
|
|
|
|
(save-excursion (goto-char (match-beginning 0))
|
|
|
|
|
(org-babel-hide-result-toggle-maybe)))))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-show-result-all ()
|
|
|
|
|
"Unfold all results in the current buffer."
|
|
|
|
|
(mapc 'org-delete-overlay org-babel-hide-result-overlays)
|
|
|
|
|
(setq org-babel-hide-result-overlays nil))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-hide-result-toggle-maybe ()
|
|
|
|
|
"Toggle visibility of result at point."
|
|
|
|
|
(interactive)
|
|
|
|
|
(let ((case-fold-search t))
|
|
|
|
|
(if (save-excursion
|
|
|
|
|
(beginning-of-line 1)
|
|
|
|
|
(looking-at org-babel-result-regexp))
|
|
|
|
|
(progn (org-babel-hide-result-toggle)
|
|
|
|
|
t) ;; to signal that we took action
|
|
|
|
|
nil))) ;; to signal that we did not
|
|
|
|
|
|
|
|
|
|
(defun org-babel-hide-result-toggle (&optional force)
|
|
|
|
|
"Toggle the visibility of the current result."
|
|
|
|
|
(interactive)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(if (re-search-forward org-babel-result-regexp nil t)
|
|
|
|
|
(let ((start (progn (beginning-of-line 2) (- (point) 1)))
|
|
|
|
|
(end (progn (goto-char (- (org-babel-result-end) 1)) (point)))
|
|
|
|
|
ov)
|
|
|
|
|
(if (memq t (mapcar (lambda (overlay)
|
|
|
|
|
(eq (org-overlay-get overlay 'invisible)
|
|
|
|
|
'org-babel-hide-result))
|
|
|
|
|
(org-overlays-at start)))
|
|
|
|
|
(if (or (not force) (eq force 'off))
|
|
|
|
|
(mapc (lambda (ov)
|
|
|
|
|
(when (member ov org-babel-hide-result-overlays)
|
|
|
|
|
(setq org-babel-hide-result-overlays
|
|
|
|
|
(delq ov org-babel-hide-result-overlays)))
|
|
|
|
|
(when (eq (org-overlay-get ov 'invisible)
|
|
|
|
|
'org-babel-hide-result)
|
|
|
|
|
(org-delete-overlay ov)))
|
|
|
|
|
(org-overlays-at start)))
|
|
|
|
|
(setq ov (org-make-overlay start end))
|
|
|
|
|
(org-overlay-put ov 'invisible 'org-babel-hide-result)
|
|
|
|
|
;; make the block accessible to isearch
|
|
|
|
|
(org-overlay-put
|
|
|
|
|
ov 'isearch-open-invisible
|
|
|
|
|
(lambda (ov)
|
|
|
|
|
(when (member ov org-babel-hide-result-overlays)
|
|
|
|
|
(setq org-babel-hide-result-overlays
|
|
|
|
|
(delq ov org-babel-hide-result-overlays)))
|
|
|
|
|
(when (eq (org-overlay-get ov 'invisible)
|
|
|
|
|
'org-babel-hide-result)
|
|
|
|
|
(org-delete-overlay ov))))
|
|
|
|
|
(push ov org-babel-hide-result-overlays)))
|
|
|
|
|
(error "Not looking at a result line"))))
|
|
|
|
|
|
|
|
|
|
;; org-tab-after-check-for-cycling-hook
|
|
|
|
|
(add-hook 'org-tab-first-hook 'org-babel-hide-result-toggle-maybe)
|
|
|
|
|
;; Remove overlays when changing major mode
|
|
|
|
|
(add-hook 'org-mode-hook
|
|
|
|
|
(lambda () (org-add-hook 'change-major-mode-hook
|
|
|
|
|
'org-babel-show-result-all 'append 'local)))
|
|
|
|
|
|
|
|
|
|
(defmacro org-babel-map-source-blocks (file &rest body)
|
|
|
|
|
"Evaluate BODY forms on each source-block in FILE."
|
|
|
|
|
(declare (indent 1))
|
|
|
|
@ -389,7 +541,8 @@ may be specified in the properties of the current outline entry."
|
|
|
|
|
(lambda (arg)
|
|
|
|
|
(if (string-match "\\([^ \f\t\n\r\v]+\\)[ \f\t\n\r\v]+\\([^ \f\t\n\r\v]+.*\\)" arg)
|
|
|
|
|
(cons (intern (concat ":" (match-string 1 arg)))
|
|
|
|
|
(org-babel-chomp (match-string 2 arg)))
|
|
|
|
|
(let ((raw (org-babel-chomp (match-string 2 arg))))
|
|
|
|
|
(if (org-babel-number-p raw) raw (eval (org-babel-read raw)))))
|
|
|
|
|
(cons (intern (concat ":" arg)) nil)))
|
|
|
|
|
(split-string (concat " " arg-string) "[ \f\t\n\r\v]+:" t)))))
|
|
|
|
|
|
|
|
|
@ -411,9 +564,9 @@ block. Specifically at the beginning of the #+BEGIN_SRC line.
|
|
|
|
|
If the point is not on a source block then return nil."
|
|
|
|
|
(let ((initial (point)) top bottom)
|
|
|
|
|
(or
|
|
|
|
|
(save-excursion ;; on a #+srcname: line
|
|
|
|
|
(save-excursion ;; on a source name line
|
|
|
|
|
(beginning-of-line 1)
|
|
|
|
|
(and (looking-at "#\\+srcname") (forward-line 1)
|
|
|
|
|
(and (looking-at org-babel-source-name-regexp) (forward-line 1)
|
|
|
|
|
(looking-at org-babel-src-block-regexp)
|
|
|
|
|
(point)))
|
|
|
|
|
(save-excursion ;; on a #+begin_src line
|
|
|
|
@ -440,9 +593,9 @@ If the point is not on a source block then return nil."
|
|
|
|
|
|
|
|
|
|
(defun org-babel-find-named-block (name)
|
|
|
|
|
"Find a named source-code block.
|
|
|
|
|
Return the location of the source block identified by
|
|
|
|
|
#+srcname NAME, or nil if no such block exists. Set match data
|
|
|
|
|
according to org-babel-named-src-block-regexp."
|
|
|
|
|
Return the location of the source block identified by source
|
|
|
|
|
NAME, or nil if no such block exists. Set match data according to
|
|
|
|
|
org-babel-named-src-block-regexp."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((case-fold-search t)
|
|
|
|
|
(regexp (org-babel-named-src-block-regexp-for-name name)) msg)
|
|
|
|
@ -456,15 +609,15 @@ according to org-babel-named-src-block-regexp."
|
|
|
|
|
buffer or nil if no such result exists."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(when (re-search-forward ;; ellow end-of-buffer in following regexp?
|
|
|
|
|
(concat "#\\+resname:[ \t]*" (regexp-quote name) "[ \t\n\f\v\r]") nil t)
|
|
|
|
|
(when (re-search-forward
|
|
|
|
|
(concat org-babel-result-regexp "[ \t]" (regexp-quote name) "[ \t\n\f\v\r]") nil t)
|
|
|
|
|
(move-beginning-of-line 0) (point))))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-where-is-src-block-result (&optional insert info)
|
|
|
|
|
(defun org-babel-where-is-src-block-result (&optional insert info hash)
|
|
|
|
|
"Return the point at the beginning of the result of the current
|
|
|
|
|
source block. Specifically at the beginning of the #+RESNAME:
|
|
|
|
|
line. If no result exists for this block then create a
|
|
|
|
|
#+RESNAME: line following the source block."
|
|
|
|
|
source block. Specifically at the beginning of the results line.
|
|
|
|
|
If no result exists for this block then create a results line
|
|
|
|
|
following the source block."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let* ((on-lob-line (progn (beginning-of-line 1)
|
|
|
|
|
(looking-at org-babel-lob-one-liner-regexp)))
|
|
|
|
@ -478,14 +631,17 @@ line. If no result exists for this block then create a
|
|
|
|
|
(if (eobp) (insert "\n") (forward-char 1))
|
|
|
|
|
(setq end (point))
|
|
|
|
|
(or (and (not name)
|
|
|
|
|
(progn ;; either the unnamed #+resname: line already exists
|
|
|
|
|
(progn ;; unnamed results line already exists
|
|
|
|
|
(re-search-forward "[^ \f\t\n\r\v]" nil t)
|
|
|
|
|
(move-beginning-of-line 1) (looking-at "#\\+resname:\n")))
|
|
|
|
|
;; or (with optional insert) we need to back up and make one ourselves
|
|
|
|
|
(move-beginning-of-line 1)
|
|
|
|
|
(looking-at (concat org-babel-result-regexp "\n"))))
|
|
|
|
|
;; or (with optional insert) back up and make one ourselves
|
|
|
|
|
(when insert
|
|
|
|
|
(goto-char end) (open-line 2) (forward-char 1)
|
|
|
|
|
(insert (concat "#+resname:" (if name (concat " " name)) "\n"))
|
|
|
|
|
(move-beginning-of-line 0) t)))
|
|
|
|
|
(goto-char end) (forward-char 1)
|
|
|
|
|
(insert (concat "#+results" (if hash (concat "["hash"]"))
|
|
|
|
|
":"(if name (concat " " name)) "\n"))
|
|
|
|
|
(move-beginning-of-line 0)
|
|
|
|
|
(if hash (org-babel-hide-hash)) t)))
|
|
|
|
|
(point))))))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-read-result ()
|
|
|
|
@ -505,7 +661,7 @@ line. If no result exists for this block then create a
|
|
|
|
|
(buffer-substring (point) (org-babel-result-end)) "[\r\n]+")
|
|
|
|
|
"\n")))
|
|
|
|
|
(or (org-babel-number-p result-string) result-string))
|
|
|
|
|
((looking-at "^#\\+RESNAME:")
|
|
|
|
|
((looking-at org-babel-result-regexp)
|
|
|
|
|
(save-excursion (forward-line 1) (org-babel-read-result))))))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-read-table ()
|
|
|
|
@ -515,11 +671,11 @@ line. If no result exists for this block then create a
|
|
|
|
|
(mapcar #'org-babel-read row)))
|
|
|
|
|
(org-table-to-lisp)))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-insert-result (result &optional insert info)
|
|
|
|
|
(defun org-babel-insert-result (result &optional result-params info hash)
|
|
|
|
|
"Insert RESULT into the current buffer after the end of the
|
|
|
|
|
current source block. With optional argument INSERT controls
|
|
|
|
|
insertion of results in the org-mode file. INSERT can take the
|
|
|
|
|
following values...
|
|
|
|
|
current source block. With optional argument RESULT-PARAMS
|
|
|
|
|
controls insertion of results in the org-mode file.
|
|
|
|
|
RESULT-PARAMS can take the following values...
|
|
|
|
|
|
|
|
|
|
replace - (default option) insert results after the source block
|
|
|
|
|
replacing any previously inserted results
|
|
|
|
@ -550,45 +706,51 @@ code ---- the results are extracted in the syntax of the source
|
|
|
|
|
(if (stringp result)
|
|
|
|
|
(progn
|
|
|
|
|
(setq result (org-babel-clean-text-properties result))
|
|
|
|
|
(if (member "file" insert) (setq result (org-babel-result-to-file result))))
|
|
|
|
|
(when (member "file" result-params)
|
|
|
|
|
(setq result (org-babel-result-to-file result))))
|
|
|
|
|
(unless (listp result) (setq result (format "%S" result))))
|
|
|
|
|
(if (and insert (member "replace" insert) (not (member "silent" insert)))
|
|
|
|
|
(if (and result-params (member "replace" result-params)
|
|
|
|
|
(not (member "silent" result-params)))
|
|
|
|
|
(org-babel-remove-result info))
|
|
|
|
|
(if (= (length result) 0)
|
|
|
|
|
(if (member "value" result-params)
|
|
|
|
|
(message "No result returned by source block")
|
|
|
|
|
(message "Source block produced no output"))
|
|
|
|
|
(if (and insert (member "silent" insert))
|
|
|
|
|
(progn (message (replace-regexp-in-string "%" "%%" (format "%S" result))) result)
|
|
|
|
|
(if (and result-params (member "silent" result-params))
|
|
|
|
|
(progn (message (replace-regexp-in-string "%" "%%" (format "%S" result)))
|
|
|
|
|
result)
|
|
|
|
|
(when (and (stringp result) ;; ensure results end in a newline
|
|
|
|
|
(not (or (string-equal (substring result -1) "\n")
|
|
|
|
|
(string-equal (substring result -1) "\r"))))
|
|
|
|
|
(setq result (concat result "\n")))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((existing-result (org-babel-where-is-src-block-result t info))
|
|
|
|
|
(let ((existing-result (org-babel-where-is-src-block-result t info hash))
|
|
|
|
|
(results-switches (cdr (assoc :results_switches (third info)))))
|
|
|
|
|
(when existing-result (goto-char existing-result) (forward-line 1))
|
|
|
|
|
(setq results-switches (if results-switches (concat " " results-switches) ""))
|
|
|
|
|
(setq results-switches
|
|
|
|
|
(if results-switches (concat " " results-switches) ""))
|
|
|
|
|
(cond
|
|
|
|
|
;; assume the result is a table if it's not a string
|
|
|
|
|
((not (stringp result))
|
|
|
|
|
(insert (concat (orgtbl-to-orgtbl
|
|
|
|
|
(if (and (listp (car result)) (listp (cdr (car result))))
|
|
|
|
|
(if (and (listp (car result))
|
|
|
|
|
(listp (cdr (car result))))
|
|
|
|
|
result (list result))
|
|
|
|
|
'(:fmt (lambda (cell) (format "%S" cell)))) "\n"))
|
|
|
|
|
(forward-line -1) (org-cycle))
|
|
|
|
|
((member "file" insert)
|
|
|
|
|
((member "file" result-params)
|
|
|
|
|
(insert result))
|
|
|
|
|
((member "html" insert)
|
|
|
|
|
((member "html" result-params)
|
|
|
|
|
(insert (format "#+BEGIN_HTML%s\n%s#+END_HTML\n" results-switches result)))
|
|
|
|
|
((member "latex" insert)
|
|
|
|
|
((member "latex" result-params)
|
|
|
|
|
(insert (format "#+BEGIN_LaTeX%s\n%s#+END_LaTeX\n" results-switches result)))
|
|
|
|
|
((member "code" insert)
|
|
|
|
|
((member "code" result-params)
|
|
|
|
|
(insert (format "#+BEGIN_SRC %s%s\n%s#+END_SRC\n" lang results-switches result)))
|
|
|
|
|
((or (member "raw" insert) (member "org" insert))
|
|
|
|
|
((or (member "raw" result-params) (member "org" result-params))
|
|
|
|
|
(save-excursion (insert result)) (if (org-at-table-p) (org-cycle)))
|
|
|
|
|
(t
|
|
|
|
|
(org-babel-examplize-region (point) (progn (insert result) (point)) results-switches)))))
|
|
|
|
|
(org-babel-examplize-region
|
|
|
|
|
(point) (progn (insert result) (point)) results-switches)))))
|
|
|
|
|
(message "finished"))))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-result-to-org-string (result)
|
|
|
|
@ -599,9 +761,11 @@ relies on `org-babel-insert-result'."
|
|
|
|
|
(defun org-babel-remove-result (&optional info)
|
|
|
|
|
"Remove the result of the current source block."
|
|
|
|
|
(interactive)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (org-babel-where-is-src-block-result t info)) (forward-line 1)
|
|
|
|
|
(delete-region (point) (org-babel-result-end))))
|
|
|
|
|
(let ((location (org-babel-where-is-src-block-result nil info)) start)
|
|
|
|
|
(when location
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char location) (setq start (point)) (forward-line 1)
|
|
|
|
|
(delete-region start (org-babel-result-end))))))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-result-end ()
|
|
|
|
|
"Return the point at the end of the current set of results"
|
|
|
|
@ -639,10 +803,7 @@ non-nil."
|
|
|
|
|
(line-number-at-pos beg)))))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(cond ((= size 0)
|
|
|
|
|
(error "This should be impossible: a newline was appended to result if missing")
|
|
|
|
|
(let ((result (buffer-substring beg end)))
|
|
|
|
|
(delete-region beg end)
|
|
|
|
|
(insert (concat ": " result))))
|
|
|
|
|
(error "This should be impossible: a newline was appended to result if missing"))
|
|
|
|
|
((< size org-babel-min-lines-for-block-output)
|
|
|
|
|
(goto-char beg)
|
|
|
|
|
(dotimes (n size)
|
|
|
|
@ -666,7 +827,7 @@ parameters when merging lists."
|
|
|
|
|
("output" "value")))
|
|
|
|
|
(exports-exclusive-groups
|
|
|
|
|
'(("code" "results" "both" "none")))
|
|
|
|
|
params results exports tangle vars var ref)
|
|
|
|
|
params results exports tangle cache vars var ref)
|
|
|
|
|
(flet ((e-merge (exclusive-groups &rest result-params)
|
|
|
|
|
;; maintain exclusivity of mutually exclusive parameters
|
|
|
|
|
(let (output)
|
|
|
|
@ -707,16 +868,18 @@ parameters when merging lists."
|
|
|
|
|
(:tangle
|
|
|
|
|
(setq tangle (e-merge '(("yes" "no"))
|
|
|
|
|
tangle (split-string (cdr pair)))))
|
|
|
|
|
(:cache (setq cache t)) (:nocache (setq cache nil))
|
|
|
|
|
(t ;; replace: this covers e.g. :session
|
|
|
|
|
(setq params (cons pair (assq-delete-all (car pair) params))))))
|
|
|
|
|
plist))
|
|
|
|
|
plists))
|
|
|
|
|
(setq vars (mapcar (lambda (pair) (format "%s=%s" (car pair) (cdr pair))) vars))
|
|
|
|
|
(while vars (setq params (cons (cons :var (pop vars)) params)))
|
|
|
|
|
(cons (cons :tangle (mapconcat 'identity tangle " "))
|
|
|
|
|
(cons (cons :exports (mapconcat 'identity exports " "))
|
|
|
|
|
(cons (cons :results (mapconcat 'identity results " "))
|
|
|
|
|
params)))))
|
|
|
|
|
(cons (if cache (list :cache) (list :nocache))
|
|
|
|
|
(cons (cons :tangle (mapconcat 'identity tangle " "))
|
|
|
|
|
(cons (cons :exports (mapconcat 'identity exports " "))
|
|
|
|
|
(cons (cons :results (mapconcat 'identity results " "))
|
|
|
|
|
params))))))
|
|
|
|
|
|
|
|
|
|
(defun org-babel-expand-noweb-references (&optional info parent-buffer)
|
|
|
|
|
"This function expands Noweb style references in the body of
|
|
|
|
|