Подтвердить что ты не робот

Пакетный экспорт файлов org-mode из командной строки

Предположим, что у меня есть в определенном каталоге несколько org-mode файлов: foo1.org, foo2.org и т.д. Я хотел бы иметь script (возможно, make файл), который мог бы вызвать что-то вроде

$ generate-pdfs

и foo1.pdf, foo2.pdf и т.д.

Я думал, что что-то вроде emacs --batch --eval <MAGIC> - хорошее начало, но я не знаю волшебства.

Решение, которое находится исключительно внутри emacs, также может представлять интерес.

4b9b3361

Ответ 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)))