diff --git a/doc/org.texi b/doc/org.texi index 9bf5a9e2d..baa0dca0c 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -13112,14 +13112,23 @@ permissions of the tangled file are set to make it executable. @node eval, , shebang, Specific header arguments @subsubsection @code{:eval} The @code{:eval} header argument can be used to limit the evaluation of -specific code blocks. @code{:eval} accepts three arguments ``never'', -``query'' and ``non-export''. @code{:eval never} (or @code{:eval no}) will -ensure that a code block is never evaluated, this can be useful for -protecting against the evaluation of dangerous code blocks. @code{:eval -query} will require a query for every execution of a code block regardless of -the value of the @code{org-confirm-babel-evaluate} variable and @code{:eval -non-export} will inhibit the evaluation of code blocks during export but will -still allow interactive evaluation. +specific code blocks. The @code{:eval} header argument can be useful for +protecting against the evaluation of dangerous code blocks or to ensure that +evaluation will require a query regardless of the value of the +@code{org-confirm-babel-evaluate} variable. The possible values of +@code{:eval} and their effects are shown below. + +@table @code +@item never or no +The code block will not be evaluated under any circumstances. +@item query +Evaluation of the code block will require a query. +@item never-export or no-export +The code block will not be evaluated during export but may still be called +interactively. +@item query-export +Evaluation of the code block during export will require a query. +@end table If this header argument is not set then evaluation is determined by the value of the @code{org-confirm-babel-evaluate} variable see @ref{Code evaluation diff --git a/lisp/ob.el b/lisp/ob.el index 710b1d108..fd4f81a5c 100644 --- a/lisp/ob.el +++ b/lisp/ob.el @@ -252,12 +252,15 @@ of potentially harmful code." (let* ((eval (or (cdr (assoc :eval (nth 2 info))) (when (assoc :noeval (nth 2 info)) "no"))) (query (cond ((equal eval "query") t) + ((and org-current-export-file + (equal eval "query-export")) t) ((functionp org-confirm-babel-evaluate) (funcall org-confirm-babel-evaluate (nth 0 info) (nth 1 info))) (t org-confirm-babel-evaluate)))) (if (or (equal eval "never") (equal eval "no") - (and (equal eval "non-export") org-current-export-file) + (and org-current-export-file (or (equal eval "no-export") + (equal eval "never-export"))) (and query (not (yes-or-no-p (format "Evaluate this%scode block%son your system? " @@ -266,7 +269,8 @@ of potentially harmful code." (format " (%s) " (nth 4 info)) " ")))))) (prog1 nil (message "Evaluation %s" (if (or (equal eval "never") (equal eval "no") - (equal eval "non-export")) + (equal eval "no-export") + (equal eval "never-export")) "Disabled" "Aborted"))) t))) diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el index de66a9768..5d673c404 100644 --- a/testing/lisp/test-ob.el +++ b/testing/lisp/test-ob.el @@ -531,6 +531,27 @@ on two lines (forward-line 6) (should (looking-at ": 2"))))) +(ert-deftest test-ob/eval-header-argument () + (flet ((check-eval (eval runp) + (org-test-with-temp-text (format "#+begin_src emacs-lisp :eval %s + (setq foo :evald) +#+end_src" eval) + (let ((foo :not-run)) + (if runp + (progn (should (org-babel-execute-src-block)) + (should (eq foo :evald))) + (progn (should-not (org-babel-execute-src-block)) + (should-not (eq foo :evald)))))))) + (check-eval "never" nil) + (check-eval "no" nil) + (check-eval "never-export" t) + (check-eval "no-export" t) + (let ((org-current-export-file "something")) + (check-eval "never" nil) + (check-eval "no" nil) + (check-eval "never-export" nil) + (check-eval "no-export" nil)))) + (provide 'test-ob) ;;; test-ob ends here