尽管有很多人建议不要这样做,但我仍然希望Emacs在我按下C-c C-x时不再询问“存在活动进程;是否强制退出并杀死它们”。我希望它能够直接杀死所有的活动进程而不需要询问。
我该如何实现这个功能呢?
我该如何实现这个功能呢?
这段代码(放到你的.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本来就有点丑陋,所以钩子解决方案通常更好)。 - robrucl-letf
,它应该与cl-lib
和词法绑定一起工作。 - Philipp您可以通过为每个进程设置 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
,这样就可以了。 - robruconfirm-kill-processes
,以使此操作更简单。 您可以执行M-x customize-variable RET confirm-kill-processes RET
,并将变量设置为nil
以禁止确认提示。这是我认为更好的解决方案,它专门忽略了只有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)
save-some-buffers
才能看到效果。我将其替换为绑定在C-x C-c
上的save-buffers-kill-terminal
。这样做有什么不利之处吗? - Torsten BrongerC-x C-c
,它绑定了save-buffers-kill-terminal
。这在内部调用了save-some-buffers
(save-buffers-kill-terminal -> save-buffers-kill-emacs -> save-some-buffers
),从而触发了建议。 - ealfonso如果不进行黑客攻击,你是无法做到的。如果你想冒险的话,可以在你的.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))))