Utilisation d'Org Babel pour s'emmêler avec un nom de fichier variable

16

Si j'ai un extrait de code que j'embrouille dans un fichier, mais que je m'attends à ce que le nom de fichier change au fil du temps, existe-t-il un moyen plus propre de changer le nom de fichier que Query-replace?

Par exemple, disons que j'emmêle le code dans ~ / dir / mon-fichier.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.

Plus tard, je me rends compte que le fichier serait mieux placé dans un autre emplacement:

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

Existe-t-il un moyen de changer l'argument en: enchevêtrement dynamique.

J'ai étudié et découvert que je pouvais introduire elisp dans l'argument: tangle. Si j'évalue (setq myfile "~/dir/file.el)puis emmêle les éléments suivants:

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

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

J'obtiens le résultat souhaité que je recherche. Je pouvais alors exécuter un extrait elisp pour définir la variable à l'aide d'org-babel, mais je me demandais s'il y avait une façon plus propre de le faire.

Les documents sur l'en-tête: tangle ne stipulent pas de manière native.

Gambo
la source

Réponses:

17

Vous ne devez pas répéter de telles choses, mais les définir en un seul endroit. Par exemple, vous pouvez définir le fichier de sortie dans un tiroir comme arguments d'en-tête pour l' arborescence entière et les sous-arbres :

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

ou pour : dir

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

Comme décrit dans la documentation, vous pouvez avoir:

  • Arguments d'en-tête à l'échelle du système
  • Arguments d'en-tête spécifiques à la langue
  • Arguments d'en-tête dans les propriétés du mode Org
  • Arguments d'en-tête spécifiques au langage dans les propriétés du mode Org
  • Arguments d'en-tête spécifiques au bloc de code
  • Arguments d'en-tête dans les appels de fonction
kmicu
la source
1

Vous pouvez utiliser une propriété de l'en-tête d'organisation au lieu d'un 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.

De cette façon, vous pouvez définir des noms de fichiers différents pour chaque bloc source.

Bora Çelikkale
la source