当我输入 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时,我继续收到消息“活动进程存在;杀死它们然后退出?(是或否)”。
我如何实现目标?
谢谢!
答案 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