Say I am using org-babel to tangle code blocks from an org document. I have several blocks with random code in them.

My goal is to dynamically tangle (or not) individual blocks following a condition, for example, contents of first line of block, text in above heading, tag in heading, etc.

More generally, I want to pass the same defun as an argument to :tangle in the header arguments of all code blocks, avoiding the use of heading or buffer properties. Similarly, I try to avoid setting the same identical form in all my code blocks. Instead, I try to define a default header argument to be set programatically, or similar in the example

*  First                  :maybe:

#+begin_src emacs-lisp
  ;; First : not to be tangled


* Second                  :no:

#+begin_src emacs-lisp
  ;; Second : not to be tangled

  ;; This code doesn't do it but it should !!
  (setq-local org-babel-default-header-args
          (cons `(:tangle . ,(test))
              (assq-delete-all :tangle org-babel-default-header-args)))

* Third                   :yes:

#+begin_src emacs-lisp
  ;; Third : this code is to be tangled

  (defun test ()
    (if (let ((mytags (org-get-tags-at (point) t)))
          (or (member "yes" mytags)
              (null mytags)))
        (format "%s.el" (file-name-base
                         (buffer-file-name))) "no"))

So my question is, is it possible to assign a function to the :tangle (or :prologue) header arguments in org-babel code blocks without using properties or explicitly put the form in all code blocks ?

  • I'm not sure what you mean, you can, for example, do something like that: #+BEGIN_SRC language :tangle (when condition "file.name"). Or, if you do not want to specify filename, you can do #+BEGIN_SRC language :tangle (when condition "no") or #+BEGIN_SRC language :tangle (when condition "yes") – theldoria Aug 10 '16 at 20:20
  • Edited. Sure, I could, but my goal is avoiding adding the same boring :tangle (defun) in all my code blocks; instead, I need to act on org-babel-default-header-args or similar. – csantosb Aug 10 '16 at 20:37
  • You can use property syntax to add that to all subtrees orgmode.org/manual/Header-arguments-in-Org-mode-properties.html – ibizaman May 31 '18 at 18:07
  • @ibizaman Recommending using the #+PROPERTY: syntax in order to affect all subtrees is almost equivalent to recommend setting buffer properties which OP explicitly stated that he wants to doing that. I think that what he wants to do is to set the header arguments through the variable org-babel-default-header-args so that all code blocks in all files (i.e. non-buffer specific) are affected by that setting. – jio210 Oct 17 at 17:45
  • @jio210 you are correct, I don't know how I missed that. – ibizaman Oct 21 at 6:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.