0

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

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

我写了以下函数 -

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

上述问题 -

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

4

2 回答 2

1

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

如果 COMMAND 以 & 符号结尾,则异步执行它。输出出现在缓冲区“ Async Sh​​ell Command ”中。该缓冲区处于外壳模式。

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

(defun abc-server ()
 (interactive)
 (shell-command "cd /opt/abc/; python abc.py &"))
于 2012-07-09T15:12:38.003 回答
0

虽然@jpkotta 的回答已经足够好,但适当的解决方案将使用Emacs 的 anync 原语。一方面,您一次只能运行一个异步 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篮筐并不完全满意。我希望我可以简单地 let-bind default-directory,但这似乎并没有像我预期的那样工作。或者,你可以(start-process "abc" "*abc-server*" "sh" "-c" "cd /opt/abc; python abc.py")。)

如果您需要进一步扩展命令,我认为这是一个比快速而肮脏的异步 shell 命令方法更具可扩展性的平台,但如果这就是您所需要的,那也没关系。

于 2013-11-27T08:52:56.003 回答