From c262579e8f1ef9ffecfc8e051fd5ea2539b4525e Mon Sep 17 00:00:00 2001 Message-Id: From: Ihor Radchenko Date: Tue, 22 Nov 2022 10:06:24 +0800 Subject: [PATCH v2] org-babel: Add new :results discard header argument * lisp/ob-core.el (org-babel-result-cond): Unconditionally return nil and suppress all the processing for :results discard. (org-babel-common-header-args-w-values): (org-babel-sha1-hash): Add the new value to know :results value list. * doc/org-manual.org (Handling): * etc/ORG-NEWS (New =:results discard= header argument): Document the new value. Reported-by: Daniel Ortmann Link: https://orgmode.org/list/87tu2tjary.fsf@localhost --- doc/org-manual.org | 8 ++++++++ etc/ORG-NEWS | 8 ++++++++ lisp/ob-core.el | 43 ++++++++++++++++++++++--------------------- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index 760c1ee86..67b8b4dee 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -18487,6 +18487,14 @@ *** Handling can still be used when referenced from another code block. Usage example: =:results none=. +- =discard= :: + + Ignore the results completely. This option is similar to =none=, + but no processing is performed on the return value. Calling the + code block programatically (see [[*How to evaluate source code]]) or by + reference (see [[*Passing arguments]] and [[*Noweb Reference Syntax]]) will + always yield nil. + - =append= :: Append results to the Org buffer. Latest results are at the bottom. diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 63ff5d749..fd569106a 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -373,6 +373,14 @@ value of ~org-babel-clojure-backend~. For example: (range 2) #+end_src +*** New =:results discard= header argument + +Unlike =:results none=, the return value of code blocks called with +=:results discard= header argument is always ~nil~. Org does not +attempt to analyze the results and simply returns nil. This can be +useful when the code block is used for side effects only but generates +large outputs that may be slow to analyze for Org. + ** New options *** A new option for custom setting ~org-refile-use-outline-path~ to show document title in refile targets diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 3a07c10d5..5f679a5e9 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -425,7 +425,7 @@ (defconst org-babel-common-header-args-w-values (prologue . :any) (results . ((file list vector table scalar verbatim) (raw html latex org code pp drawer link graphics) - (replace silent none append prepend) + (replace silent none discard append prepend) (output value))) (rownames . ((no yes))) (sep . :any) @@ -1345,7 +1345,7 @@ (defun org-babel-sha1-hash (&optional info context) (lambda (a b) (string< (car a) (car b))))) (let* ((rm (lambda (lst) (dolist (p '("replace" "silent" "none" - "append" "prepend")) + "discard" "append" "prepend")) (setq lst (remove p lst))) lst)) (norm (lambda (arg) @@ -1353,8 +1353,8 @@ (defun org-babel-sha1-hash (&optional info context) (copy-sequence (cdr arg)) (cdr arg)))) (when (and v (not (and (sequencep v) - (not (consp v)) - (= (length v) 0)))) + (not (consp v)) + (= (length v) 0)))) (cond ((and (listp v) ; lists are sorted (member (car arg) '(:result-params))) @@ -1382,10 +1382,10 @@ (defun org-babel-sha1-hash (&optional info context) (mapconcat #'identity (delq nil (mapcar (lambda (arg) - (let ((normalized (funcall norm arg))) - (when normalized - (format "%S" normalized)))) - (nth 2 info))) ":") + (let ((normalized (funcall norm arg))) + (when normalized + (format "%S" normalized)))) + (nth 2 info))) ":") expanded)) (hash (sha1 it))) (when (called-interactively-p 'interactive) (message hash)) @@ -3289,19 +3289,20 @@ (defmacro org-babel-result-cond (result-params scalar-form &rest table-forms) (declare (indent 1) (debug t)) (org-with-gensyms (params) `(let ((,params ,result-params)) - (if (or (member "scalar" ,params) - (member "verbatim" ,params) - (member "html" ,params) - (member "code" ,params) - (member "pp" ,params) - (member "file" ,params) - (and (or (member "output" ,params) - (member "raw" ,params) - (member "org" ,params) - (member "drawer" ,params)) - (not (member "table" ,params)))) - ,scalar-form - ,@table-forms)))) + (unless (member "discard" ,params) + (if (or (member "scalar" ,params) + (member "verbatim" ,params) + (member "html" ,params) + (member "code" ,params) + (member "pp" ,params) + (member "file" ,params) + (and (or (member "output" ,params) + (member "raw" ,params) + (member "org" ,params) + (member "drawer" ,params)) + (not (member "table" ,params)))) + ,scalar-form + ,@table-forms))))) (defmacro org-babel-temp-directory () "Return temporary directory suitable for `default-directory'." -- 2.35.1