From 749fd5ade6b65f9d07e87b4af44ebb1afef2bee6 Mon Sep 17 00:00:00 2001 From: Matt Huszagh Date: Tue, 29 Sep 2020 14:11:59 -0700 Subject: [PATCH] list/ob-core.el: Allow passing empty vector to :file-desc to omit description * doc/org-manual.org (Type): Document empty vector argument for file-desc. * etc/ORG-NEWS (New argument for ~file-desc~ babel header): Add entry to NEWS. * lisp/ob-core.el (org-babel--file-desc): Add new function to evaluate file description value. (org-babel-execute-src-block): Correctly evaluate file description when executing src block. (org-babel-insert-result): Correctly evaluate file description value when inserting the result of src block execution into the buffer. * testing/lisp/test-ob.el (test-ob/file-desc-header-argument): Add test case for new behavior. --- doc/org-manual.org | 8 +++++--- etc/ORG-NEWS | 13 ++++++++++++- lisp/ob-core.el | 16 +++++++++++----- testing/lisp/test-ob.el | 20 +++++++++++++++++++- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index e7d25b90e..a790f3225 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -17482,10 +17482,12 @@ default behavior is to automatically determine the result type. #+end_example #+cindex: @samp{file-desc}, header argument - The =file-desc= header argument defines the description (see - [[*Link Format]]) for the link. If =file-desc= is present but has no value, + The =file-desc= header argument defines the description (see [[*Link + Format]]) for the link. If =file-desc= is present but has no value, the =file= value is used as the link description. When this - argument is not present, the description is omitted. + argument is not present, the description is omitted. If you want to + provide the =file-disc= argument but omit the description, you can + provide it with an empty vector (i.e., :file-desc []). #+cindex: @samp{sep}, header argument By default, Org assumes that a table written to a file has diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 5dc68cba4..19f6af288 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -24,8 +24,19 @@ Earlier, IDs generated using =ts= method had a hard-coded format (i.e. =20200923 The new option allows user to customise the format. Defaults are unchanged. +*** New argument for ~file-desc~ babel header + +It is now possible to provide the =file-desc= header argument for a +babel source block but omit the description by passing an empty vector +as an argument (i.e., :file-desc []). This can be useful because +providing =file-desc= without an argument results in the result of +=file= being used in the description. Previously, the only way to +omit a file description was to omit the header argument entirely, +which made it difficult/impossible to provide a default value for +=file-desc=. + ** New features -*** =ob-python= improvements to =:return= header argument +*** =ob-python= improvements to =:return= header argument The =:return= header argument in =ob-python= now works for session blocks as well as non-session blocks. Also, it now works with the diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 7300f239e..075e3f928 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -646,6 +646,14 @@ a list with the following pattern: (replace-regexp-in-string (org-src-coderef-regexp coderef) "" expand nil nil 1)))) +(defun org-babel--file-desc (params result) + "Retrieve file description." + (pcase (assq :file-desc params) + (`nil nil) + (`(:file-desc) result) + (`(:file-desc . ,(and (pred stringp) val)) val) + (`(:file-desc . []) nil))) + ;;;###autoload (defun org-babel-execute-src-block (&optional arg info params) "Execute the current source code block. @@ -749,8 +757,7 @@ block." (let ((*this* (if (not file) result (org-babel-result-to-file file - (let ((desc (assq :file-desc params))) - (and desc (or (cdr desc) result))))))) + (org-babel--file-desc params result))))) (setq result (org-babel-ref-resolve post)) (when file (setq result-params (remove "file" result-params)))))) @@ -2257,9 +2264,8 @@ INFO may provide the values of these header arguments (in the (setq result (org-no-properties result)) (when (member "file" result-params) (setq result (org-babel-result-to-file - result (when (assq :file-desc (nth 2 info)) - (or (cdr (assq :file-desc (nth 2 info))) - result)))))) + result + (org-babel--file-desc (nth 2 info) result))))) ((listp result)) (t (setq result (format "%S" result)))) (if (and result-params (member "silent" result-params)) diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el index 648e9c115..df4b13498 100644 --- a/testing/lisp/test-ob.el +++ b/testing/lisp/test-ob.el @@ -1084,7 +1084,25 @@ trying to find the :END: marker." (org-babel-execute-src-block) (goto-char (point-min)) (should (search-forward "[[file:foo][bar]]" nil t)) - (should (search-forward "[[file:foo][foo]]" nil t)))) + (should (search-forward "[[file:foo][foo]]" nil t))) + (should (string-match-p + (regexp-quote "[[file:foo]]") + (org-test-with-temp-text " +#+begin_src emacs-lisp :results file :file-desc [] + \"foo\" +#+end_src" + (org-babel-next-src-block) + (org-babel-execute-src-block) + (buffer-substring-no-properties (point-min) (point-max))))) + (should (string-match-p + (regexp-quote "[[file:foo][foo]]") + (org-test-with-temp-text " +#+begin_src emacs-lisp :results file :file-desc + \"foo\" +#+end_src" + (org-babel-next-src-block) + (org-babel-execute-src-block) + (buffer-substring-no-properties (point-min) (point-max)))))) (ert-deftest test-ob/result-file-link-type-header-argument () "Ensure that the result is a link to a file. -- 2.28.0