Hi, Reza, Reza Housseini <[email protected]> writes: > I tried the following > > #+NAME: my-table > #+BEGIN: clocktable :scope file :maxlevel 2 > #+END: > > #+begin_src python :var data=my-table > print(data) > #+end_src > > but the evaluation fails with the error > > Reference not found > > Why is this not working, is this intentional or a bug?
I'd guess that it's just a missing feature. Babel actually does find my-table, it just doesn't know how it's supposed to read a dynamic block. I think it's reasonable to expect named dynamic blocks to be supported as Babel references. I submit a patch with one way to solve it: Get org-babel-ref-resolve to check if we're at a dynamic block. If so, update it, then move one line forward and resolve the first element in the content of the dynamic block instead. Then the existing machinery of org-babel-ref-resolve and org-babel-read-element can handle it depending on whether it's a table, a paragraph with a time stamp, a list, or something else. A couple of what-could-possibly-go-wrongs I'm unsure about: - It seems like a good idea that Babel should update a dynamic block before reading it, so I have made it so here. This will however change contents elsewhere in the buffer while executing a src block, and with remote references it may open a file and and leave the buffer open with changed contents. Is this acceptable behavior? Or should it be made optional, and what should be the default? - This implies a fun metaprogramming side effect: we can also read /and/ execute src blocks written by dynamic blocks. Regards, Christian
>From 474c0f990677ebdad997b58bb6911189dbcdb93d Mon Sep 17 00:00:00 2001 From: Christian Moe <[email protected]> Date: Sat, 14 Mar 2026 14:00:39 +0100 Subject: [PATCH] ob-ref.el: Support reading dynamic blocks into Babel * lisp/ob-ref.el (org-babel-ref-resolve): Check if the reference is a dynamic block. If so, update it and read the first element of the content instead. * doc/org-manual.org (Passing arguments): Mention support for dynamic blocks. This adds support for reading a named dynamic block like a clocktable or columnview via the `:var' header. Previously, references to such blocks failed with "Reference not found". Reported-by: Reza Housseini <[email protected]> Link: https://list.orgmode.org/[email protected] --- doc/org-manual.org | 8 ++++++++ lisp/ob-ref.el | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/doc/org-manual.org b/doc/org-manual.org index 904e1270d..0dfdb6c1e 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -18666,6 +18666,14 @@ a colon, for example: =:var table=other-file.org:example-table=. : on two lines for you. #+end_example +- dynamic block :: + + A dynamic block, such as a columnview or a clocktable, named with a + =NAME= keyword. The block is updated before the contents are read. + Depending on how the dynamic block writes content, e.g. as a table + or a list, the content is read accordingly, as described in the + examples above. + Indexing variable values enables referencing portions of a variable. Indexes are 0 based with negative values counting backwards from the end. If an index is separated by commas then each subsequent section diff --git a/lisp/ob-ref.el b/lisp/ob-ref.el index 14c5ce4a9..29d23e4f0 100644 --- a/lisp/ob-ref.el +++ b/lisp/ob-ref.el @@ -174,6 +174,11 @@ Emacs Lisp representation of the value of the variable." (when (equal (org-element-property :name e) ref) (goto-char (org-element-post-affiliated e)) + ;; Dynamic blocks resolve to content element + (when (eq (org-element-type e) 'dynamic-block) + (org-update-dblock) + (forward-line) + (setq e (org-element-at-point))) (pcase (org-element-type e) (`babel-call (throw :found -- 2.43.0
