Wie kann ein anderer Quellblock automatisch in eine Datei verwickelt werden, wenn ein Quellblock im Organisationsmodus ausgewertet wird?

9

Der Quellblock, den ich auswerten möchte (src2), muss eine Datei quellen, die das Wirrwarr eines anderen Quellblocks (src1) sein sollte. Wie könnte es das Gewirr machen, automatisch alles abzulegen, wenn ich den Quellblock auswerte?

src1: sollte sich in der Datei verwickeln:

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

src2: würde ausgewertet.

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

Antworten:

3

Nachdem ich mich umgesehen habe, arbeite ich eine Problemumgehung aus, indem ich eine Dummy-Variable für den src2Block setze, um den Block zu verwickeln src1.

Lösung: 1. Zuerst müssen Sie den src1Block benennen , damit er leicht gefunden werden kann. 2. Erstellen Sie eine Dummy-Variable, um elisp zum Verwickeln zu verwenden src1.

Beispielcode:

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

Diese Lösung löst mein Problem vorerst. Es gibt jedoch viele Einschränkungen, z. B. kann es den Block nur in derselben Organisationsmodus-Datei verwickeln.

Ich hoffe, einige würden einen besseren Weg finden, dies zu tun.

Enze Chi
quelle
2

Wenn Sie alles benötigen, um sich in einer einzigen Datei zu verwickeln, können Sie diese unglaublich hackige Problemumgehung verwenden, bei der mithilfe des Organisationsmodus eine Tabelle in generierten Code in einer zweiten (oder dritten!) Sprache umgewandelt wird.

Ihr Tisch (1):

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

Ihr Codegenerator (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

Die Ergebnisse Ihres Generators (3):

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

Ihr Dummy-Block, der die Blöcke vorkompiliert, um sie zu verwickeln (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

Ihr Ausgabeblock, der den generierten Code verwickelt (5):

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

Die Ausführung erfolgt mit 4, 1, 2, 3, 5. Ich bin mir nicht sicher, ob ich stolz oder beschämt sein sollte. Orgmode ist unglaublich.

user16698
quelle