Menggunakan Babel Org untuk kusut ke nama file variabel

16

Jika saya memiliki potongan kode yang saya kusut ke file, tapi saya berharap nama file berubah dari waktu ke waktu, Apakah ada cara yang lebih bersih untuk mengubah nama file daripada mengganti Query?

Sebagai contoh, katakan saya menguraikan kode ke ~ / 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.

Kemudian saya menyadari bahwa file tersebut akan lebih baik ditempatkan di lokasi lain:

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

Apakah ada cara untuk mengubah argumen menjadi: kusut secara dinamis.

Saya telah menyelidiki dan menemukan bahwa saya dapat memberi makan elisp ke dalam: argumen kusut. Jika saya mengevaluasi (setq myfile "~/dir/file.el)dan kemudian kusut berikut ini:

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

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

Saya mendapatkan hasil yang diinginkan yang saya cari. Saya kemudian dapat menjalankan cuplikan elisp untuk mengatur variabel menggunakan org-babel, tapi saya bertanya-tanya apakah ada cara yang lebih bersih untuk melakukannya.

Docs pada tangle header tidak menetapkan cara asli.

Gambo
sumber

Jawaban:

17

Anda seharusnya tidak mengulangi hal-hal seperti itu, tetapi mendefinisikannya di satu tempat. Sebagai contoh, Anda dapat mendefinisikan file output dalam laci sebagai argumen header untuk seluruh pohon dan sub pohon :

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

atau untuk : dir

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

Seperti yang dijelaskan dalam dokumen, Anda dapat memiliki:

  • Argumen header seluruh sistem
  • Argumen tajuk khusus bahasa
  • Argumen header dalam properti mode Org
  • Argumen header khusus bahasa dalam properti mode Org
  • Kode memblokir argumen header tertentu
  • Argumen header dalam panggilan fungsi
kmicu
sumber
1

Anda dapat menggunakan properti dari judul org bukan 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.

Dengan cara ini Anda dapat menetapkan nama file yang berbeda untuk setiap blok sumber.

Bora Çelikkale
sumber