Org babel print elisp variable - emacs

Using org, I'd like to execute Lisp code which prints the value of a variable into a results block. E.g. I'm trying to print the value of org-babel-default-header-args.
I've tried this:
#+BEGIN_SRC elisp :exports both
(print 'org-babel-default-header-args)
#+END_SRC
#+BEGIN_SRC elisp :exports both
(org-babel-default-header-args)
#+END_SRC
#+BEGIN_SRC elisp :exports both
(symbol-value 'org-babel-default-header-args)
#+END_SRC
The closest thing I've gotten to work is this:
#+BEGIN_SRC elisp :exports both
(describe-variable 'org-babel-default-header-args)
#+END_SRC
But that prints out some extra text. I'd like to literally just print the value of the variable.

To print the value of a variable foo, use
(print foo)
without quoting it. Quote inhibits evaluation: that's exactly what you don't want to do here.

Related

What can cause org-auto-tangle to result nil for all noweb code block evaluations

I'm using literate programming for some configuration files and would like to have some parts from elisp code block evaluations. I tried evaluating named code blocks with :noweb tangle but they always results nil and I do not see any errors in the *Messages*. Here's a simplified hello world example and the results I got.
Org file
#+title: Hello
#+PROPERTY: header-args :tangle hello.txt :cache no :exports none
#+auto_tangle: t
#+name: hello-world-output
#+begin_src emacs-lisp :tangle no :eval no-export :results output
(print "Hello world")
#+end_src
#+name: hello-world-value
#+begin_src emacs-lisp :tangle no :eval no-export :results value
"Hello world"
#+end_src
#+begin_src text :noweb tangle
<<hello-world-output>> -> <<hello-world-output()>>
<<hello-world-value>> -> <<hello-world-value()>>
#+end_src
Tangled results
(print "Hello world") -> nil
"Hello world" -> nil
I also checked that org-link-elisp-confirm-function and org-confirm-babel-evaluate both have nil value, so they should not be preventing evaluation.
EDIT: I forgot to mention that I used org-auto-tangle. Issue doesn't occur when calling org-bable-tangle directly.
I had the same issue and below solved it for me.
According to the code of org-auto-tangle the code will not be evaluated by default. In order to have the code auto evaluated you need to add your org file to the org-auto-tangle-babel-safelist. I've posted the definition of the variable and a link to the README with an example of how to set the variable.
(defvar org-auto-tangle-babel-safelist '()
"List of full path of files for which code blocks need to be evaluated.
By default, code blocks are not evaluated during the auto-tangle to avoid
possible code execution from unstrusted source. To enable code blocks evaluation
for a specific file, add its full path to this list.")
https://github.com/yilkalargaw/org-auto-tangle#babel-auto-tangle-safelist

Remove the suffix of a returned filename

I set the yasnippet of elisp src as
#+begin_src emacs-lisp :session `(current-buffer)` :lexical t
$0
#+end_src
Which set the current-buffer as session name
#+begin_src emacs-lisp :current-file-name sicp :lexical t
(current-buffer)
#+end_src
#+RESULTS:
: #<buffer yasnippet-offprint.org>
A minor problem is to remove suffix org from yasnippet-offprint.org.
This might be trivial, but search the elisp manual, thus did not got an immediate solution.
How could remove the suffix the yasnippet-offprint.org
The result I desire is
#+begin_src emacs-lisp :session yasnippet-offprint :lexical t
#+end_src
You can use file-name-sans-extension, e.g.,
(file-name-sans-extension "yasnippet-offprint.org")
;; => "yasnippet-offprint"
You can use C-h f (M-x describe-function) to read its docstring. And (info "(elisp) File Name Components") lists functions on manipulating filenames.

emacs org-babel results unexpected output

I'm using emacs 25.2.1 with spacemacs and scimax and trying to create a jupyter-like notebook. After some experimenting, I'm confused by the output I get from the :results output tag from the final src block:
#+name: OOP
#+BEGIN_SRC elisp :results silent :session OOP
(pyvenv-activate "~/Desktop/py2_venv")
#+END_SRC
#+BEGIN_SRC ipython :session OOP :results silent
class Dog():
def __init__(self, breed, name, spots):
self.breed = breed
self.name = name
#expect boolean true/false
self.spots = spots
#+END_SRC
#+BEGIN_SRC ipython :session OOP :results output
my_dog = Dog(breed='lab', name='Sammy', spots='False')
print(type(my_dog))
print(my_dog.breed)
my_dog.name
my_dog.spots
#+END_SRC
#+RESULTS:
**:RESULTS:
# Out[23]:
# output
<class '__main__.Dog'>
lab
# text/plain
: 'False'**
:END:
It's my understanding that all output should be displayed with the output option in session mode. Additionally I shouldn't need to use print(). I'm confused why my_dog.name is missing from output, but my_dog.spots is not. Any ideas what I'm missing?
:results output gives back the stdin, which will be the print output.
If you use :results value or :results value raw you will receive the last evaluation and not the side effect :
#+BEGIN_SRC ipython :session OOP :results value
my_dog = Dog(breed='lab', name='Sammy', spots='False')
print(type(my_dog))
print(my_dog.breed)
my_dog.name
my_dog.spots
#+END_SRC
In order to get both evaluations you will need to type a bit more python.
Have a look at :
https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-python.html
also the following answer in Emacs SE:
https://emacs.stackexchange.com/a/45121/17548

Any way to make org-babel properly indent noweb tangled code?

Tangling this:
#+BEGIN_SRC C :tangle no :noweb-ref begin
int main() {
printf("Line 1\n");
#+END_SRC
#+BEGIN_SRC C :tangle no :noweb-ref middle
printf("Second\n");
#+END_SRC
#+BEGIN_SRC C :tangle no :noweb-ref end
}
#+END_SRC
#+BEGIN_SRC C :tangle ~/test.c :noweb no-export
<<begin>>
<<middle>>
<<end>>
#+END_SRC
Yields this:
int main() {
printf("Line 1\n");
printf("Second\n");
}
I have org-src-preserve-indentation turned on, but it can't preserve what isn't there. The code editing windows can't set it correctly if it doesn't see the parts from the previous source code blocks. Finally, I don't want to have to go through all the previous snippets to figure out what the indentation should start at every time I start a new source code block.
Current hack is to tangle the source code, open the tangled file in a new buffer, select all and run c-indent-line-or-region, but I'm hoping there's something better than that.
Org-mode version: 8.2.5h
As mentioned, hooking into the org-babel-post-tangle-hook is the way to go. I use the following:
(defun tnez/src-cleanup ()
(indent-region (point-min) (point-max)))
(add-hook 'org-babel-post-tangle-hook 'tnez/src-cleanup)

Org-mode fails to export when passing arguments to code blocks that exports results

When passing arguments to code block that exports results Org-mode fails to export with the error "Wrong type argument: listp". How can I fix this?
Here is an example. When it is exported it gives the error 'Wrong type argument: listp, "bar"'.
#+TITLE: Example
#+SOURCE: example-one
#+BEGIN_SRC emacs-lisp :exports results
(setq foo "bar")
#+END_SRC
#+SOURCE: example-two
#+BEGIN_SRC emacs-lisp :exports results :var x=example-one
(setq foo (concat x x))
#+END_SRC
I am running Org-mode 7.6 in Emacs 23.3.1.
This issue might simply be with the older copy of Org that you're running. Tested it today with a recent git pull and get the results below. As pmr suggested, you might have better luck asking on the mailing list ( emacs-orgmode#gnu.org ) since there might be someone there who would know what caused this issue and what might have been changed to resolve it in later versions.
The features and examples discussed in the manual are based on the current release version (7.8.03 in this case) so they will not always be compatible with older versions. Does the info-node in your version indicate that it should work?
These 2 commands will show you the associated info-nodes for that section of the Org Manual
; The node itself
(Info-goto-node "(org) var")
; Parent node, in case the first node isn't present
(Info-goto-node "(org) Working With Source Code")
Test Results
Org
* Test variable passing
Headlines are created to split the code blocks apart. When trying to eval on export I'm getting a syntax read error which was reported here: http://lists.gnu.org/archive/html/emacs-orgmode/2012-01/msg00993.html
** Ex 1
#+name: example-one
#+BEGIN_SRC emacs-lisp :exports results
(setq foo "bar")
#+END_SRC
** Ex 2
#+name: example-two
#+BEGIN_SRC emacs-lisp :exports results :var x=example-one
(setq foo (concat x x))
#+END_SRC
Latex
\vspace*{1cm}
Headlines are created to split the code blocks apart. When trying to eval on export I'm getting a syntax read error which was reported here: \href{http://lists.gnu.org/archive/html/emacs-orgmode/2012-01/msg00993.html}{http://lists.gnu.org/archive/html/emacs-orgmode/2012-01/msg00993.html}
\section{Ex 1}
\label{sec-1}
\begin{verbatim}
bar
\end{verbatim}
\section{Ex 2}
\label{sec-2}
\begin{verbatim}
barbar
\end{verbatim}
in your .emacs file - make sure you have the following line:
(setq org-babel-load-languages
(quote ((emacs-lisp . t))))