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 :tangle
Header-Arguments in einem der Blöcke in Cool Stuff
behebt 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.
var
iables in org-babel verwendet, aber die anderen Antworten sind fast genau das, was ich tue.Antworten:
Ich denke, das Problem ist einfach, dass Sie zwei verschiedene Arten der Angabe der Sprache der Quellblöcke verwenden:
emacs-lisp
für einige undelisp
für andere. Es scheint, dass alleelisp
Blöcke vor allen verwickeltemacs-lisp
sind (alphabetische Reihenfolge?). Wenn Sie konsequent den einen oder anderen verwenden, wird die Reihenfolge der Blöcke in Ihrer Datei eingehalten:verwickelt sich zu
quelle
Hier gibt es zwei Probleme. Das erste ist, dass Sie die
tangle
Eigenschaft 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, dietangle
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
elisp
Blöcke kommen zuerst heraus, weil sie vorher zusammengetragen wurdenemacs-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.Verwicklungen zu
quelle