組織モードバッファの最上位の見出しを個別のファイルにエクスポートする方法は?


17

org-modeバッファの各トップレベルの見出しを、対応するCUSTOM_ID+(サニタイズ)タイトルの値にちなんで命名された個別のファイルにエクスポートするにはどうすればよいですか?

バッファに次のものが含まれているとしましょう:

* 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など)で、次のファイル名とコンテンツを含む2つの最上位見出しのそれぞれに1つずつ、2つのファイルを含むディレクトリになります。

  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. 2番目にエクスポートされた見出しのファイル名: mitochondrion-another-title-for-heading-2.[ext]

    元の2番目のトップレベルの見出しに対応するエクスポートされたコンテンツ:

    * 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

    ...に:EXPORT_FILE_NAME:基づいてEmacsセットを作成し:CUSTOM_ID:ます。

  • C-c C-f

    ...次のトップレベルの見出しに移動します。

  • F4

    ...記録を停止します。

次のサブツリーに対してマクロを繰り返すには、を押しF4ます。残りのすべてのサブツリーに対してマクロを繰り返すには、M-0 F4(ゼロ)を押します。

将来のセッションのためにマクロを保存する

デフォルトでは、キーボードマクロはセッション間で保存されません。後で使用するためにマクロをinitファイルに保存するには、次のようにします。

  1. マクロに名前を付けます。

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

  2. 初期化ファイルを見つけて、マクロを挿入したい場所に移動します。

  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てみると、マクロの記録時に押したキーのシーケンスが2番目の引数に含まれていることがわかります。

  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 14年

1
@gsl 設定時org-set-property:EXPORT_FILE_NAME:プロパティを自動的に生成することをお勧めします:CUSTOM_ID:
itsjeyd 14年

1
アドバイスありがとう!私はそれほど流ではありませんがelisp、試してみます。各見出しのタイトルをキャプチャし、空白文字をダッシュ​​で置き換え、小文字にして、サニタイズされた文字列を追加し:CUSTOM_ID:、最後に組織プロパティを設定する方法を見つける必要があります。
gsl 14年

1
@gsl あなたが設定したときにdefadvice自動的に設定:EXPORT_FILE_NAME:する私の回答にを追加しました。<custom-id>-<heading>:CUSTOM_ID:
itsjeyd 14年

1
本当にありがとうございました。あなたのコードで多くのことを学びました。sが設定されたorg-modeファイルが既にある場合CUSTOM_ID、「EXPORT_FILE_NAME」を設定するコードを実行するにはどうすればよいですか?新しい挿入はありません。defadvice動作しないと思いますか?すべてのトップレベルの見出しをトラバースし、それらにコードを適用するループ機能はありますか?
gsl 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.