Użycie Org Babel do splątania nazwy pliku o zmiennej nazwie

16

Jeśli mam fragment kodu, który zaplątałem w plik, ale spodziewam się, że nazwa pliku zmieni się z czasem, czy istnieje lepszy sposób na zmianę nazwy pliku niż zastąpienie zapytania?

Powiedzmy na przykład, że plączę kod do ~ / 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.

Później zdaję sobie sprawę, że lepiej byłoby umieścić plik w innym miejscu:

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

Czy istnieje sposób na zmianę argumentu na: splątanie dynamiczne.

Zbadałem i odkryłem, że mogę wprowadzić elisp do argumentu: tangle. Jeśli ocenię, (setq myfile "~/dir/file.el)a następnie zaplątam następujące kwestie:

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

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

Otrzymuję pożądany efekt, którego szukam. Mógłbym wtedy wykonać fragment elisp, aby ustawić zmienną za pomocą org-babel, ale zastanawiałem się, czy jest na to lepszy sposób.

Dokumenty w nagłówku: tangle nie określają natywnego sposobu.

Gambo
źródło

Odpowiedzi:

17

Nie powinieneś powtarzać takich rzeczy, ale definiować je w jednym miejscu. Na przykład możesz zdefiniować plik wyjściowy w szufladzie jako argumenty nagłówka dla całego drzewa i poddrzewa :

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

lub dla : reż

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

Jak opisano w dokumentach , możesz mieć:

  • Argumenty nagłówka w całym systemie
  • Argumenty nagłówka specyficzne dla języka
  • Argumenty nagłówka we właściwościach trybu Org
  • Argumenty nagłówka specyficzne dla języka we właściwościach trybu Org
  • Argumenty nagłówka specyficzne dla bloku kodu
  • Argumenty nagłówka w wywołaniach funkcji
kmicu
źródło
1

Możesz użyć właściwości nagłówka organizacji zamiast 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.

W ten sposób możesz ustawić różne nazwy plików dla każdego bloku źródłowego.

Bora Çelikkale
źródło