需要帮助编写emacs功能

时间:2012-07-09 06:34:19

标签: emacs

我想写一个执行以下操作的emacs函数 -

1)启动一个名为“abc”的新shell。 2)更改目录“/ opt / abc” 3)在dir中运行一个shell命令“python abc.py”

我写了以下函数 -

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

以上问题 -

1)它没有启动新的shell 2)它不会改变目录。 3)当cmd执行时,它会打开一个浏览器窗口,完全阻止对emacs的任何使用。

2 个答案:

答案 0 :(得分:1)

来自shell-command的文档字符串(C-h f shell-command):

  

如果COMMAND以&符号结尾,则异步执行。   输出显示在缓冲区“异步Shell命令”中。   该缓冲区处于shell模式。

此外,将它们全部合并到一个命令行中。 shell-command每次创建一个新的shell,因此pwd不会从一次调用持久存在。

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

答案 1 :(得分: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命令方法更具可扩展性的平台,但是如果这是你需要的全部,那就没关系了