如何从Shell运行org-mode命令?

4
我希望能够通过bash脚本运行org-mode命令。例如,我有几个org mode文件需要导出为HTML,在我定义的一个项目下。然后我将这些文件同步到Web服务器等等。为此,我不想打开emacs并将文件导出为HTML文件,而是想从bash脚本中完成。
如何运行org-mode命令,例如:
M-x org-publish-project

然后输入项目名称,假设我们称之为 trial_project。如何在 shell 脚本中完成此操作?

2个回答

5
我发布这样的一个项目:

我发布了一个这样的项目:

emacs -batch --load publish-doc.el --eval '(org-publish "publish-doc")'

其中,publish-doc.el 包含“publish-doc”项目的定义。如果您可以通过ssh连接到服务器,甚至可以将 publishing-directory 设置为远程目录:org将使用tramp复制文件。

publish-doc.el 应该在必要时初始化 org-mode 并定义项目 - 具体细节可能取决于您是否使用随emacs一起提供的org-mode,或者您是使用来自MELPA或git repo的上游版本。但是,您应该能够模仿您在正常初始化中所做的操作并使其运行。在我的情况下,我必须修改load-path以找到org,因为我从上游git repo克隆:您可能根本不需要这样做,但如果您确实需要它,则需要修改路径以从中加载org。publish-doc.el 的以下最小示例将一组org文件发布到~/public_html 中的~/org - 这是从手册中的示例进行了适当的调整,只是我不得不添加发布函数:

(add-to-list 'load-path "~/src/emacs/org/org-mode/lisp/")

(require 'org)
(require 'ox-html)

(setq org-publish-project-alist
  '(("org"
     :base-directory "~/org/"
     :publishing-directory "~/public_html"
     :publishing-function org-html-publish-to-html
     :section-numbers nil
     :with-toc nil
     :html-head "<link rel=\"stylesheet\"
             href=\"../other/mystyle.css\"
             type=\"text/css\"/>")))

命令行调用如下:
 emacs -batch -l publish-doc.el --eval '(org-publish "org")'

谨遵意见:在使用 -batch 时,您必须加载初始化文件:-batch 意味着 -q,因此您的 .emacs 或相当的文件不会被加载。您可以使用 -l ~/.emacs,但通常包含大量无关的东西,因此当准备从命令行运行脚本时,大多数人都喜欢使用一个精简的初始化文件,其中仅包含当前任务所需的内容(参见上面的 publish-doc.el 文件)。


我想先将文件导出到本地文件夹,然后通过重新同步将文件同步到服务器。但是,当我从shell运行时emacs --batch --eval '(org-publish-project "trial_project")'我收到以下错误“Symbol's function definition is void: org-publish”。您能否更多地解释一下publish-doc.el? - sbilmis
编辑了答案并添加了一个例子。希望能有所帮助。 - NickD
感谢您提供详细信息,但我仍然遇到问题。您在publish-doc.el中提到的函数已在我的.emacs文件中定义。因此,在不加载该函数的情况下,我运行 emacs --batch --eval '(org-publish-project "org")' 但我仍然收到错误代码“Symbol`s function definition is void: org-publish”。 - sbilmis
你正在运行哪个版本的org-mode?你是否包含了(require ...)这些行? - NickD
当我在emacs中运行命令时,一切都正常。例如,在emacs中,M-x org-publish-project RET org,所有的org文件都会转换为定义文件夹内的html文件。唯一的问题是我无法从shell命令中执行它。我本来想把我的.emacs文件的相关部分发送给你,但由于评论区太长了,所以我不能这样做。 版本是(elpa) org-20170925/。我在你的建议后添加了(require 'org),但仍然收到相同的警告。 - sbilmis
显示剩余3条评论

1
你可以编写一个elisp函数,打开必要的缓冲区,然后执行导出操作。然后,如果你的emacs正在运行,你可以使用emacsclient -e ...来运行该函数。如果你的emacs没有运行,并且你想直接从命令行运行该函数,你可以使用emacs --batch --eval ...来运行该函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接