分享:保存时自动导出的一种优雅方案

在之前,如果想让 Org 文件在保存时自动导出,可以在其开头配置本地变量:

# -*- after-save-hook: org-latex-export-to-latex; org-export-in-background: t; -*-

但这还是太长了一点,不便记忆也不便输入。 而且,每次打开文件时还可能弹出警告。 ——不够优雅。

这里提供一种基于 Org 文件自定义属性的方案。 Elisp 配置如下:

(defun my-org-oxauto ()
  "Auto export when saving for Org mode."
    (let ((oxauto (org-collect-keywords '("oxauto"))))
    (when oxauto
      (dolist (keywords oxauto)
        (let ((export-formats (split-string (cadr keywords) "," t " ")))
          (dolist (export-format export-formats)
            (pcase export-format
              ("latex"
               (setq org-export-in-background t)
               (add-hook 'after-save-hook 'org-latex-export-to-latex nil t))
              ("html"
               (setq org-export-in-background t)
               (add-hook 'after-save-hook 'org-html-export-to-html nil t))
              )))))))

(add-hook 'org-mode-hook 'my-org-oxauto)

用法:在 Org 文件中,使用 #+oxauto: 指定要自动导出的格式名称,多个格式名称用逗号分隔。

例如 #+oxauto: html,latex ,这样在每次保存时就会在后台自动导出到 html 和 latex。

以上示例仅支持 html 和 latex,想要使用其他导出格式也较为容易,向 (pcase export-format 这行下面添加对应格式的配置即可。

注意,可能需要 kill buffer 再重进才能生效。

5 个赞

需要注意的一个问题是,在设置 (setq org-export-in-background t) 之后,必须通过保存来自动导出,而不能手动调用导出命令,否则会报错 Process ‘org-export-process’ exited abnormally

感觉不错,我没有需要保存时导出htm,pdf等,但为了保存时把org文件时在数据库也存一份,做了一个 保存修改 按钮每次去点,有时候会忘记自己点过没,又怕内容没存上,于是有时会点N回。

一直没想明白怎么优雅的用正常的保存文件来触发这个操作,每次想做结果感觉都不理想。在需要这样保存的org文件里加上 #+oxauto: orgcms-save ,保存时触发,应该是一个不错的方案。