Kuruluş modu arabelleğinin üst düzey başlıklarını ayrı dosyalara nasıl dışa aktarabilirim?


17

Bir org-modeara belleğin her üst düzey başlığı , karşılık gelen CUSTOM_ID+ (dezenfekte edilmiş) başlığın değerinden sonra adlandırılan ayrı bir dosyaya nasıl aktarılabilir ?

Diyelim ki bir tampon şunları içeriyor:

* 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.

Nihai sonuç, dışa aktarma zamanında seçilen biçim ile (HTML, LaTeX, vb.) Aşağıdaki dosya adları ve içerikle birlikte iki üst düzey başlığın her biri için bir tane olmak üzere iki dosya içeren bir dizin olacaktır:

  1. İlk dışa aktarılan başlığın dosya adı: fibrillogenesis-title-of-heading-1.[ext]

    Orijinal ilk üst düzey başlığa karşılık gelen dışa aktarılan içerik:

    * Title of Heading 1
      :PROPERTIES:
      :CUSTOM_ID: fibrillogenesis
      :END:
      Suspendisse potenti. Mauris ac felis vel velit tristique imperdiet.  
    
    ** Sub-Heading 
       Nullam rutrum.
    
  2. Dışa aktarılan ikinci başlığın dosya adı: mitochondrion-another-title-for-heading-2.[ext]

    Orijinal ikinci üst düzey başlığa karşılık gelen dışa aktarılan içerik:

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

Herhangi bir ipucu, yön, sözde kod veya (daha iyi) gerçek kod için çok minnettar olurum.

Yanıtlar:


27

Aşağıdaki komut bir arka uç seçmenizi ve ardından her bir üst düzey alt ağacı ayrı bir dosyaya aktarmanızı sağlar:

(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))))

Bu şu anda HTML ( html), LaTeX ( latex) ve PDF ( pdf) dışa aktarmayı desteklemektedir . Daha fazla cümle ekleyerek daha fazla arka uç desteği ekleyebilirsiniz cond.

Docstring'in dediği gibi, her alt ağaç için :EXPORT_FILE_NAME:özelliği dışa aktarılmasını istediğiniz dosya adına ayarlamanız gerekir . (Diğer seçenekler için aşağıya bakın.)

Başlık metninden otomatik olarak dışa aktarma dosya adı oluşturma

:EXPORT_FILE_NAME:Her üst düzey başlığa özellik eklemek istemiyorsanız org-export-all, :EXPORT_FILE_NAME:dışa aktarma sırasında geçici olarak ayarlanan, örneğin başlık metninden dosya adını otomatik olarak oluşturmak için değiştirebilirsiniz :

(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))))

Bu işlev, başlık metnindeki boşlukları "_" ile değiştirerek dışa aktarma dosya adını oluşturur. Dosya replace-regexp-in-stringadını başka bir şekilde oluşturmak istiyorsanız, sexp'i istediğiniz gibi değiştirin.

Oluşturuluyor :EXPORT_FILE_NAME:ayarlarken:CUSTOM_ID:

Aşağıdaki önerilerle, org-set-propertyayarladığınızda otomatik olarak uygun bir değer :EXPORT_FILE_NAME:ayarlayacaktır :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))))

Bunun değerine bir dosya uzantısı eklemeyeceğini, :EXPORT_FILE_NAME:ancak bunun önemli olmadığını unutmayın, çünkü belirli bir arka uca dışa aktarırken org-mode , elde edilen dosyalar için otomatik olarak doğru uzantıyı seçecektir .


Ek bilgi

Mevcut alt ağaçları toplu olarak güncelleme

:EXPORT_FILE_NAME:Özelliği ayarlamanız gereken çok sayıda mevcut alt ağaç varsa, bir klavye makrosu kullanabilirsiniz . İlk alt ağaçtaki konumlandırın, ardından aşağıdakileri yapın:

  • F3

    ... kayda başlamak için.

  • C-c C-x p CUSTOM_ID RET RET

    ... Emacs'ı :EXPORT_FILE_NAME:temel alıyor :CUSTOM_ID:.

  • C-c C-f

    ... bir sonraki üst düzey başlığa geçmek için.

  • F4

    ... kaydı durdurmak için.

Makroyu sonraki alt ağaç için tekrarlamak için tuşuna basın F4. Makroyu kalan tüm alt ağaçlar için tekrarlamak için M-0 F4(bu sıfırdır).

Gelecek oturumlar için makro kaydetme

Varsayılan olarak, klavye makroları oturumlar arasında kaydedilmez. Makroyu daha sonra kullanmak üzere init dosyanızda saklamak için şunu yapın:

  1. Makroyu adlandırın:

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

  2. İnit dosyanızı bulun ve makroyu eklemek istediğiniz bir noktaya gidin.

  3. Makroyu ekleyin:

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

    Emacs şu kodu ekler:

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

    Yeterince sert gözükürseniz, ikinci argümanın fsetmakroyu kaydettiğinizde bastığınız tuşların sırasını içerdiğini görebilirsiniz :)

  4. (İsteğe bağlı) En iyi sonuçlar org-set-export-file-nameiçin bir anahtara bağlamak isteyebilirsiniz :

    (define-key org-mode-map (kbd "<f6>") 'org-set-export-file-name)
  5. Kayıt etmek.


1
Güzel. Her başlık için programlı olarak :EXPORT_FILE_NAME:özelliği nasıl ayarlayacağınıza dair bir ipucu verebilir misiniz :CUSTOM_ID:+heading-title-lowercased?
gsl

1
@gsl Ayarladığınızda özelliği org-set-propertyotomatik olarak oluşturmayı önerebilirsiniz . :EXPORT_FILE_NAME::CUSTOM_ID:
itsjeyd

1
Tavsiye için teşekkür ederim! Ben o kadar akıcı değilim elisp, ama deneyeceğim. Her başlığın başlığını yakalamak, çizgi ile beyaz boşluk yerine, küçük harfe koymak, bu sterilize dize eklemek :CUSTOM_ID:ve nihayet bir org özelliği ayarlamak için nasıl öğrenmek gerekir .
gsl

1
@gsl bir katma defadvicebenim cevap otomatik olarak ayarlar o :EXPORT_FILE_NAME:kadar <custom-id>-<heading>ayarladığınız zaman :CUSTOM_ID:.
itsjeyd

1
Çok teşekkür ederim, kodunuzla çok şey öğrendim. Birinin önceden ayarlanmış bir org-modedosyası varsa CUSTOM_ID, "EXPORT_FILE_NAME" ayarını yapmak için kodu nasıl çalıştırabilirsiniz? Yeni eklemeler olmazdı. Sanırım defadviceişe yaramaz mı? Tüm üst düzey başlıkların üzerinden geçip kodu bunlara uygulamak için bir döngü olanağı var mı?
gsl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.