防止Emacs在退出过程启动后退出?

30
有没有办法防止Emacs在我启动退出过程后退出?
我偶尔会用 C-xC-s 错按成 C-xC-c。重新启动并打开所有文件也不是很麻烦,但我想知道是否有一种方法可以停止退出过程,以便我可以继续不间断地使用Emacs并保留所有打开的文件。
使用GNU Emacs 24.3.1,在Windows 7下的Cygwin上运行。

尽管我接受了scottfrazer的答案,但我仍然感谢展示的其他方法。 - N Klosterman
我找不到这个问题,所以我发布了同样的问题:在退出Emacs之前C-x C-c确认 - imz -- Ivan Zakharyaschev
5个回答

44

有一个内置变量可以设置为一个函数,像这样:

(setq confirm-kill-emacs 'y-or-n-p)

默认情况下,当您尝试退出 Emacs 且存在未保存的缓冲区时,Emacs 使用 'yes-or-no-p。为了保持一致性,如果您希望在关闭 Emacs 时提示与此默认设置相同,请改用 (setq confirm-kill-emacs 'yes-or-n-p) - WalterGR
你可以通过自定义来设置这个。 - Anthony Williams
@WalterGR,(setq confirm-kill-emacs 'yes-or-no-p) 会更加一致,而不是 (setq confirm-kill-emacs 'yes-or-n-p),您觉得呢? - mark

3

在我看来,scottfrazer的答案比接下来的更合适。

启用Emacs Lock小模式(emacs-lock-mode)以防止您意外按下C-xC-c而导致Emacs退出。

从Emacs Wiki页面:

在缓冲区被杀死或解锁之前,Emacs无法退出

(emacs-lock-mode)添加到您的.emacs/init.el文件中,以便在每个Emacs会话中启用此锁定。这将锁定*scratch*缓冲区,如果您真的想退出Emacs,则必须解锁它。

另一种方法/黑客方法是在Emacs中启动一个进程,例如M-xshell或将一个未保存的文件与缓冲区关联,这样做会在退出Emacs时提示您进行确认。

是的,还有一种方法是使用global-unset-key取消C-xC-c。然后,如果要退出Emacs,则可以使用M-xkill-emacs


2
  • 使用 @scottfrazer 建议的 confirm-kill-emacs 是一种方法。

  • 更普遍地,您可以使用 kill-emacs-query-functions 在这方面做任何您想要的事情。(他们没有真正需要添加 confirm-kill-emacs,但他们确实这样做了。)

  • 在这方面,您可能不想使用 kill-emacs-hook(那就是 kill-emacs-query-functions 的用途),但请注意它,以防您使用 apropos 等时遇到它。

kill-emacs-query-functions 相对于仅使用 confirm-kill-emacs 的一个优点是,您可以要求更好的确认:使用 yes 而不仅仅是按下键 y。例如:

(add-hook 'kill-emacs-query-functions
          (lambda () (y-or-n-p "Do you really want to exit Emacs? "))
          'append)

这就是我的工作。敲击键盘时意外按下C-x C-c y太容易了,尤其是我绑定了类似的按键(例如,C-x cC-x C-xC-x C-y)。


2
我已将以下内容添加到我的emacs配置中,以防止意外关闭。对于像一次性提交这样的事情,我不喜欢必须确认关闭emacs,但我讨厌在深入研究问题时意外丢失emacs会话。
这将向emacs添加一个全局状态标志,描述它是否被锁定。此标志在emacs打开5分钟后自动设置,或使用lock-emacs命令手动设置。稍后可以使用unlock-emacs命令手动删除锁定。
如果emacs被锁定,并且您尝试关闭它(可能是意外),则emacs将给出一条消息,说明emacs已被锁定,无法关闭。如果已解锁,则关闭行为与默认行为完全相同。
;; don't close emacs on accident
(setq emacs-locked nil)
(setq confirm-kill-emacs
      (lambda (&rest args)
        (if emacs-locked
            (progn
              (message "%s" "Emacs is locked, and cannot be closed.")
              nil)
            t)
         ))
(defun lock-emacs-silently ()
  (progn
    (setq emacs-locked t))
  )

(defun lock-emacs ()
  "Prevent emacs from being closed."
  (interactive)
  (progn
    (lock-emacs-silently)
    (message "%s" "Emacs is now locked."))
  )
(defun unlock-emacs ()
  "Allow emacs to be closed."
  (interactive)
  (progn
    (setq emacs-locked 'nil)
    (message "%s" "Emacs can now be closed."))
  )
(run-at-time "5 minutes" nil 'lock-emacs-silently)

我希望你能提出建议,以使确认关闭emacs部分更加美观,我是一个Lisp新手 :)


使用这个东西几年后,我最终转向了更简单的东西:

;; Unbind the normal close
(global-unset-key (kbd "C-x C-c"))
;; Require C-c 3 times before closing
(global-set-key (kbd "C-x C-c C-c C-c") 'save-buffers-kill-terminal)

1
如果您想要一个简短的答案,自上个世纪以来,我在所有的.emacs文件底部都加入了这一行代码:
(shell)

你能解释一下添加(shell)是什么吗?我正在浏览Emacs维基,但只搜索“shell”有点模糊,无法找出它的作用。 - N Klosterman
我在我的答案中提到了它。(shell)实际上启动了一个进程,Emacs会提示您是否要激活它,以及是否真的想退出。Shell模式 - Bleeding Fingers

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