Использование Org Babel, чтобы связать имя переменной файла

16

Если у меня есть фрагмент кода, который я связываю с файлом, но я ожидаю, что имя файла со временем изменится, есть ли более чистый способ изменить имя файла, чем Query-replace?

Например, скажем, я путаю код с ~ / 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.

Затем я понимаю, что файл лучше поместить в другое место:

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

Есть ли способ изменить аргумент на: путать динамически.

Я исследовал и обнаружил, что могу указать elisp в аргументе: tangle. Если я оцениваю (setq myfile "~/dir/file.el)и запутываю следующее:

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

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

Я получаю желаемый результат, который ищу. Затем я мог выполнить фрагмент кода elisp, чтобы установить переменную с помощью org-babel, но мне было интересно, есть ли более чистый способ сделать это.

Документы на заголовок: tangle не предусматривают собственный путь.

Гамбо
источник

Ответы:

17

Вы не должны повторять такие вещи, а определять их в одном месте. Например, вы можете определить выходной файл в блоке в качестве аргументов заголовка для всего дерева и поддеревьев :

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

или для : dir

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

Как описано в документации, вы можете иметь:

  • Общесистемные аргументы заголовка
  • Специфичные для языка аргументы заголовка
  • Аргументы заголовка в свойствах режима Org
  • Специфичные для языка аргументы заголовка в свойствах режима Org
  • Специфичные аргументы заголовка блока кода
  • Аргументы заголовка в вызовах функций
kmicu
источник
1

Вы можете использовать свойство заголовка org вместо 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.

Таким образом, вы можете установить разные имена файлов для каждого исходного блока.

Бора Челиккале
источник