让Emacs停止询问“存在活动进程;强制退出吗?”

36
尽管有很多人建议不要这样做,但我仍然希望Emacs在我按下C-c C-x时不再询问“存在活动进程;是否强制退出并杀死它们”。我希望它能够直接杀死所有的活动进程而不需要询问。

我该如何实现这个功能呢?


2
什么建议是一个坏主意? - Sam Brightman
6个回答

24

这段代码(放到你的.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))

对我不起作用。规格:Aquamacs 23.2.50.1 / Aquamacs-SLIME-2010-11-14 / Mac OS X 10.6.4 / MacBook Pro 5,1 - mcandre
2
flet非常酷,但不幸的是自Emacs 24.3以来已被弃用。然而,Nic Ferrier已经将其重新实现为noflet,可以通过package.el获得。最好使用它,或者使用下面的钩子解决方案(经过再次思考,defadvice本来就有点丑陋,所以钩子解决方案通常更好)。 - robru
我已更新此答案以使用cl-letf,它应该与cl-lib和词法绑定一起工作。 - Philipp
在我的情况下,我使用的是Ubuntu 16.04.7 LTS上的GNU Emacs 26.3。 - Keiku
在Debian Testing上,Emacs 27.1完美运行。非常感谢! - Marco Craveiro

19
你可以通过为每个进程设置 query-on-exit 标志为 nil 来实现这一点。 当执行命令解释器时,你可以使用钩子自动完成此操作:

您可以通过为每个进程设置 query-on-exit 标志为 nil 来实现这一点。 当执行命令解释器时,您可以使用钩子自动完成此操作:

(add-hook 'comint-exec-hook 
      (lambda () (set-process-query-on-exit-flag (get-buffer-process (current-buffer)) nil)))

4
请注意,文档中提到(关于process-kill-without-query):“自22.1版本以来,此函数已过时”,建议改用set-process-query-on-exit-flag代替。 - Sean
1
由于某些原因,我在使用comint-exec-hook时无法正常工作,改用multi-term后(钩子根本没有运行)。不得不将其切换到term-exec-hook,这样就可以了。 - robru

13
下一个版本的Emacs(25.3或26.1)将具有新的自定义选项confirm-kill-processes,以使此操作更简单。 您可以执行M-x customize-variable RET confirm-kill-processes RET,并将变量设置为nil以禁止确认提示。

1

这是我认为更好的解决方案,它专门忽略了只有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 Bronger
我不确定你之前是如何退出emacs的,但这是我通常退出emacs的方式,通过键入C-x C-c,它绑定了save-buffers-kill-terminal。这在内部调用了save-some-bufferssave-buffers-kill-terminal -> save-buffers-kill-emacs -> save-some-buffers),从而触发了建议。 - ealfonso

1

如果不进行黑客攻击,你是无法做到的。如果你想冒险的话,可以在你的.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))

1
(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))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接