退出Emacs时自动停止进程

时间:2013-12-02 22:59:23

标签: emacs hook

当我输入 Cx Cc 命令(save-buffers-kill-terminal退出)时,我试图使用命令 httpd-stop 来停止simple-httpd服务器emacs),因为我想摆脱“活动进程存在;杀死它们并且无论如何退出?(是或否)”消息每次我键入Cx Cc。 为了实现我的目标,我正在考虑编写一个类似的钩子:

(add-hook 'save-buffers-kill-terminal
                (lambda () (httpd-stop)
                    ))

但它没有用。当我输入C-x C-c时,我继续收到消息“活动进程存在;杀死它们然后退出?(是或否)”。

我如何实现目标?

谢谢!

1 个答案:

答案 0 :(得分:3)

没有名为save-buffers-kill-terminal的挂钩。

这个名称有一个函数,但每个函数都不会自动存在钩子(advice机制确实有效,但你不需要在这里(编辑:或者也许)你这样做;见下文))。

只有存在使用run-hooks或类似(例如C-u C-h a run.*hook RET)明确运行它的代码时,才存在钩子。或者更具体地说,您可以add-hook使用任意变量,但它永远不会将作为一个钩子,除非运行它。

通常,您将使用kill-emacs-hook中的任何一个(如果回调不需要与用户交互),或者kill-emacs-query-functions如果需要进行交互。有关详细信息,请参阅每个变量的帮助。

编辑:

在活动进程的情况下,需要一种不同的机制,因为这些查询在任何一个钩子运行之前发生。

如果您只是想避免查询并让该进程被终止,您可以使用set-process-query-on-exit-flag。这将设置每进程标志,以确定是否将发生此查询:

set-process-query-on-exit-flag is a built-in function in `process.c'.

(set-process-query-on-exit-flag PROCESS FLAG)

Specify if query is needed for PROCESS when Emacs is exited.
If the second argument FLAG is non-nil, Emacs will query the user before
exiting or killing a buffer if PROCESS is running.  This function
returns FLAG.

您可能会在开始此过程时安排此操作(假设您有一些启动httpd的代码),使用PROCESS(get-process NAME)获取(get-buffer-process BUFFER)。我没有使用这个httpd库,所以我不知道你在这里需要什么。

如果你肯定想要调用像httpd-stop这样优雅的关闭功能,我认为你需要做一些自定义的事情。

(defadvice save-buffers-kill-emacs (before my-httpd-auto-stop)
  (when (httpd-is-running-p) ;; not a real predicate
    (httpd-stop)))
(ad-activate 'save-buffers-kill-emacs)

您必须弄清楚用什么代替我的假设httpd-is-running-p,以确定是否要调用停止功能。

请注意,这会在任何其他查询之前运行,因此您可能会以这种方式停止httpd,但最终决定不杀死emacs(但不管怎样都可以这样做。)

编辑:或者,因为无论httpd是否正在运行,调用此停止函数显然是安全的,您可以使用以下内容(包括添加的测试以查看是否{{1}定义,因为调用它将是一个错误,否则,我不知道你如何加载库):

httpd-stop