2

如何在 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;
}
4

2 回答 2

2

据我所知,没有任何方法可以阻止 Emacs 在退出时终止其子进程,无论是同步、异步还是通过shell-command. 如果您使用任何 Emacs 原语来执行子进程(即,start-processcall-process它们的变体)并尝试在进程完成之前退出 Emacs,Emacs 总是会提示您终止它们,或者如果您设置了自动终止它们process-query-on-exit-flagnil每个所述过程。尝试使用某种基于 shell 的hackeryshell-command以及诸如, ,等bash内置函数是没有意义的,因为最终会调用上述或原语。bgdisownsetsidshell-commandstart-processcall-process

顺便说一句,我认为 ELisp 是一个非常糟糕的脚本选择(如果您的脚本不是完全用 ELisp 编写的,那么我无法理解为什么需要从 Emacs 本身执行子进程)。您可能会考虑的一种可能性是将 Emacs 作为守护程序启动(它会自动将 Emacs 从控制终端分离并启动emacsclient可以与之通信的服务器进程)并使用emacsclient -e它来向它发出命令。我不知道这是否适用,但它可能有用。

您还没有真正提供有关您的脚本的任何细节,因此目前很难提供任何进一步的具体建议。我会这样说:明智的做法是简单地编写脚本中需要独立于 Emacs 运行的部分,bash并使用其作业控制机制(即运行后台进程和disown它等),或其他一些脚本语言,例如 Perl(我相信它明确地有自己的fork()功能)。

于 2012-06-29T08:33:54.450 回答
2

它可能无法完全回答您的问题,但以下软件包与您想要的非常相似:https ://bitbucket.org/jpkotta/openwith/overview

它基本上用外部程序(如 okular、gimp...)打开一个文件,然后

“在 Unix 上将命令包装在 nohup 中,因此如果 Emacs 退出,启动的进程将不会退出。”

我不知道它的实现细节,但你可以尝试阅读他们的代码。为我工作。

于 2013-07-26T16:17:42.820 回答