【问题标题】:Batch export of org-mode files from the command line从命令行批量导出 org-mode 文件
【发布时间】:2014-03-31 03:12:30
【问题描述】:

假设我在某个目录中有几个 org-mode 文件:foo1.org、foo2.org 等。我想要一个可以调用类似的脚本(可能是一个 makefile)

$ generate-pdfs

会生成foo1.pdf、foo2.pdf等。

我认为像emacs --batch --eval <MAGIC> 这样的东西是一个好的开始,但我不知道其中的魔力。

内部 emacs 的解决方案也可能很有趣。

【问题讨论】:

    标签: emacs org-mode


    【解决方案1】:

    正如你所说,Emacs 有--batch 选项可以从shell 对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
    

    编辑:

    使用 Org-mode 8 和新的导出引擎,HTML 导出功能发生了变化。

    要使前面的示例适用于 Org 7 或更早版本,请将 org-html-export-to-html 替换为 org-export-as-html。

    【讨论】:

    • --batch 暗示 -q 反过来不会加载我的 .emacs。如何告诉 emacs 加载 特定 初始化文件?
    • 我猜你可以使用--batch -l my_init_file.el -f org-latex-export-to-pdf 来加载你的初始化文件,然后调用导出函数。
    • 也是我使用的速记,将目标文件作为emacs 的第一个参数,这不是最简洁的方法。正确的做法是emacs --batch --visit myorgfile.org -f […]。这将允许您使用相同的命令处理多个文件(通过在命令中添加其他 --visit 选项)
    • emacs -q 禁用了更新版本的org (我使用ELPA 安装)的加载。因此,我不得不使用-l 选项并加载一个包含(package-initialize) 的初始化文件。这允许在batch 模式下使用较新版本的org。
    【解决方案2】:

    我希望(在本周末结束之前)发布 OrgMk,这是一套 Makefile 和独立的 Bash 脚本(在 Cygwin 下也可以使用)只是为了做到这一点!更多:生成 HTML、Ascii、Beamer 等。

    您可以在我的 GitHub 帐户上找到它:https://github.com/fniessen/(我已经有 Emacs 配置文件、颜色主题和其他东西,例如 Org Babel 引用卡——正在开发中)。

    【讨论】:

      【解决方案3】:

      在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)))
      

      【讨论】:

      • +1。但我想要更自动的东西。也许这个函数可以请求一个目录,然后处理给定目录中的所有.orgs?
      • 这是可行的。虽然对我来说dired 是默认状态。你知道你可以用*%org标记dired中的所有组织文件吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多