我想写一个执行以下操作的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的任何使用。
答案 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命令方法更具可扩展性的平台,但是如果这是你需要的全部,那就没关系了