Controlando a ordem de saída com Org-Babel

7

Considere o seguinte arquivo organizacional:

#+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

rendimentos

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

; initialization code
; this *must* come first

ainda assim, remover o :tangleargumento do cabeçalho em um dos blocos Cool Stuffcorrige o problema, mas duplica o código:

; initialization code
; this *must* come first

(message "hi")

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

O que devo fazer para garantir o comportamento correto? Sei que poderia simplesmente desativar o emaranhamento do documento e deixar tudo pronto agora, mas isso parece mais uma solução alternativa do que uma solução.

Sean Allred
fonte
Isso ajuda? É possível ...
Luke Shimkus
@KingShimkus Eu nunca usei variables no org-babel, mas as outras respostas são quase exatamente o que estou fazendo.
Sean Allred
Eu sei, eu todas as respostas. Apenas pensei que a primeira resposta poderia servir para alguma utilidade.
Luke Shimkus
@KingShimkus Ah, bem, eu gostaria de não introduzir ambiguidades no código. Parece que a organização apenas faz uma pesquisa / substituição da variável / valor; se acontecer de eu usar o mesmo nome ... novamente, ele só se sente como um hack :) Obrigado, embora :)
Sean Allred
Não tem problema, desculpe, eu não poderia ter sido de mais assistência.
Luke Shimkus

Respostas:

6

Acho que o problema é simplesmente o fato de você estar usando duas maneiras diferentes de especificar o idioma dos blocos de origem: emacs-lisppara alguns e elisppara outros. Parece que todos os elispblocos estão emaranhados antes de todos emacs-lisp(ordem alfabética?). Se você usa um ou outro de forma consistente, a ordem dos blocos no seu arquivo é respeitada:

#+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

emaranhados para

; initialization code
; this *must* come first

(message "willkommen")
(message "hi")
descontinuada
fonte
4

Existem dois problemas aqui. A primeira é que você está definindo a tanglepropriedade em todo o documento. Ao fazer isso, você precisa definir cada bloco que é um bloco noweb como :tangle no. É muito mais fácil definir a tangle propriedade em um bloco e usá-la como estrutura para todo o documento emaranhado. Você pode ver como isso funciona no meu exemplo abaixo.

O segundo problema são suas declarações de tipo de fonte inconsistentes. os elispblocos estão saindo primeiro porque eles se agrupam antes emacs-lisp. Todos devem ser rotulados da mesma forma se forem da mesma linguagem e forem no mesmo arquivo (é claro que há exceções, como incorporar SQL no PHP ou algo assim, mas seguir a minha primeira sugestão ajudará 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

Emaranhados para

; initialization code
; this *must* come first

(message "willkommen")
(message "hi")
emacs_ftw
fonte