Leo Alekseyev <dnqu...@gmail.com> writes: > Suppose I have a code block foo, and I want to call it several times > in my org file. However, foo may be a slow function, and so any time > I evaluate buffer non-interactively (e.g. HTML export) I want to > enable only one out of many calls to :foo > > The following doesn't work, but I think it should, since the #+call: > line should run foo with the header argument :eval no-export > > #+NAME: foo > #+BEGIN_SRC R :var turn_on_output="FALSE" > if(turn_on_output) { X11() } > #+END_SRC > > #+CALL: foo[:eval no-export](turn_on_output="TRUE") ## this STILL > evaluates on export >
Thanks for sharing this example. It indicated two bugs in the existing code base. I've just pushed up fixes for both bugs, the attached Org-mode file can be used to confirm that this is now working.
#+Title: foo A buffer in which we want =foo= to be run when called interactively from /any/ call line, but to only be run by a single call line on export. Ensure this works by executing this buffer to html while tracking =foo-called.times= with =tail -f /tmp/foo-called.times=. #+NAME: foo #+BEGIN_SRC sh :var id="foo" echo "called by $id at $(date +%s.%N)" |tee -a /tmp/foo-called.times #+END_SRC This will *not* be run on export. #+call: foo[:eval no-export]("bar") This *will* be run on export. #+call: foo("baz")
> > Furthermore, a better solution to the situation I described above > might be to set the :eval no-export header argument in the source > block definition, and then over-ride it in the one #+call line that I > want to run during export. Unfortunately, it doesn't seem that this > is currently possible. > The reason this second option doesn't work is that there is currently no positive argument to the :eval header argument, rather it can only be used to *inhibit* evaluation. Cheers, > > --Leo > -- Eric Schulte http://cs.unm.edu/~eschulte/