退出程序启动后,防止Emacs退出?

时间:2014-01-17 17:26:55

标签: emacs confirmation quit

启动退出流程后,有没有办法阻止Emacs退出?

偶尔我的胖手指 C-x C-s C-x C-c 。恢复运行并不是一个糟糕的过程,但我很好奇是否有办法可以停止退出流程,以便我可以不间断地打开所有文件。

使用GNU Emacs 24.3.1。在Window 7下运行Cygwin。

5 个答案:

答案 0 :(得分:35)

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

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

答案 1 :(得分:3)

对我来说,scottfrazer的回答比以下更合适。

在任何缓冲区上启用Emacs Lock次要模式(emacs-lock-mode),以防止Emacs退出,以防您不小心碰到 Cx Cc

来自Emacs Wiki页面:

  

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

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

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

是的,使用global-unset-key未设置 C-x C-c 。然后,如果你想退出Emacs M-x kill-emacs

答案 2 :(得分:2)

  • 正如@scottfrazer建议的那样,使用confirm-kill-emacs是一种方法。

  • 更一般地说,您可以使用kill-emacs-query-functions在这方面做任何您想做的事情。 (他们没有必要添加confirm-kill-emacs,但他们确实如此。)

  • 您可能不希望在这方面使用kill-emacs-hook(这是kill-emacs-query-functions的用途),但要注意它,以防您使用{{1}遇到它等等。

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 yC-x cC-x C-x)。

答案 3 :(得分:1)

如果您正在寻找一个较短的答案,那么自上世纪以来,我在所有.emacs文件的底部都有这一行:

(shell)

答案 4 :(得分:1)

我已在我的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)

(欢迎提出有关如何使Confirm-kill-emacs部分更好的建议,我是个新手:))。