Usando Org Babel para emaranhar um nome de arquivo variável

16

Se eu tiver um trecho de código emaranhado em um arquivo, mas espero que o nome do arquivo mude ao longo do tempo, existe uma maneira mais limpa de alterar o nome do arquivo do que substituir a consulta?

Por exemplo, digamos que eu emaranhe o código em ~ / 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.

Mais tarde, percebo que o arquivo seria melhor colocado em outro local:

#+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 uma maneira de alterar o argumento para: emaranhar dinamicamente.

Eu investiguei e descobri que posso alimentar elisp no argumento: emaranhado. Se eu avaliar (setq myfile "~/dir/file.el)e depois enredar o seguinte:

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

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

Eu obtenho o resultado desejado que estou procurando. Eu poderia então executar um trecho elisp para definir a variável usando org-babel, mas estava pensando se há uma maneira mais limpa de fazer isso.

Os documentos no cabeçalho: emaranhado não estipulam uma maneira nativa.

Gambo
fonte

Respostas:

17

Você não deve repetir essas coisas, mas defini-las em um só lugar. Por exemplo, você pode definir o arquivo de saída em uma gaveta como argumentos do cabeçalho para toda a árvore e subárvores :

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

ou para : dir

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

Conforme descrito nos documentos, você pode ter:

  • Argumentos de cabeçalho em todo o sistema
  • Argumentos de cabeçalho específicos do idioma
  • Argumentos de cabeçalho nas propriedades do modo de organização
  • Argumentos de cabeçalho específicos do idioma nas propriedades do modo de organização
  • Argumentos de cabeçalho específicos do bloco de código
  • Argumentos de cabeçalho em chamadas de função
kmicu
fonte
1

Você pode usar uma propriedade do cabeçalho da organização em vez de um 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.

Dessa forma, você pode definir nomes de arquivos diferentes para cada bloco de origem.

Bora Çelikkale
fonte