【发布时间】:2010-04-24 23:16:27
【问题描述】:
尽管有人建议这是一个坏主意,但我仍然希望 Emacs 在我按下 C-c C-x 时停止询问我“活动进程存在;杀死它们并退出”。我希望它无需询问即可简单地杀死所有活动进程。
我怎样才能做到这一点?
【问题讨论】:
-
这是一个坏主意的建议是什么?
标签: emacs
尽管有人建议这是一个坏主意,但我仍然希望 Emacs 在我按下 C-c C-x 时停止询问我“活动进程存在;杀死它们并退出”。我希望它无需询问即可简单地杀死所有活动进程。
我怎样才能做到这一点?
【问题讨论】:
标签: emacs
这个 sn-p(进入你的 .emacs 自定义文件)会暂时让 Emacs 在你杀死它的时候认为没有活动进程,因此你不会得到烦人的提示。
(require 'cl-lib)
(defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate)
"Prevent annoying \"Active processes exist\" query when you quit Emacs."
(cl-letf (((symbol-function #'process-list) (lambda ())))
ad-do-it))
【讨论】:
flet 非常酷,但不幸的是,自 Emacs 24.3 起已弃用,但 Nic Ferrier 已将其重新实现为 noflet,可通过 package.el 获得。可能最好使用它,或者使用下面的其他解决方案和钩子(再想一想,defadvice 一开始有点难看,所以钩子解决方案通常可能更好)。
cl-letf,它应该与 cl-lib 和词法绑定一起使用。
您可以通过将每个进程的 query-on-exit 标志设置为 nil 来完成此操作。 您可以在执行命令解释器时使用钩子自动执行此操作:
(add-hook 'comint-exec-hook
(lambda () (set-process-query-on-exit-flag (get-buffer-process (current-buffer)) nil)))
【讨论】:
comint-exec-hook,使用multi-term(钩子根本没有运行)。必须将其切换到 term-exec-hook 并且有效。
Emacs 的下一个版本(25.3 或 26.1)将有一个新的自定义选项 confirm-kill-processes 以简化此操作。然后,您可以说 M-x customize-variable RET confirm-kill-processes RET 并将变量设置为 nil 以取消确认提示。
【讨论】:
你不能没有黑客。如果您喜欢冒险,请在您的.emacs 中替换save-buffers-kill-emacs 的定义,这样它就不会询问(但不要忘记每次升级 Emacs 时都重复该过程)。该函数的标准定义要求没有任何方法来自定义该行为。
编辑:
或者,您可以像这样重新定义yes-or-no-p(未经测试):
(defadvice yes-or-no-p (around hack-exit (prompt))
(if (string= prompt "Active processes exist; kill them and exit anyway? ")
t
ad-do-it))
【讨论】:
(if (get-buffer your-process-buffer)
(progn
(if (get-buffer-process your-process-buffer)
(set-process-query-on-exit-flag (get-buffer-process your-process-buffer) nil)
(kill-buffer your-process-buffer))))
【讨论】:
我认为这是一个更好的解决方案,它专门忽略了 SLIME 缓冲区:
(defun process-ignore-on-exit (regexp)
(cl-loop for proc in (process-list)
when (s-matches-p regexp (process-name proc))
do
(progn (message "disabling query-on-exit for '%s'" proc)
(set-process-query-on-exit-flag proc nil))))
(defun slime-ignore-processes-on-exit (&rest r)
(process-ignore-on-exit "SLIME"))
(advice-add #'save-some-buffers :before #'slime-ignore-processes-on-exit)
【讨论】: