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.

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.