[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[O] [PATCH] Add :eval only-manual to babel blocks
From: |
Ken Mankoff |
Subject: |
[O] [PATCH] Add :eval only-manual to babel blocks |
Date: |
Mon, 14 Oct 2019 09:10:01 +0200 |
User-agent: |
mu4e 0.9.18; emacs 26.3 |
With this patch and ":eval only-manual" in a babel header,
Org evaluates the source code if it is run via ~org-ctrl-c-ctrl-c~ (e.g. =C-c
C-c= in the babel block), but not if run via the ~org-babel-execute-buffer~
function.
This is my first contribution to Org core. I've signed FSF papers.
-k.
diff --git a/doc/org-manual.org b/doc/org-manual.org
index 59591894d..aa72c642c 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -17051,6 +17051,12 @@ evaluating untrusted code blocks by prompting for a
confirmation.
Org does not evaluate the source code when exporting, yet the user
can evaluate it interactively.
+- =only-manual= ::
+
+ Org evaluates the source code if it is run via ~org-ctrl-c-ctrl-c~
+ (e.g. =C-c C-c= in the babel block), but not if run via the
+ ~org-babel-execute-buffer~ function.
+
- =query-export= ::
Org prompts the user for permission to evaluate the source code
diff --git a/lisp/ob-core.el b/lisp/ob-core.el
index 572f97919..15fadadf0 100644
--- a/lisp/ob-core.el
+++ b/lisp/ob-core.el
@@ -228,7 +228,9 @@ should be asked whether to allow evaluation."
(let* ((headers (nth 2 info))
(eval (or (cdr (assq :eval headers))
(when (assq :noeval headers) "no")))
- (eval-no (member eval '("no" "never")))
+ (manual (and (not (eq nil (member 'org-ctrl-c-ctrl-c
(org--function-stack))))
+ (not (eq nil (member eval '("only-manual"))))))
+ (eval-no (member eval '("no" "never" "only-manual")))
(export org-babel-exp-reference-buffer)
(eval-no-export (and export (member eval '("no-export"
"never-export"))))
(noeval (or eval-no eval-no-export))
@@ -240,10 +242,24 @@ should be asked whether to allow evaluation."
(nth 0 info) (nth 1 info))
org-confirm-babel-evaluate))))
(cond
+ (manual t)
(noeval nil)
(query 'query)
(t t))))
+(defun org--function-stack ()
+ "Return the current call stack function names."
+ ;; https://emacs.stackexchange.com/questions/7396/
+ (butlast (mapcar 'cl-second
+ (let ((frames)
+ (frame)
+ (index 5))
+ (while (setq frame (backtrace-frame index))
+ (push frame frames)
+ (incf index))
+ (remove-if-not 'car frames)))))
+
+
(defun org-babel-check-evaluate (info)
"Check if code block INFO should be evaluated.
Do not query the user, but do display an informative message if
- [O] [PATCH] Add :eval only-manual to babel blocks,
Ken Mankoff <=