2017-09-19 57 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 ...來運行你的函數。