我想通过bash脚本运行org-mode命令。例如,我有几个组织模式文件要导出到我定义的项目下的html。然后我将文件同步到Web服务器等。因此,在不打开emacs并将文件导出到html文件的情况下,我想从bash脚本中执行此操作。
如何运行org-mode命令,如
M-x org-publish-project
然后输入项目名称,让我们说一下,trial_project。我怎么能在shell脚本中做到这一点?
答案 0 :(得分:3)
我发布了这样一个项目:
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 。但是你应该能够模仿你在正常初始化中所做的事情,然后继续前进。在我的情况下,我必须修改我的加载路径以找到组织,因为我从上游git repo克隆:你可能根本不需要它,但如果你确实需要它,你将需要修改到哪里的路径< em>您的组织已加载。以下最小publish-doc.el
在~/org
到~/public_html
中发布了一组组织文件 - 这是从example in the manual改编的,除了我必须添加发布功能:
(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")'
HTH。
编辑:正如评论中所提到的,当使用-batch
时,必须加载初始化文件:-batch
隐含-q
所以.emacs
或等效的不加载。你可以使用-l ~/.emacs
,但这通常包含很多无关紧要的东西,所以在准备从命令行运行的脚本时,大多数人更喜欢使用仅包含内容的修剪初始化文件对于手头的任务是必要的(参见上面的publish-doc.el
文件)。
答案 1 :(得分:1)
您可以编写一个elisp函数来打开必要的缓冲区,然后进行导出。然后,如果您的emacs正在运行,您可以使用emacsclient -e ...
来运行该功能。如果您的emacs未运行且您想直接从命令行运行您的功能,则可以使用emacs --batch --eval ...
来运行您的功能。