如何在emacs lisp程序结束后继续运行emacs lisp中的流程?我正在编写一个应该启动交互式GUI程序并退出的实用程序脚本。
提前致谢。
编辑:我想我正在寻找与此C ++代码等效的emacs lisp。
#include <cstdlib>
#include <sys/types.h>
#include <unistd.h>
int main() {
using namespace std;
pid_t p = fork();
if (p == 0) {
// child process
execl("process_to_run", "process_to_run", nullptr);
} else {
// stuff for parent to do
}
return 0;
}
答案 0 :(得分:2)
据我所知,没有办法阻止Emacs在退出时终止其子进程,无论是同步,异步还是通过shell-command
执行。如果您使用任何Emacs原语执行子进程(即start-process
或call-process
及其变体)并尝试在进程完成之前退出Emacs,Emacs将总是提示您杀死如果您为每个所述进程设置process-query-on-exit-flag
到nil
,则自动终止它们。尝试使用某种基于shell的hackery涉及shell-command
和bash
内置插件,例如bg
,disown
,setsid
等,这是毫无意义的,因为{ {1}}最终会调用前面提到的shell-command
或start-process
原语。
顺便说一句,我认为ELisp是脚本编写的极其糟糕的选择(如果你的脚本不是完全用ELisp编写的话,那么我就无法理解为什么你需要从Emacs本身执行你的子进程)。您可能考虑的一种可能性是将Emacs作为守护程序启动(它会自动将Emacs从控制终端分离并启动call-process
可以与之通信的服务器进程)并使用emacsclient
向其发出命令。我不知道这是否适用,但它可能有用。
您尚未提供有关脚本的任何详细信息,因此此时很难提供任何进一步的具体建议。我会这样说:理所当然的事情就是编写需要在emacsclient -e
中独立于Emacs运行的脚本部分并使用其作业控制机制(即运行后台进程和{{1}或者其他一些脚本语言,比如Perl(我认为它明确地有自己的bash
函数)。
答案 1 :(得分:2)
它可能无法完全回答您的问题,但以下软件包与您想要的内容非常相似:https://bitbucket.org/jpkotta/openwith/overview
它基本上打开一个带有外部程序的文件(例如okular,gimp ......)和
“在Unix上用nohup包装命令,因此如果Emacs退出,启动的进程将不会退出。”
我不知道它的实现细节,但您可以尝试阅读它们的代码。适合我。