2012-07-09 409 views
0

我想寫一個emacs的功能,做以下 -需要幫助寫一個Emacs功能

1)啓動一個名爲「abc」新殼。 2)改變目錄 「/選擇/ ABC」 3)在dir運行shell命令 「蟒abc.py」

我已經寫下面的函數 -

(defun abc-server() 
(interactive) 
(shell-command "cd /opt/abc/") 
(shell-command "python abc.py")) 

與問題以上 -

1)它沒有啓動一個新的shell 2)它不改變目錄。 3)當cmd執行時,它會打開一個瀏覽器窗口,它完全阻止任何emacs的使用。

+0

謝謝,這是非常有益的。 – murtaza52 2012-07-10 07:55:41

回答

1

shell-command從的文檔字符串(C-h f shell-command):

如果COMMAND在符號結束時,異步地執行它。 輸出出現在緩衝區'異步外殼命令'中。 該緩衝區處於shell模式。

另外,將它組合成一個命令行。 shell-command每次都會創建一個新的shell,所以pwd不會從一次調用持續到另一次。

(defun abc-server() 
(interactive) 
(shell-command "cd /opt/abc/; python abc.py &")) 
+0

偉大的確解決了問題!如何將緩衝區名稱設置爲「abc-server」?這是啓動的異步shell的緩衝區。 – murtaza52 2012-07-10 06:55:30

+0

['rename-buffer'](http://www.gnu.org/software/emacs/manual/html_node/elisp/Buffer-Names.html)也許? – tripleee 2013-11-27 08:36:07

0

雖然@ jpkotta的答案足夠好,但正確的解決方案將使用anync primitives of Emacs。首先,您一次只能運行一個異步shell命令,而您可以擁有大量命名的子進程。

(defun abc-server() 
    (interactive) 
    ;; Create buffer ahead of time so we can change its default directory 
    (save-excursion 
    (get-buffer-create "*abc-server*") 
    (cd "/opt/abc")) 
    (start-process "abc" "*abc-server*" "python" "abc.py")) 

(我與save-excursion箍並不完全滿意。我希望我可以簡單地讓綁定default-directory,但似乎並沒有如我所預料的工作。另外,你可以(start-process "abc" "*abc-server*" "sh" "-c" "cd /opt/abc; python abc.py"))。

如果您需要進一步擴展命令,我認爲這是一個比快速和骯髒的異步shell命令方法更具可擴展性的平臺,但如果這是您所需要的全部內容,則無關緊要許多。

+0

也許'cd'歌曲和舞蹈實際上並不需要? 'python/opt/abc/abc.py'工作嗎? – tripleee 2013-11-27 08:57:48

+0

按照慣例,你不應該想要編輯或保存的臨時緩衝區就有這樣的名字。這是一個很好的約定,所以我堅持這樣做,即使你希望緩衝區名稱只是'abc-server'。 – tripleee 2013-11-27 09:03:19