Utilizzo di Org Babel per aggrovigliare un nome di file variabile


16

Se ho uno snippet di codice che aggroviglio in un file, ma mi aspetto che il nome del file cambi nel tempo, esiste un modo più pulito per cambiare il nome del file Query-Replace?

Ad esempio, supponiamo che io groviglio il codice in ~ / 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.

Poi più tardi mi rendo conto che il file sarebbe meglio posizionato in un'altra posizione:

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

C'è un modo per cambiare l'argomento in: aggrovigliare dinamicamente.

Ho studiato e scoperto che posso alimentare elisp nell'argomento: groviglio. Se valuto (setq myfile "~/dir/file.el)e quindi aggroviglio quanto segue:

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

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

Ottengo il risultato desiderato che sto cercando. Potrei quindi eseguire uno snippet elisp per impostare la variabile usando org-babel, ma mi chiedevo se esiste un modo più pulito per farlo.

I documenti sull'intestazione: groviglio non prevedono un modo nativo.

Risposte:


17

Non dovresti ripetere queste cose, ma definirle in un unico posto. Ad esempio, puoi definire il file di output in un drawer come header args per l' intero albero e sottotitoli :

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

o per : dir

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

Come descritto nei documenti puoi avere:

  • Argomenti di intestazione a livello di sistema
  • Argomenti dell'intestazione specifici della lingua
  • Argomenti di intestazione nelle proprietà della modalità Org
  • Argomenti dell'intestazione specifici della lingua nelle proprietà della modalità Org
  • Argomenti dell'intestazione specifici del blocco di codice
  • Argomenti di intestazione nelle chiamate di funzione

1

È possibile utilizzare una proprietà dell'intestazione dell'organizzazione anziché 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.

In questo modo è possibile impostare nomi di file diversi per ciascun blocco sorgente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.