Kiểm soát thứ tự đầu ra với Org-Babel


7

Hãy xem xét tệp Org sau:

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

sản lượng

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

; initialization code
; this *must* come first

chưa xóa :tangleđối số tiêu đề trên một trong các khối để Cool Stuffkhắc phục sự cố, nhưng sao chép mã:

; initialization code
; this *must* come first

(message "hi")

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

Tôi phải làm gì để đảm bảo hành vi đúng? Tôi biết rằng tôi chỉ đơn giản là có thể tắt rối cho tài liệu và có mọi thứ ngay bây giờ, nhưng điều này cảm thấy như một cách giải quyết hơn là một giải pháp.


Không giúp đỡ à? Có thể nào ...
Luke Shimkus

@KingShimkus Tôi chưa bao giờ sử dụng variables trong org-babel, nhưng các câu trả lời khác gần như chính xác những gì tôi đang làm.
Sean Allred

Tôi biết, tôi tất cả các câu trả lời. Chỉ cần nghĩ rằng câu trả lời đầu tiên có thể phục vụ một số sử dụng.
Luke Shimkus

@KingShimkus À, tôi cũng không muốn giới thiệu sự mơ hồ trong mã. Có vẻ như Org chỉ thực hiện tìm kiếm / thay thế cho biến / giá trị; Nếu tôi tình cờ sử dụng lại cùng tên một lần nữa, nó chỉ cảm thấy như một vụ hack :) Cảm ơn, mặc dù vậy :)
Sean Allred

Không có vấn đề, xin lỗi tôi không thể giúp đỡ nhiều hơn.
Luke Shimkus

Câu trả lời:


6

Tôi nghĩ vấn đề chỉ đơn giản là bạn đang sử dụng hai cách khác nhau để chỉ định ngôn ngữ của các khối nguồn: emacs-lispcho một số và elispcho những người khác. Dường như tất cả các elispkhối bị rối trước tất cả các khối emacs-lisp(thứ tự chữ cái?). Nếu bạn luôn sử dụng cái này hay cái kia, thì thứ tự các khối trong tệp của bạn được tuân thủ:

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

rối đến

; initialization code
; this *must* come first

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

4

Có hai vấn đề ở đây. Đầu tiên là bạn đang thiết lập thuộc tangletính trên toàn bộ tài liệu. Khi bạn làm điều này, bạn cần đặt mọi khối là một khối noweb là :tangle no. Việc đặt thuộc tangle tính trên một khối dễ dàng hơn nhiều và sử dụng nó làm khung cho toàn bộ tài liệu bị rối. Bạn có thể thấy làm thế nào điều này hoạt động trong ví dụ của tôi dưới đây.

Vấn đề thứ hai là khai báo loại nguồn không nhất quán của bạn. các elispkhối được đưa ra đầu tiên bởi vì chúng đối chiếu trước emacs-lisp. Tất cả chúng nên được dán nhãn giống nhau nếu chúng cùng ngôn ngữ và đi trong cùng một tệp (tất nhiên có ngoại lệ, chẳng hạn như nhúng SQL trong PHP hoặc một cái gì đó, nhưng theo gợi ý đầu tiên của tôi sẽ giúp tránh các vấn đề.

* 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

Rối để

; initialization code
; this *must* come first

(message "willkommen")
(message "hi")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.