Làm cách nào để tự động làm rối một khối nguồn khác thành tệp khi đánh giá một khối nguồn ở chế độ org?


9

Khối nguồn mà tôi muốn đánh giá (src2) cần nguồn một tệp phải là kết quả rối của một khối nguồn khác (src1). Làm thế nào nó có thể làm cho rối để tập tin tự động mọi lúc tôi đánh giá khối nguồn?

src1: nên rối vào tập tin:

+begin_src tcl :tangle /tmp/compile_lib.tcl
  <some tcl code>
+end_src

src2: sẽ được đánh giá.

+begin_src sh
   vivado -mode batch -source /tmp/compile_lib.tcl    # source the file tangled from <src1>
+end_src

Câu trả lời:


3

Sau khi nhìn xung quanh, tôi tìm ra cách giải quyết để làm điều đó bằng cách đặt một biến giả cho src2khối để làm rối src1khối.

Giải pháp: 1. Đầu tiên, bạn phải đặt tên cho src1khối để dễ dàng xác định vị trí. 2. Tạo một biến giả để sử dụng elisp để rối src1.

Mã ví dụ:

#+NAME: my_hello
#+BEGIN_SRC emacs-lisp :tangle /tmp/hello.el
  (message "Hello")
#+END_SRC

#+BEGIN_SRC sh :var DUMMY=(progn (org-babel-goto-named-src-block "my_hello") (org-babel-tangle '(4))) :results output
  cat /tmp/hello.el
  rm -f /tmp/hello.el
#+END_SRC

#+RESULTS:
: (message "Hello")

Giải pháp này giải quyết vấn đề của tôi bây giờ. Nhưng nó có rất nhiều hạn chế, chẳng hạn như nó chỉ có thể làm rối khối trong cùng một tệp chế độ org.

Hy vọng một số sẽ làm việc một cách tốt hơn để làm điều đó.


2

Nếu bạn cần mọi thứ để rối vào một tệp duy nhất, bạn có thể sử dụng cách giải quyết cực kỳ khó tin này sử dụng orgmode để biến một bảng thành mã được tạo bằng ngôn ngữ thứ hai (hoặc thứ ba!).

Bảng của bạn (1):

#+tblname: personae-table
| Set | Description        | variable | Value |
|-----+--------------------+----------+-------|
| DEP | Fam Med Department | famDep   | 23    |

Trình tạo mã của bạn (2):

#+name: python-generate-new-and-set-vars-blocks
#+BEGIN_SRC python :var records=personae-table :exports results :results output verbatim drawer
  print("#+name: variables")
  print("#+BEGIN_SRC mumps")

  print("n " + ",".join(line[3] for line in records))
  print("s " +
        ",".join(
            "{}={}".format([line[2], str(line[3])]) for line in records))
  print()
  print("#+END_SRC")
#+END_SRC

Kết quả của trình tạo của bạn (3):

#+results: python-generate-new-and-set-vars-blocks
:RESULTS:
#+name: variables
#+BEGIN_SRC mumps
n famDep
s famDep=23
#+END_SRC
:END:

Khối giả của bạn biên dịch trước các khối thành rối (4):

#+BEGIN_SRC emacs-lisp :tangle yes :var DUMMY=(progn (org-babel-goto-named-src-block "python-generate-new-and-set-vars-blocks") (org-ctrl-c-ctrl-c))
; run pre-tangle hooks by putting them in the var.
#+END_SRC

Khối đầu ra của bạn làm rối mã được tạo (5):

#+BEGIN_SRC mumps :tangle fixed.m :noweb tangle :padline no
  run()
    <<variables>>
#+END_SRC

Thực thi đi 4, 1, 2, 3, 5. Tôi không chắc mình nên tự hào hay xấu hổ. Orgmode là tuyệt vời.

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.