Пакетный экспорт файлов org-mode из командной строки
Предположим, что у меня есть в определенном каталоге несколько org-mode
файлов: foo1.org
, foo2.org
и т.д. Я хотел бы иметь script (возможно, make файл), который мог бы вызвать что-то вроде
$ generate-pdfs
и foo1.pdf
, foo2.pdf
и т.д.
Я думал, что что-то вроде emacs --batch --eval <MAGIC>
- хорошее начало, но я не знаю волшебства.
Решение, которое находится исключительно внутри emacs, также может представлять интерес.
Ответы
Ответ 1
Как вы сказали, Emacs имеет параметр --batch
для выполнения операций с Emacs из оболочки. Кроме того, вы можете использовать флаг -l
для загрузки кода Emacs Lisp из файла и его выполнения, а флаг -f
- для выполнения одной функции Lisp.
Вот базовый пример, который экспортирует один файл org-mode в HTML:
emacs myorgfile.org --batch -f org-html-export-to-html --kill
Возможно, вам нужно что-то более продвинутое, например, экспортировать/опубликовать полный проект в режиме org-mode. У меня нет образца кода для этого, но он не должен быть слишком сложным.
У меня также есть образец Makefile, который я написал некоторое время назад, чтобы экспортировать все файлы в режиме org-mode в каталог в HTML (а также скопировать файлы HTML в другой каталог):
OUT_DIR=/some/output/dir/html
# Using GNU Make-specific functions here
FILES=$(patsubst %.org,$(OUT_DIR)/%.html,$(wildcard *.org))
.PHONY: all clean install-doc
all: install-doc
install-doc: $(OUT_DIR) $(FILES)
$(OUT_DIR):
mkdir -v -p $(OUT_DIR)
%.html: %.org
emacs $< --batch -f org-html-export-to-html--kill
$(OUT_DIR)/%.html: %.html
install -v -m 644 -t $(OUT_DIR) $<
rm $<
clean:
rm *.html
EDIT:
С Org-mode 8 и новым механизмом экспорта функция экспорта HTML изменилась.
Чтобы предыдущие примеры работали с Org 7 или старше, замените org-html-export-to-html
на org-export-as-html
.
Ответ 2
Я ожидаю опубликовать (к концу этого выходного дня) OrgMk, набор Makefile и автономные скрипты Bash (также используемые под Cygwin), чтобы это сделать! Еще больше: генерация HTML, Ascii, Beamer и т.д.
Вы найдете его в моей учетной записи GitHub: https://github.com/fniessen/ (где у меня уже есть файлы конфигурации Emacs, цветные темы и прочее в качестве репрезентации Org Babel).
Ответ 3
Отметьте несколько файлов org в dired
и вызовите это:
(defun dired-org-to-pdf ()
(interactive)
(mapc
(lambda (f)
(with-current-buffer
(find-file-noselect f)
(org-latex-export-to-pdf)))
(dired-get-marked-files)))
Если вы знаете, что такое асинхронный вызов, заверните вызов, поскольку это может занять некоторое время.
обновление:
Здесь версия, которая сочетает в себе удивительный подход dired
с хромым
другой:)
(defun dired-org-to-pdf ()
(interactive)
(let ((files
(if (eq major-mode 'dired-mode)
(dired-get-marked-files)
(let ((default-directory (read-directory-name "dir: ")))
(mapcar #'expand-file-name
(file-expand-wildcards "*.org"))))))
(mapc
(lambda (f)
(with-current-buffer
(find-file-noselect f)
(org-latex-export-to-pdf)))
files)))