emacs-orgmode
[Top][All Lists]
Advanced

[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

reply via email to

[Prev in Thread] Current Thread [Next in Thread]