0

我想在批处理模式下使用 Emacsorg从命令行将一些文件导出为 HTML。我想得到与交互式使用相同的结果C-cC-eh,特别是:

  • 尊重文件局部变量(例如org-export-publishing-directory
  • 尊重通过#+KEYWORD:标题指定的所有选项

从 中给出的示例开始org-export-as-html-batch,我到了这一点:

emacs --batch \
    --visit=/tmp/foo.org \
    --eval "(defun safe-local-variable-p (sym val) t)" \
    --funcall hack-local-variables \
    --eval "(setq org-export-headline-levels 4)" \
    --funcall org-export-as-html-batch

但是,仍然存在一些问题:

  • 我需要明确指定标题级别,但我不明白为什么所有其他#+OPTIONS都受到尊重(如toc:nil)但不是这个

  • 我不得不手动触发文件局部变量解析hack-local-variables(我猜它不会在批处理模式下自动完成)但更重要的是我不得不求助于将所有局部变量标记为安全(我确信有很多空间在这里改进)。


注意

万一这很重要,我使用的是 emacs 23.2.1(Debian Squeeze 风格)

这是我测试过的示例org文件:

#+TITLE: Foo
#+OPTIONS: H:4 toc:nil author:nil

* 1
** 2
*** 3
**** 4

# Local Variables:
#  org-export-publishing-directory: "/some/where";
# End:
4

1 回答 1

1

我最终得到了以下脚本,它似乎满足了我的所有要求:

#!/bin/sh
":"; exec emacs --script "$0" -- "$@" # -*-emacs-lisp-*-
;; 
;; Usage:
;;    org2html FILE1 [FILE2 ...]


;; Mark org-related variables as safe local variables,
;; regardless of their value.
(defun my/always-safe-local-variable (val) t)
(dolist (sym '(org-export-publishing-directory
               org-export-html-preamble
               org-export-html-postamble))
  (put sym 'safe-local-variable 'my/always-safe-local-variable))


(defun my/org-export-as-html (filename)
  "Export FILENAME as html, as if `org-export-to-html' had been called
interactively.

This ensures that `org-export-headline-levels' is correctly read from
the #+OPTIONS: headline."
  (save-excursion
    (find-file filename)
    (message "Exporting file `%s' to HTML" filename)
    (call-interactively 'org-export-as-html)))

(mapcar 'my/org-export-as-html
        (cdr argv)) ;; "--" is the first element of argv

关于这个脚本的几点说明:

  • 可执行的 emacs-lisp 脚本技巧来自这个问题

  • org-export-headline-levels我发现使用标题中的值的唯一方法是交互#+OPTIONS:调用,而不是.org-export-as-htmlorg-export-as-html-batch

  • hack-local-variables不需要显式调用,前提是在打开文件之前将局部变量标记为安全。

  • 我认为最好只使用safe-local-variable符号属性将与组织相关的变量标记为安全。

于 2013-01-03T21:21:20.700 回答