2017-09-19 58 views
1

我想通过bash脚本运行org-mode命令。例如,我有几个组织模式文件在我定义的项目下导出到html。然后我将文件同步到网络服务器等。因此,如果不打开emacs并将文件导出到html文件,我想从bash脚本中完成。如何从shell运行组织模式命令?

如何运行组织模式的命令,如

M-x org-publish-project 

然后输入项目名称让我们说,trial_project。我怎么能在shell脚本中做到这一点?

回答

2

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

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

其中publish-doc.el包含“发布 - DOC”项目的定义。如果你可以SSH到你的服务器,你甚至可以让publishing-directory是远程的:组织将使用tramp复制文件。

publish-doc.el如果需要应初始化组织模式并定义项目 - 细节可能取决于您是使用emacs附带的组织模式,还是使用MELPA或git回购的上游版本。但是你应该能够模拟你在正常的初始化中所做的事情并让它发挥作用。在我的情况下,我不得不修改我的加载路径以查找组织,因为我从上游的git repo克隆:您可能完全不需要这种组织,但如果您确实需要它,则需要修改路径以便在其中找到您的组织已从中加载。以下最低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文件)。

+0

我想先导出到本地文件夹,然后通过resync将文件同步到服务器。但是,当我运行shell 'emacs --batch --eval'(org-publish-project“trial_project”)'' 我收到以下错误“符号的函数定义为void:org-publish”。你能解释更多关于publish-doc.el吗? – sbilmis

+0

编辑答案以添加示例。希望能帮助到你。 – Nick

+0

感谢您的详细信息,但我仍然有问题。您在publish-doc.el中提到的功能是在我的.emacs文件中定义的。因此在不加载函数的情况下,我运行了 'emacs --batch --eval'(org-publish-project“org”)''但我仍然得到错误代码“Symbol's的函数定义是void:org-发布“ – sbilmis

1

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