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

Reply via email to