Usando Org Babel para enredarse con un nombre de archivo variable

16

Si tengo un fragmento de código que enredo en un archivo, pero espero que el nombre del archivo cambie con el tiempo, ¿hay una forma más limpia de cambiar el nombre del archivo que Query-replace?

Por ejemplo, digamos que enredo el código a ~ / 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.

Luego, más tarde, me doy cuenta de que el archivo estaría mejor ubicado en otra ubicación:

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

¿Hay alguna manera de cambiar el argumento a: enredar dinámicamente?

He investigado y descubierto que puedo alimentar a Elisp con el argumento: Tangle. Si evalúo (setq myfile "~/dir/file.el)y luego enredo lo siguiente:

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

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

Obtengo el resultado deseado que estoy buscando. Entonces podría ejecutar un fragmento de elisp para establecer la variable usando org-babel, pero me preguntaba si hay una forma más limpia de hacerlo.

Los documentos del encabezado: tangle no estipulan una forma nativa.

Gambo
fuente

Respuestas:

17

No debe repetir tales cosas, sino definirlas en un solo lugar. Por ejemplo, puede definir el archivo de salida en un cajón como argumentos de encabezado para todo el árbol y subárboles :

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

o para : dir

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

Como se describe en los documentos , puede tener:

  • Argumentos de encabezado en todo el sistema
  • Argumentos de encabezado específicos del idioma
  • Argumentos de encabezado en propiedades del modo Org
  • Argumentos de encabezado específicos del idioma en las propiedades del modo Org
  • Argumentos de encabezado específicos de bloque de código
  • Argumentos de encabezado en llamadas a funciones
kmicu
fuente
1

Puede usar una propiedad del encabezado de la organización en lugar de 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 esta manera, puede establecer diferentes nombres de archivo para cada bloque de origen.

Bora Çelikkale
fuente