Verwenden von Org Babel zum Verwirren eines variablen Dateinamens

16

Wenn ich ein Code-Snippet habe, das ich mit einer Datei verwechsle, aber erwarte, dass sich der Dateiname im Laufe der Zeit ändert, gibt es eine sauberere Möglichkeit, den Dateinamen zu ändern als Query-replace?

Angenommen, ich verwickle Code in ~ / dir / my-file.el:

#+BEGIN_SRC emacs-lisp :tangle ~/dir/my-file.el
(setq myvar1 "value1")
#+END_SRC

#+BEGIN_SRC emacs-lisp :tangle ~/dir/my-file.el
(defun foo (bar) ... )
#+END_SRC

etc.

Dann später stelle ich fest, dass die Datei besser an einem anderen Ort platziert werden würde:

#+BEGIN_SRC emacs-lisp :tangle ~/dir/my/file.el
(setq myvar1 "value1")
#+END_SRC

#+BEGIN_SRC emacs-lisp :tangle ~/dir/my/file.el
(defun foo (bar) ... )
#+END_SRC

etc.

Gibt es eine Möglichkeit, das Argument zu ändern: dynamisch verwickeln.

Ich habe nachgeforscht und festgestellt, dass ich elisp in das: tangle-Argument einspeisen kann. Wenn ich (setq myfile "~/dir/file.el)das Folgende bewerte und dann verwickle:

#+BEGIN_SRC emacs-lisp :tangle (print myfile)
(setq myvar1 "value1")
#+END_SRC

#+BEGIN_SRC emacs-lisp :tangle (print myfile)
(defun foo (bar) ... )
#+END_SRC

Ich erhalte das gewünschte Ergebnis. Ich könnte dann ein Elisp-Snippet ausführen, um die Variable mit org-babel zu setzen, aber ich habe mich gefragt, ob es einen saubereren Weg gibt, dies zu tun.

In den Dokumenten im: tangle-Header ist kein nativer Weg festgelegt.

Gambo
quelle

Antworten:

17

Sie sollten solche Dinge nicht wiederholen, sondern an einer Stelle definieren. Beispielsweise können Sie Ausgabedateien in einer Schublade als Header-Argumente für ganze Bäume und Teilbäume definieren :

* Header
:PROPERTIES:
:tangle: ~/dir/my/testfile.el
:END:

oder für : dir

* Header
:PROPERTIES:
:header-args: :dir ~/dir/my/dir/
:END:

Wie in den Dokumenten beschrieben , können Sie Folgendes haben:

  • Systemweite Header-Argumente
  • Sprachspezifische Header-Argumente
  • Header-Argumente in den Eigenschaften des Org-Modus
  • Sprachspezifische Header-Argumente in den Eigenschaften des Org-Modus
  • Codeblockspezifische Header-Argumente
  • Header-Argumente in Funktionsaufrufen
kmicu
quelle
1

Sie können anstelle von a eine Eigenschaft der Organisationsüberschrift verwenden setq

* Header
:PROPERTIES:
:PRJ-DIR: ~/prj/dir/
:END:

#+BEGIN_SRC emacs-lisp :tangle (concat (org-entry-get nil "PRJ-DIR" t) "file.el")
(setq myvar1 "value1")
#+END_SRC

#+BEGIN_SRC emacs-lisp :tangle (concat (org-entry-get nil "PRJ-DIR" t) "file.el")
(defun foo (bar) ... )
#+END_SRC

etc.

Auf diese Weise können Sie für jeden Quellblock unterschiedliche Dateinamen festlegen.

Bora Çelikkale
quelle