วิธีส่งออกส่วนหัวระดับสูงสุดของบัฟเฟอร์โหมดองค์กรไปยังไฟล์แยกกันได้อย่างไร


17

แต่ละหัวข้อระดับบนสุดของorg-modeบัฟเฟอร์สามารถส่งออกไปยังไฟล์แยกต่างหากที่ตั้งชื่อตามค่าของชื่อCUSTOM_ID+ (sanitized) ที่เกี่ยวข้องได้อย่างไร

สมมติว่าบัฟเฟอร์ประกอบด้วย:

* Title of Heading 1
  :PROPERTIES:
  :CUSTOM_ID: fibrillogenesis
  :END:
  Suspendisse potenti. Mauris ac felis vel velit tristique imperdiet.  

** Sub-Heading
   Nullam rutrum.

* Another Title for Heading 2
  :PROPERTIES:
  :CUSTOM_ID: mitochondrion
  :END:
  Mauris mollis tincidunt felis.  Sed bibendum.

ผลลัพธ์สุดท้ายจะเป็นไดเรกทอรีที่มีสองไฟล์หนึ่งไฟล์สำหรับแต่ละหัวเรื่องระดับบนสุดด้วยรูปแบบที่เลือกในเวลาส่งออก (HTML, LaTeX, ฯลฯ ) โดยมีชื่อไฟล์และเนื้อหาดังต่อไปนี้:

  1. ชื่อไฟล์ของส่วนหัวที่ส่งออกครั้งแรก: fibrillogenesis-title-of-heading-1.[ext]

    เนื้อหาที่ส่งออกซึ่งสอดคล้องกับส่วนหัวระดับบนสุดแรก:

    * Title of Heading 1
      :PROPERTIES:
      :CUSTOM_ID: fibrillogenesis
      :END:
      Suspendisse potenti. Mauris ac felis vel velit tristique imperdiet.  
    
    ** Sub-Heading 
       Nullam rutrum.
    
  2. ชื่อไฟล์ของหัวข้อที่ส่งออกที่สอง: mitochondrion-another-title-for-heading-2.[ext]

    เนื้อหาที่ส่งออกซึ่งสอดคล้องกับส่วนหัวระดับบนสุดที่สองต้นฉบับ:

    * Another Title for Heading 2
    :PROPERTIES:
    :CUSTOM_ID: mitochondrion
    :END:
    Mauris mollis tincidunt felis.  Sed bibendum. 
    

ฉันจะขอบคุณมากสำหรับคำแนะนำทิศทางรหัสเทียมหรือรหัสจริง (ดีกว่า)

คำตอบ:


27

คำสั่งต่อไปนี้ให้คุณเลือกแบ็คเอนด์จากนั้นเอ็กซ์พอร์ตทรีย่อยแต่ละอันไปยังไฟล์แยกต่างหาก:

(defun org-export-all (backend)
  "Export all subtrees that are *not* tagged with :noexport: to
separate files.

Note that subtrees must have the :EXPORT_FILE_NAME: property set
to a unique value for this to work properly."
  (interactive "sEnter backend: ")
  (let ((fn (cond ((equal backend "html") 'org-html-export-to-html)
                  ((equal backend "latex") 'org-latex-export-to-latex)
                  ((equal backend "pdf") 'org-latex-export-to-pdf))))
    (save-excursion
      (set-mark (point-min))
      (goto-char (point-max))
      (org-map-entries (lambda () (funcall fn nil t)) "-noexport" 'region-start-level))))

ปัจจุบันรองรับการส่งออก HTML ( html), LaTeX ( latex) และ PDF ( pdf) condคุณสามารถเพิ่มการสนับสนุนสำหรับการกลับปลายโดยการเพิ่มคำสั่งมากขึ้นเพื่อ

ดังที่ docstring กล่าวว่าสำหรับแต่ละทรีย่อยคุณจะต้องตั้งค่า:EXPORT_FILE_NAME:คุณสมบัติเป็นชื่อไฟล์ที่คุณต้องการให้ส่งออกไป (ดูด้านล่างสำหรับตัวเลือกอื่น ๆ )

สร้างชื่อไฟล์ส่งออกโดยอัตโนมัติจากข้อความส่วนหัว

หากคุณไม่ต้องการเพิ่ม:EXPORT_FILE_NAME:คุณสมบัติให้กับส่วนหัวระดับบนสุดคุณสามารถแก้ไขorg-export-allเพื่อสร้างชื่อไฟล์โดยอัตโนมัติจากเช่นข้อความส่วนหัวการตั้งค่าชั่วคราว:EXPORT_FILE_NAME:ระหว่างการส่งออก:

(defun org-export-all (backend)
  "Export all subtrees that are *not* tagged with :noexport: to
separate files.

Subtrees that do not have the :EXPORT_FILE_NAME: property set
are exported to a filename derived from the headline text."
  (interactive "sEnter backend: ")
  (let ((fn (cond ((equal backend "html") 'org-html-export-to-html)
                  ((equal backend "latex") 'org-latex-export-to-latex)
                  ((equal backend "pdf") 'org-latex-export-to-pdf)))
        (modifiedp (buffer-modified-p)))
    (save-excursion
      (set-mark (point-min))
      (goto-char (point-max))
      (org-map-entries
       (lambda ()
         (let ((export-file (org-entry-get (point) "EXPORT_FILE_NAME")))
           (unless export-file
             (org-set-property
              "EXPORT_FILE_NAME"
              (replace-regexp-in-string " " "_" (nth 4 (org-heading-components)))))
           (funcall fn nil t)
           (unless export-file (org-delete-property "EXPORT_FILE_NAME"))
           (set-buffer-modified-p modifiedp)))
       "-noexport" 'region-start-level))))

ฟังก์ชันนี้สร้างชื่อไฟล์ส่งออกโดยแทนที่ช่องว่างด้วย "_" ในข้อความบรรทัดแรก หากคุณต้องการสร้างชื่อไฟล์ด้วยวิธีอื่นให้เปลี่ยนreplace-regexp-in-stringsexp เป็นอะไรก็ได้ที่คุณต้องการ

สร้าง:EXPORT_FILE_NAME:เมื่อตั้งค่า:CUSTOM_ID:

ด้วยคำแนะนำต่อไปนี้org-set-propertyจะตั้งค่าที่เหมาะสมโดยอัตโนมัติ:EXPORT_FILE_NAME:เมื่อคุณตั้งค่า:CUSTOM_ID::

(defadvice org-set-property (after set-export-file-name
                                   (property value) activate compile)
  (when (equal org-last-set-property "CUSTOM_ID")
    (let ((export-file-name
           (concat (org-entry-get nil "CUSTOM_ID")
                   "-"
                   (replace-regexp-in-string " " "-" (downcase (org-get-heading t t))))))
      (org-entry-put nil "EXPORT_FILE_NAME" export-file-name))))

หมายเหตุที่ว่านี้จะไม่เพิ่มนามสกุลไฟล์ค่าของ:EXPORT_FILE_NAME:แต่ที่ไม่ได้เรื่องเพราะเมื่อส่งออกไปยังเฉพาะหลังสิ้นสุดโดยอัตโนมัติจะเลือกนามสกุลที่ถูกต้องสำหรับไฟล์ที่เกิดorg-mode


ข้อมูลเพิ่มเติม

การอัพเดททรีย่อยที่มีอยู่เป็นกลุ่ม

หากคุณมีทรีย่อยที่มีอยู่จำนวนมากซึ่งคุณต้องตั้งค่า:EXPORT_FILE_NAME:คุณสมบัติให้คุณสามารถใช้มาโครคีย์บอร์ดได้ วางตำแหน่งบนทรีย่อยแรกจากนั้นทำต่อไปนี้:

  • F3

    ... เพื่อเริ่มการบันทึก

  • C-c C-x p CUSTOM_ID RET RET

    ... เพื่อให้ Emacs ตั้งอยู่บนพื้นฐานของ:EXPORT_FILE_NAME::CUSTOM_ID:

  • C-c C-f

    ... เพื่อเลื่อนไปยังบรรทัดแรกระดับบนสุดถัดไป

  • F4

    ... เพื่อหยุดการบันทึก

F4ที่จะทำซ้ำแมโครสำหรับทรีย่อยต่อไปกด ในการทำซ้ำแมโครสำหรับsubtrees ที่เหลือทั้งหมดให้กดM-0 F4(นั่นคือศูนย์)

การบันทึกมาโครสำหรับเซสชันในอนาคต

ตามค่าเริ่มต้นมาโครคีย์บอร์ดจะไม่ถูกบันทึกข้ามเซสชัน ในการจัดเก็บมาโครในไฟล์ init ของคุณเพื่อใช้ในภายหลังให้ทำดังนี้

  1. ตั้งชื่อแมโคร:

    M-x name-last-kbd-macro RET org-set-export-file-name RET

  2. ค้นหาไฟล์ init ของคุณและย้ายไปยังจุดที่คุณต้องการแทรกมาโคร

  3. แทรกมาโคร:

    M-x insert-kbd-macro RET org-set-export-file-name RET

    Emacs จะแทรกรหัสต่อไปนี้ที่จุด:

    (fset 'org-set-export-file-name
       "\C-c\C-xpCUSTOM_ID\C-m\C-m\C-c\C-f")

    หากคุณเหลื่อมกันมากพอคุณจะเห็นว่าอาร์กิวเมนต์ที่สองfsetมีลำดับของคีย์ที่คุณกดเมื่อคุณบันทึกแมโคร :)

  4. (ไม่บังคับ) เพื่อผลลัพธ์ที่ดีที่สุดคุณอาจต้องการผูกorg-set-export-file-nameคีย์:

    (define-key org-mode-map (kbd "<f6>") 'org-set-export-file-name)
  5. บันทึก


1
ดี คุณช่วยให้คำแนะนำฉันเกี่ยวกับวิธีตั้งค่า:EXPORT_FILE_NAME:คุณสมบัติแบบเป็นโปรแกรมให้กับ:CUSTOM_ID:+heading-title-lowercasedแต่ละหัวเรื่องได้หรือไม่
gsl

1
@gsl คุณสามารถให้คำแนะนำorg-set-propertyในการสร้างโดยอัตโนมัติคุณสมบัติเมื่อคุณตั้งค่า:EXPORT_FILE_NAME: :CUSTOM_ID:
itsjeyd

1
ขอบคุณสำหรับคำแนะนำ! ฉันไม่คล่องด้วยelispแต่ฉันจะลอง ฉันต้องการค้นหาวิธีจับชื่อหัวเรื่องแต่ละส่วนแทนที่ white space ด้วยเส้นประวางเป็นตัวพิมพ์เล็กเพิ่มสตริงที่ sanitized :CUSTOM_ID:และสุดท้ายตั้งค่าคุณสมบัติองค์กร
gsl

1
@gsl ฉันเพิ่มdefadviceคำตอบของฉันที่ชุดโดยอัตโนมัติ:EXPORT_FILE_NAME:ไปเมื่อคุณตั้งค่า<custom-id>-<heading> :CUSTOM_ID:
itsjeyd

1
ขอบคุณมากฉันได้เรียนรู้มากมายเกี่ยวกับรหัสของคุณ หากมีorg-modeไฟล์CUSTOM_IDที่ตั้งค่าไว้แล้วจะสามารถเรียกใช้รหัสเพื่อตั้งค่า "EXPORT_FILE_NAME" ได้อย่างไร จะไม่มีการแทรกใหม่ ฉันเดาว่าdefadviceจะไม่ทำงานเหรอ? มีระบบวนลูปเพื่อสำรวจส่วนหัวระดับบนสุดทั้งหมดและใช้รหัสกับพวกเขาหรือไม่?
gsl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.