I want to call (recode-region)
on sh
code block results in :post
header attribute.
So it needs START
and END
values. Is there a way to define of RESULTS
block content boundaries for it ?
Asked
Active
Viewed 303 times
2

Drew
- 75,699
- 9
- 109
- 225

Dima Fomin
- 143
- 5
2 Answers
2
You can use org-element-parse-buffer
to obtain an abstract syntax tree (AST) of your org buffer.
Search that AST for the node representing the results of interest by org-element-map
.
You get the beginning and the end of the region with the results of interest from the node by (org-element-property :contents-begin node)
and (org-element-property :contents-end node)
.
All addressed functions are well documented and also described in the worg wiki.
I demonstrate the outlined procedure by a documented example org-mode file below:
* The source code block with the results of interest
#+NAME: resultsOfInterest
#+BEGIN_SRC emacs-lisp
'((1 2 3) (4 5 6))
#+END_SRC
#+RESULTS: resultsOfInterest
| 1 | 2 | 3 |
| 4 | 5 | 6 |
* The source code block for the analysis
#+BEGIN_SRC emacs-lisp :results drawer
;; (org-src-debug) ;;< Remove first comment starters to use the debugging code from https://emacs.stackexchange.com/questions/13244/edebug-orgmode-source-code-blocks-with-input-variables
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; The following wrapper enables us to run the code
;; - by evaluating the source code block within the org-file and also
;; - by evaluating the form in the source edit buffer.
(with-current-buffer (or (and (org-src-edit-buffer-p) (org-src--source-buffer))
(current-buffer))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; The actual code starts here:
(when-let ((ast (org-element-parse-buffer)) ;; built up the abstract syntax tree of the org buffer
(node (org-element-map
ast
'table ;;< We assume here that the results of interest are generated as table. Adapt to your case.
(lambda (node)
"Predicate for identifying the result of interest in the ast"
(when (equal (org-element-property :results node) '("resultsOfInterest")) ;; Results of interest are marked by #+RESULTS: "resultsOfInterest".
node))
nil
'first-match ;;< With 'first-match `org-element-map' works similar to `cl-find-if'.
))
(beg (org-element-property :contents-begin node)) ;< Beginning of region with results of interest
(end (org-element-property :contents-end node))) ;< End of region with results of interest
;; Action on the results of interest:
;; We just output the region as result of this source block.
(buffer-substring beg end)))
#+END_SRC
#+RESULTS:
:RESULTS:
| 1 | 2 | 3 |
| 4 | 5 | 6 |
:END:

Tobias
- 32,569
- 1
- 34
- 75
1
With point in a source block, the following snippet of code will return the start and end of the results as (RESULTS_START . RESTULTS_END):
(unless (org-in-src-block-p)
(error "Not in a source block"))
(let* ((src (org-element-context))
(results-start (org-babel-where-is-src-block-result))
(results-end
(when results-start
(save-excursion
(goto-char results-start)
(goto-char (org-babel-result-end))
(point)))))
;; return the region as (RESULTS_START . RESULTS_END)
`(,results-start . ,results-end))

Lorem Ipsum
- 4,327
- 2
- 14
- 35

UndeadKernel
- 232
- 1
- 7