ऑर्ग-मोड बफर के शीर्ष-स्तरीय शीर्षकों को अलग-अलग फ़ाइलों में कैसे निर्यात करें?


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

जैसा कि डॉकस्ट्रिंग कहते हैं, प्रत्येक उपप्रकार के लिए आपको :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-stringतो जो कुछ भी आप चाहते हैं, उसके लिए सेक्सपी को बदलें ।

: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

    ... के :EXPORT_FILE_NAME:आधार पर Emacs सेट बनाने के लिए :CUSTOM_ID:

  • C-c C-f

    ... अगले शीर्ष-स्तरीय शीर्षक पर जाने के लिए।

  • F4

    ... रिकॉर्डिंग बंद करने के लिए।

अगले उपशीर्षक के लिए मैक्रो को दोहराने के लिए, दबाएं F4। के लिए मैक्रो को दोहराने के लिए सभी शेष subtrees, प्रेस M-0 F4(कि एक शून्य है)।

भविष्य के सत्रों के लिए मैक्रो को सहेजना

डिफ़ॉल्ट रूप से, कीबोर्ड मैक्रोज़ सत्रों में सहेजे नहीं जाते हैं। बाद में उपयोग के लिए अपनी इन-फाइल में मैक्रो को स्टोर करने के लिए, इसे करें:

  1. मैक्रो का नाम दें:

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

  2. अपनी init-file ढूंढें और उस स्थान पर जाएँ जहाँ आप मैक्रो सम्मिलित करना चाहते हैं।

  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
@ एलएसएल आप सेट करते समय संपत्ति org-set-propertyको स्वचालित रूप से उत्पन्न करने की सलाह दे सकते :EXPORT_FILE_NAME:हैं :CUSTOM_ID:
इसका अजायबघर

1
सलाह के लिए आभार! मैं उस धाराप्रवाह के साथ नहीं हूं elisp, लेकिन मैं कोशिश करूंगा मुझे यह जानने की ज़रूरत है कि प्रत्येक शीर्षक के शीर्षक को कैसे कैप्चर करें, डैश के साथ सफेद स्थान को स्थानापन्न करें, लोअरकेस में रखें, उस सैनिटाइज़्ड स्ट्रिंग को जोड़ें :CUSTOM_ID:और अंत में एक ऑर्ग प्रॉपर्टी सेट करें।
gsl

1
@gsl मैंने defadviceअपने उत्तर में एक जोड़ा है जो आपके द्वारा सेट किए :EXPORT_FILE_NAME:जाने पर स्वचालित रूप से सेट हो जाता है । <custom-id>-<heading>:CUSTOM_ID:
इसका अजायबघर

1
बहुत बहुत धन्यवाद, मैंने आपके कोड के साथ बहुत कुछ सीखा है। यदि किसी के पास पहले से ही कोई org-modeफ़ाइल है CUSTOM_ID, तो कोई "EXPORT_FILE_NAME" सेट करने के लिए कोड कैसे चला सकता है? नए सम्मिलन नहीं होंगे। मुझे लगता है defadviceकि काम नहीं करेगा? क्या सभी शीर्ष-स्तरीय शीर्षकों को पार करने और उनके लिए कोड लागू करने के लिए एक लूपिंग सुविधा है?
gsl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.