ob-core.el: Add ability to use closures as default header arguments

* lisp/ob-core.el (org-babel-default-header-args): Document ability to
use functions.
(eval-default-headers): New function to generate default header
arguments, which adds the ability to evaluate function arguments at
runtime.
(org-babel-get-src-block-info): Use new header argument evaluate
function when retreiving src block info.

* lisp/ob-exp.el (org-babel-exp-src-block): Must use new
eval-default-headers when exporting as well.

The closures are evaluated at runtime.
This commit is contained in:
Matt Huszagh 2020-08-28 11:05:59 -07:00 committed by Bastien
parent 1c83f6fa02
commit 78783f4e47
2 changed files with 31 additions and 3 deletions

View File

@ -472,7 +472,23 @@ For the format of SAFE-LIST, see `org-babel-safe-header-args'."
(defvar org-babel-default-header-args
'((:session . "none") (:results . "replace") (:exports . "code")
(:cache . "no") (:noweb . "no") (:hlines . "no") (:tangle . "no"))
"Default arguments to use when evaluating a source block.")
"Default arguments to use when evaluating a source block.
This is a list in which each element is an alist. Each key
corresponds to a header argument, and each value to that header's
value. The value can either be a string or a closure that
evaluates to a string at runtime. For instance, imagine you'd
like to set the file name output of a latex source block to a
sha1 of its contents. We could achieve this with:
(defun org-src-sha ()
(let ((elem (org-element-at-point)))
(concat (sha1 (org-element-property :value elem)) \".svg\")))
(setq org-babel-default-header-args:latex
`((:results . \"file link replace\")
(:file . (lambda () (org-src-sha)))))")
(put 'org-babel-default-header-args 'safe-local-variable
(org-babel-header-args-safe-fn org-babel-safe-header-args))
@ -583,6 +599,18 @@ the outer-most code block.")
(defvar *this*)
(defun eval-default-headers (headers)
"Compute default header list set with HEADERS.
Evaluate all default header arguments set to functions prior to
returning the list of header arguments."
(let ((lst nil))
(dolist (elem (eval headers t))
(if (listp (cdr elem))
(push `(,(car elem) . ,(funcall (cdr elem))) lst)
(push elem lst)))
lst))
(defun org-babel-get-src-block-info (&optional light datum)
"Extract information from a source block or inline source block.
@ -614,7 +642,7 @@ a list with the following pattern:
(apply #'org-babel-merge-params
(if inline org-babel-default-inline-header-args
org-babel-default-header-args)
(and (boundp lang-headers) (eval lang-headers t))
(and (boundp lang-headers) (eval-default-headers lang-headers))
(append
;; If DATUM is provided, make sure we get node
;; properties applicable to its location within

View File

@ -104,7 +104,7 @@ Assume point is at block opening line."
(apply #'org-babel-merge-params
org-babel-default-header-args
(and (boundp lang-headers)
(symbol-value lang-headers))
(eval-default-headers lang-headers))
(append (org-babel-params-from-properties lang)
(list raw-params)))))))
(setf hash (org-babel-sha1-hash info :export)))