Steuerung der Ausgabereihenfolge mit Org-Babel


7

Betrachten Sie die folgende Org-Datei:

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

ergibt

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

; initialization code
; this *must* come first

Das Entfernen des :tangleHeader-Arguments in einem der Blöcke in Cool Stuffbehebt das Problem, dupliziert jedoch den Code:

; initialization code
; this *must* come first

(message "hi")

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

Was muss ich tun, um ein korrektes Verhalten sicherzustellen? Ich weiß, ich könnte einfach das Verwirren des Dokuments ausschalten und alles jetzt haben, aber das fühlt sich eher nach einer Problemumgehung als nach einer Lösung an.



@KingShimkus Ich habe noch nie variables in org-babel verwendet, aber die anderen Antworten sind fast genau das, was ich tue.
Sean Allred

Ich weiß, ich habe alle Antworten. Ich dachte nur, die erste Antwort könnte etwas nützen.
Luke Shimkus

@KingShimkus Ah, nun, ich möchte keine Mehrdeutigkeiten in den Code einführen. Es sieht so aus, als würde Org nur nach der Variablen / dem Wert suchen / diese ersetzen. Wenn ich zufällig den gleichen Namen benutze ... wieder, fühlt es sich einfach wie ein Hack an :) Danke aber :)
Sean Allred

Kein Problem, tut mir leid, ich hätte nicht weiterhelfen können.
Luke Shimkus

Antworten:


6

Ich denke, das Problem ist einfach, dass Sie zwei verschiedene Arten der Angabe der Sprache der Quellblöcke verwenden: emacs-lispfür einige und elispfür andere. Es scheint, dass alle elispBlöcke vor allen verwickelt emacs-lispsind (alphabetische Reihenfolge?). Wenn Sie konsequent den einen oder anderen verwenden, wird die Reihenfolge der Blöcke in Ihrer Datei eingehalten:

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

verwickelt sich zu

; initialization code
; this *must* come first

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

4

Hier gibt es zwei Probleme. Das erste ist, dass Sie die tangleEigenschaft für das gesamte Dokument festlegen. Wenn Sie dies tun, müssen Sie jeden Block, der ein Noweb-Block ist, als festlegen :tangle no. Es ist viel einfacher, die tangle Eigenschaft für einen Block festzulegen und als Rahmen für das gesamte verworrene Dokument zu verwenden. Wie das geht, sehen Sie in meinem Beispiel unten.

Das zweite Problem sind Ihre inkonsistenten Deklarationen des Quelltyps. Die elispBlöcke kommen zuerst heraus, weil sie vorher zusammengetragen wurden emacs-lisp. Sie sollten alle gleich beschriftet sein, wenn sie dieselbe Sprache haben und in derselben Datei gespeichert sind (es gibt natürlich Ausnahmen, wie das Einbetten von SQL in PHP oder so, aber wenn ich meinem ersten Vorschlag folge, können Sie Probleme vermeiden.

* 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

Verwicklungen zu

; initialization code
; this *must* come first

(message "willkommen")
(message "hi")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.