【问题标题】:Make Emacs stop asking "Active processes exist; kill them and exit anyway"让 Emacs 停止询问“活动进程存在;杀死它们并退出”
【发布时间】:2010-04-24 23:16:27
【问题描述】:

尽管有人建议这是一个坏主意,但我仍然希望 Emacs 在我按下 C-c C-x 时停止询问我“活动进程存在;杀死它们并退出”。我希望它无需询问即可简单地杀死所有活动进程。

我怎样才能做到这一点?

【问题讨论】:

  • 这是一个坏主意的建议是什么?

标签: emacs


【解决方案1】:

这个 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))

【讨论】:

  • 对我不起作用。规格:Aquamacs 23.2.50.1 / Aquamacs-SLIME-2010-11-14 / Mac OS X 10.6.4 / MacBook Pro 5,1
  • flet 非常酷,但不幸的是,自 Emacs 24.3 起已弃用,但 Nic Ferrier 已将其重新实现为 noflet,可通过 package.el 获得。可能最好使用它,或者使用下面的其他解决方案和钩子(再想一想,defadvice 一开始有点难看,所以钩子解决方案通常可能更好)。
  • 我已更新此答案以使用 cl-letf,它应该与 cl-lib 和词法绑定一起使用。
  • 就我而言,我在 Ubuntu 16.04.7 LTS 上使用 GNU Emacs 26.3。
  • 在 Debian 测试中非常适合 Emacs 27.1。非常感谢!
【解决方案2】:

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

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

【讨论】:

  • 请注意,文档说(关于 process-kill-without-query)“此功能自 22.1 以来已过时”并建议改用 set-process-query-on-exit-flag。
  • 由于某种原因,这对我来说不适用于comint-exec-hook,使用multi-term(钩子根本没有运行)。必须将其切换到 term-exec-hook 并且有效。
【解决方案3】:

Emacs 的下一个版本(25.3 或 26.1)将有一个新的自定义选项 confirm-kill-processes 以简化此操作。然后,您可以说 M-x customize-variable RET confirm-kill-processes RET 并将变量设置为 nil 以取消确认提示。

【讨论】:

    【解决方案4】:

    你不能没有黑客。如果您喜欢冒险,请在您的.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))
    

    【讨论】:

      【解决方案5】:
      (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))))
      

      【讨论】:

        【解决方案6】:

        我认为这是一个更好的解决方案,它专门忽略了 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-06
          • 2013-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多