Control del orden de salida con Org-Babel

7

Considere el siguiente archivo Org:

#+PROPERTY: tangle "init.el"
#+PROPERTY: noweb yes

* A
#+begin_src elisp
; initialization code
; this *must* come first
#+end_src

* B
#+begin_src emacs-lisp
<<support-functions>>
#+end_src

** Cool Stuff
#+begin_src elisp :noweb-ref "support-functions" :tangle no
(message "willkommen")
#+end_src

** Test
#+begin_src elisp :noweb-ref "support-functions" :tangle no
(message "hi")
#+end_src

rendimientos

(message "willkommen")
(message "hi")

; initialization code
; this *must* come first

Sin embargo, eliminar el :tangleargumento de encabezado en uno de los bloques Cool Stuffsoluciona el problema, pero duplica el código:

; initialization code
; this *must* come first

(message "hi")

(message "willkommen")
(message "hi")

¿Qué debo hacer para garantizar un comportamiento correcto? Sé que podría simplemente desactivar el enredo para el documento y hacer que todo sea nuevo, pero esto se siente como una solución alternativa en lugar de una solución.

Sean Allred
fuente
¿Esto ayuda? ¿Es posible ...
Luke Shimkus
@ KingShimkus Nunca he usado variables en org-babel, pero las otras respuestas son casi exactamente lo que estoy haciendo.
Sean Allred
Lo sé, tengo todas las respuestas. Solo pensé que la primera respuesta podría ser útil.
Luke Shimkus
@ KingShimkus Ah, bueno, me gustaría no introducir ambigüedades en el código. Parece que Org solo busca / reemplaza la variable / valor; si uso el mismo nombre ... de nuevo, se siente como un truco :) Gracias, aunque :)
Sean Allred
No hay problema, lo siento, no podría haber sido de más ayuda.
Luke Shimkus

Respuestas:

6

Creo que el problema es simplemente que está utilizando dos formas diferentes de especificar el idioma de los bloques de origen: emacs-lisppara algunos y elisppara otros. Parece que todos los elispbloques están enredados antes que todos emacs-lisp(¿orden alfabético?). Si usa uno u otro de manera sistemática, se respetará el orden de los bloques en su archivo:

#+PROPERTY: tangle "init.el"
#+PROPERTY: noweb yes

* A
#+begin_src emacs-lisp
; initialization code
; this *must* come first
#+end_src

* B
#+begin_src emacs-lisp
<<support-functions>>
#+end_src

** Cool Stuff
#+begin_src emacs-lisp :noweb-ref "support-functions" :tangle no
(message "willkommen")
#+end_src

** Test
#+begin_src emacs-lisp :noweb-ref "support-functions" :tangle no
(message "hi")
#+end_src

enredos a

; initialization code
; this *must* come first

(message "willkommen")
(message "hi")
obsoleto
fuente
4

Hay dos problemas aquí. La primera es que está configurando la tanglepropiedad en todo el documento. Cuando hace esto, necesita establecer cada bloque que sea un bloque noweb como :tangle no. Es mucho más fácil establecer la tangle propiedad en un bloque y usarla como marco para todo el documento enredado. Puedes ver cómo funciona esto en mi ejemplo a continuación.

El segundo problema son sus declaraciones de tipo fuente inconsistentes. los elispbloques salen primero porque antes se juntan emacs-lisp. Todos deberían tener la misma etiqueta si son del mismo idioma y van en el mismo archivo (hay excepciones, por supuesto, como incrustar SQL en PHP o algo así, pero seguir mi primera sugerencia ayudará a evitar problemas.

* A

#+header: :tangle init.el
#+header: :noweb yes
#+begin_src emacs-lisp
  ; initialization code
  ; this *must* come first

  <<support-functions>>
#+end_src

* B

** Cool Stuff

#+name: support-functions
#+begin_src emacs-lisp
  (message "willkommen")
#+end_src

** Test

#+name: support-functions
#+begin_src emacs-lisp
  (message "hi")
#+end_src

Enredos a

; initialization code
; this *must* come first

(message "willkommen")
(message "hi")
emacs_ftw
fuente