¿Cómo enredar automáticamente otro bloque fuente al archivo cuando se evalúa un bloque fuente en modo org?

9

El bloque de origen que quiero evaluar (src2) necesita obtener un archivo que debería ser el resultado de otro bloque de origen (src1). ¿Cómo podría enredar el archivo automáticamente cada vez que evalúo el bloque fuente?

src1: debe estar enredado en el archivo:

+begin_src tcl :tangle /tmp/compile_lib.tcl
  <some tcl code>
+end_src

src2: sería evaluado

+begin_src sh
   vivado -mode batch -source /tmp/compile_lib.tcl    # source the file tangled from <src1>
+end_src
Enze Chi
fuente

Respuestas:

3

Después de mirar alrededor, descubro una solución alternativa para hacerlo estableciendo una variable ficticia para que el src2bloque enrede el src1bloque.

Solución: 1. Primero, debe nombrar el src1bloque para facilitar su localización. 2. Cree una variable ficticia para usar elisp para enredar src1.

Código de ejemplo:

#+NAME: my_hello
#+BEGIN_SRC emacs-lisp :tangle /tmp/hello.el
  (message "Hello")
#+END_SRC

#+BEGIN_SRC sh :var DUMMY=(progn (org-babel-goto-named-src-block "my_hello") (org-babel-tangle '(4))) :results output
  cat /tmp/hello.el
  rm -f /tmp/hello.el
#+END_SRC

#+RESULTS:
: (message "Hello")

Esta solución resuelve mi problema por ahora. Pero tiene muchas limitaciones, como solo puede enredar el bloque en el mismo archivo de modo de organización.

Espero que algunos encuentren una mejor manera de hacerlo.

Enze Chi
fuente
2

Si necesita que todo se enrede en un solo archivo, puede usar esta solución increíblemente hacky que usa orgmode para convertir una tabla en código generado en un segundo (¡o tercer!) Idioma.

Tu mesa (1):

#+tblname: personae-table
| Set | Description        | variable | Value |
|-----+--------------------+----------+-------|
| DEP | Fam Med Department | famDep   | 23    |

Su generador de código (2):

#+name: python-generate-new-and-set-vars-blocks
#+BEGIN_SRC python :var records=personae-table :exports results :results output verbatim drawer
  print("#+name: variables")
  print("#+BEGIN_SRC mumps")

  print("n " + ",".join(line[3] for line in records))
  print("s " +
        ",".join(
            "{}={}".format([line[2], str(line[3])]) for line in records))
  print()
  print("#+END_SRC")
#+END_SRC

Los resultados de su generador (3):

#+results: python-generate-new-and-set-vars-blocks
:RESULTS:
#+name: variables
#+BEGIN_SRC mumps
n famDep
s famDep=23
#+END_SRC
:END:

Su bloque ficticio que precompila los bloques para enredar (4):

#+BEGIN_SRC emacs-lisp :tangle yes :var DUMMY=(progn (org-babel-goto-named-src-block "python-generate-new-and-set-vars-blocks") (org-ctrl-c-ctrl-c))
; run pre-tangle hooks by putting them in the var.
#+END_SRC

Su bloque de salida que enreda el código generado (5):

#+BEGIN_SRC mumps :tangle fixed.m :noweb tangle :padline no
  run()
    <<variables>>
#+END_SRC

La ejecución va 4, 1, 2, 3, 5. No estoy seguro de si debería estar orgulloso o avergonzado. Orgmode es asombroso.

usuario16698
fuente