ใช้ Org Babel เพื่อยุ่งเหยิงเป็นชื่อไฟล์ตัวแปร


16

หากฉันมีข้อมูลโค้ดที่ทำให้ยุ่งเหยิงกับไฟล์ แต่ฉันคาดว่าชื่อไฟล์จะเปลี่ยนแปลงตลอดเวลามีวิธีที่สะอาดกว่าในการเปลี่ยนชื่อไฟล์แทนที่จะเป็น Query-replace หรือไม่

ตัวอย่างเช่นสมมติว่าฉันยุ่งรหัสเพื่อ ~ / 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.

ต่อมาฉันก็รู้ว่าไฟล์จะอยู่ในตำแหน่งที่ดีกว่า:

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

มีวิธีในการเปลี่ยนอาร์กิวเมนต์เป็น: ยุ่งเหยิงแบบไดนามิก

ฉันได้ตรวจสอบและค้นพบว่าฉันสามารถป้อน elisp ลงใน: อาร์กิวเมนต์ยุ่งเหยิง หากฉันประเมินค่า(setq myfile "~/dir/file.el)และทำให้ยุ่งเหยิงต่อไปนี้:

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

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

ฉันได้รับผลลัพธ์ตามที่ต้องการแล้ว จากนั้นฉันสามารถประมวลผลข้อมูลโค้ดเพื่อตั้งค่าตัวแปรโดยใช้ org-babel แต่ฉันสงสัยว่ามีวิธีที่สะอาดกว่านี้ไหม

เอกสารบนส่วนหัว: ยุ่งเหยิงไม่ได้กำหนดวิธีการเนทิฟ

คำตอบ:


17

คุณไม่ควรทำสิ่งเหล่านี้ซ้ำ แต่ให้นิยามไว้ในที่เดียว ตัวอย่างเช่นคุณสามารถกำหนดไฟล์ที่ส่งออกในลิ้นชักเป็นส่วนหัว argsสำหรับต้นไม้และทรีย่อย :

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

หรือสำหรับ: dir

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

ตามที่อธิบายไว้ในเอกสารคุณสามารถมี:

  • อาร์กิวเมนต์ส่วนหัวของทั้งระบบ
  • อาร์กิวเมนต์ส่วนหัวเฉพาะภาษา
  • อาร์กิวเมนต์ส่วนหัวในคุณสมบัติโหมดองค์กร
  • อาร์กิวเมนต์ส่วนหัวเฉพาะภาษาในคุณสมบัติโหมดองค์กร
  • อาร์กิวเมนต์ส่วนหัวของรหัสบล็อกเฉพาะ
  • อาร์กิวเมนต์ส่วนหัวในการเรียกใช้ฟังก์ชัน

1

คุณสามารถใช้คุณสมบัติของส่วนหัว org แทนที่จะเป็น 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.

วิธีนี้คุณสามารถตั้งชื่อไฟล์ที่แตกต่างกันสำหรับแต่ละบล็อคต้นฉบับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.