diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 4ca103dc8..b782d871d 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -286,29 +286,36 @@ Returns a list (defvar org-current-export-file) ; dynamically bound (defmacro org-babel-check-confirm-evaluate (info &rest body) - "Pull some information from code block INFO and evaluate BODY." + "Evaluate BODY with special execution confirmation variables set. + +Specifically; NOEVAL will indicate if evaluation is allowed, +QUERY will indicate if a user query is required, CODE-BLOCK will +hold the language of the code block, and BLOCK-NAME will hold the +name of the code block." (declare (indent defun)) - `(let* ((info0th (nth 0 ,info)) - (info1st (nth 1 ,info)) - (info2nd (nth 2 ,info)) - (info4th (nth 4 ,info)) - (eval (or (cdr (assoc :eval info2nd)) - (when (assoc :noeval info2nd) "no"))) - (eval-no (or (equal eval "no") - (equal eval "never"))) - (export (org-bound-and-true-p org-current-export-file)) - (eval-no-export (and export (or (equal eval "no-export") - (equal eval "never-export")))) - (noeval (or eval-no eval-no-export)) - (query (or (equal eval "query") - (and export (equal eval "query-export")) - (when (functionp org-confirm-babel-evaluate) - (funcall org-confirm-babel-evaluate - info0th info1st)) - org-confirm-babel-evaluate)) - (code-block (if info (format " %s " info0th) " ")) - (block-name (if info4th (format " (%s) " info4th) " "))) - ,@body)) + (org-with-gensyms + (lang block-body headers name eval eval-no export eval-no-export) + `(let* ((,lang (nth 0 ,info)) + (,block-body (nth 1 ,info)) + (,headers (nth 2 ,info)) + (,name (nth 4 ,info)) + (,eval (or (cdr (assoc :eval ,headers)) + (when (assoc :noeval ,headers) "no"))) + (,eval-no (or (equal ,eval "no") + (equal ,eval "never"))) + (,export (org-bound-and-true-p org-current-export-file)) + (,eval-no-export (and ,export (or (equal ,eval "no-export") + (equal ,eval "never-export")))) + (noeval (or ,eval-no ,eval-no-export)) + (query (or (equal ,eval "query") + (and ,export (equal ,eval "query-export")) + (when (functionp org-confirm-babel-evaluate) + (funcall org-confirm-babel-evaluate + ,lang ,block-body)) + org-confirm-babel-evaluate)) + (code-block (if ,info (format " %s " ,lang) " ")) + (block-name (if ,name (format " (%s) " ,name) " "))) + ,@body))) (defsubst org-babel-check-evaluate (info) "Check if code block INFO should be evaluated.