Następujące polecenie pozwala wybrać zaplecze, a następnie eksportuje każde poddrzewo najwyższego poziomu do osobnego pliku:
(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))))
Obsługuje to obecnie eksport HTML ( html
), LaTeX ( latex
) i PDF ( pdf
). Możesz dodać obsługę większej liczby back-endów, dodając więcej klauzul do cond
.
Jak głosi dokument, dla każdego poddrzewa należy ustawić :EXPORT_FILE_NAME:
właściwość na nazwę pliku, do którego ma zostać wyeksportowany. (Zobacz inne opcje poniżej).
Automatyczne generowanie nazwy pliku eksportu z tekstu nagłówka
Jeśli nie chcesz dodawać :EXPORT_FILE_NAME:
właściwości do każdego nagłówka najwyższego poziomu, możesz zmodyfikować, org-export-all
aby automatycznie wygenerować nazwę pliku np. Z tekstu nagłówka, ustawiając tymczasowo :EXPORT_FILE_NAME:
podczas eksportu:
(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))))
Ta funkcja generuje nazwę pliku eksportu, zastępując spacje znakiem „_” w tekście nagłówka. Jeśli chcesz wygenerować nazwę pliku w inny sposób, zmień replace-regexp-in-string
płeć na dowolną.
Generowanie :EXPORT_FILE_NAME:
podczas ustawiania:CUSTOM_ID:
Z następującymi wskazówkami org-set-property
automatycznie ustawi odpowiednią wartość :EXPORT_FILE_NAME:
podczas ustawiania :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))))
Zauważ, że nie doda to rozszerzenia pliku do wartości, :EXPORT_FILE_NAME:
ale to nie ma znaczenia, ponieważ podczas eksportowania do określonego zaplecza org-mode
automatycznie wybierze prawidłowe rozszerzenie dla plików wynikowych .
Dodatkowe informacje
Zbiorcza aktualizacja istniejących poddrzewa
Jeśli masz wiele istniejących poddrzew, dla których musisz ustawić :EXPORT_FILE_NAME:
właściwość, możesz użyć makra klawiatury . Ustaw punkt na pierwszym poddrzewie, a następnie wykonaj następujące czynności:
F3
... aby rozpocząć nagrywanie.
C-c C-x p CUSTOM_ID
RET RET
... aby ustawić Emacsa :EXPORT_FILE_NAME:
na podstawie :CUSTOM_ID:
.
C-c C-f
... aby przejść do następnego nagłówka najwyższego poziomu.
F4
... aby zatrzymać nagrywanie.
Aby powtórzyć makro dla następnego poddrzewa, naciśnij F4. Aby powtórzyć makro dla wszystkich pozostałych poddrzew, naciśnij M-0 F4(to zero).
Zapisywanie makr na przyszłe sesje
Domyślnie makra klawiaturowe nie są zapisywane między sesjami. Aby zapisać makro w pliku inicjującym do późniejszego wykorzystania, wykonaj następujące czynności:
Nazwij makro:
M-x name-last-kbd-macro
RET org-set-export-file-name
RET
Znajdź plik init i przejdź do miejsca, w którym chcesz wstawić makro.
Wstaw makro:
M-x insert-kbd-macro
RET org-set-export-file-name
RET
Emacs wstawi następujący kod w punkcie:
(fset 'org-set-export-file-name
"\C-c\C-xpCUSTOM_ID\C-m\C-m\C-c\C-f")
Jeśli zmrużysz wystarczająco mocno, zobaczysz, że drugi argument fset
zawiera sekwencję klawiszy naciśniętych podczas rejestrowania makra :)
(Opcjonalnie) Aby uzyskać najlepsze wyniki, możesz powiązać org-set-export-file-name
z kluczem:
(define-key org-mode-map (kbd "<f6>") 'org-set-export-file-name)
Zapisać.
:EXPORT_FILE_NAME:
właściwość:CUSTOM_ID:+heading-title-lowercased
dla każdego nagłówka?org-set-property
automatyczne generowanie:EXPORT_FILE_NAME:
właściwości po ustawieniu:CUSTOM_ID:
.elisp
, ale spróbuję. Muszę dowiedzieć się, jak uchwycić tytuł każdego nagłówka, zastąpić białe znaki myślnikiem, umieścić małe litery, dodać ten odkażony ciąg:CUSTOM_ID:
i wreszcie ustawić właściwość org.defadvice
do mojej odpowiedzi, która automatycznie ustawia się:EXPORT_FILE_NAME:
na<custom-id>-<heading>
kiedy ustawiasz:CUSTOM_ID:
.org-mode
plik zCUSTOM_ID
ustawieniem s, jak można uruchomić kod, aby ustawić „EXPORT_FILE_NAME”? Nie będzie nowych wstawek. Zgaduję,defadvice
że nie zadziała? Czy istnieje funkcja zapętlania, która umożliwia przeglądanie wszystkich nagłówków najwyższego poziomu i stosowanie do nich kodu?