在lisp程序结束后继续在emacs lisp中启动进程

时间:2012-06-28 20:05:54

标签: emacs elisp

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

2 个答案:

答案 0 :(得分:2)

据我所知,没有办法阻止Emacs在退出时终止其子进程,无论是同步,异步还是通过shell-command执行。如果您使用任何Emacs原语执行子进程(即start-processcall-process及其变体)并尝试在进程完成之前退出Emacs,Emacs将总是提示您杀死如果您为每个所述进程设置process-query-on-exit-flagnil,则自动终止它们。尝试使用某种基于shell的hackery涉及shell-commandbash内置插件,例如bgdisownsetsid等,这是毫无意义的,因为{ {1}}最终会调用前面提到的shell-commandstart-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退出,启动的进程将不会退出。”

我不知道它的实现细节,但您可以尝试阅读它们的代码。适合我。