Org-Babelを使用した出力順序の制御


7

次の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

収量

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

; initialization code
; this *must* come first

それでも:tangleブロックの1つでヘッダー引数を削除Cool Stuffすると問題が解決しますが、コードが重複します。

; initialization code
; this *must* come first

(message "hi")

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

正しい動作を保証するにはどうすればよいですか?私は私が知っている可能性があり、単に文書のためのもつれオフにして、すべてがnowebのことがあるが、回避策ではなく、解決策のようなこの感じています。



@KingShimkus私はvarorg-babelでiableを使用したことがありませんが、他の答えはほぼ正確に私がやっていることです。
Sean Allred 2014年

私が知っている、私はすべての答え。最初の答えがいくつかの用途に役立つかもしれないと思っただけです。
ルークシムクス2014年

@KingShimkusああ、まあ私はコードに曖昧さを導入しないようにしたいと思います。Orgは単に変数/値を検索/置換するように見えます。私がたまたま同じ名前を使用した場合…繰り返しますが、それはハックのように感じます:)ありがとう、でも:)
Sean Allred

問題ありません。申し訳ありませんが、これ以上支援することができませんでした。
ルークシムクス2014年

回答:


6

:私はこの問題は、あなたがソースブロックの言語を指定する2つの異なる方法を使用しているということだけであると考えemacs-lisp、いくつかのためにとelisp他の人のために。すべてのelispブロックがすべてのブロックの前に絡まってemacs-lispいるようです(アルファベット順?)。どちらか一方を一貫して使用する場合、ファイル内のブロックの順序が尊重されます。

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

もつれます

; initialization code
; this *must* come first

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

4

ここには2つの問題があります。1つ目は、tangleドキュメント全体にプロパティを設定することです。これを行う場合、nowebブロックであるすべてのブロックをとして設定する必要があります:tangle notangle プロパティを1つのブロックに設定し、もつれたドキュメント全体のフレームワークとして使用する方がはるかに簡単です。以下の私の例でこれがどのように機能するかを確認できます。

2番目の問題は、一貫性のないソース型宣言です。elisp前に照合するため、 ブロックが最初に出てき emacs-lispます。同じ言語で同じファイルにある場合は、すべて同じラベルを付ける必要があります(もちろん、PHPにSQLを埋め込むなどの例外はありますが、最初の提案に従うと問題を回避できます。

* 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

もつれ

; initialization code
; this *must* come first

(message "willkommen")
(message "hi")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.