Використання Org Babel для прив'язки до імені змінної файлу


16

Якщо у мене є фрагмент коду, який я прив’язую до файлу, але я очікую, що ім'я файлу з часом зміниться, чи існує більш чистий спосіб змінити ім'я файлу, ніж Заміна запитів?

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

Чи є спосіб змінити аргумент на: заплутати динамічно.

Я дослідив і виявив, що можу подати Елісп в аргумент: 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:

або для : реж

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

Як описано в документах, ви можете мати:

  • Загальносистемні аргументи заголовка
  • Аргументи заголовка для мови
  • Аргументи заголовка у властивості режиму Org
  • Аргументи заголовка для мови у властивості режиму Org
  • Код блоку конкретних аргументів заголовка
  • Аргументи заголовка у викликах функцій

1

Ви можете використовувати властивість заголовка org замість a 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.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.