我偶尔会用 C-xC-s 错按成 C-xC-c。重新启动并打开所有文件也不是很麻烦,但我想知道是否有一种方法可以停止退出过程,以便我可以继续不间断地使用Emacs并保留所有打开的文件。
使用GNU Emacs 24.3.1,在Windows 7下的Cygwin上运行。
有一个内置变量可以设置为一个函数,像这样:
(setq confirm-kill-emacs 'y-or-n-p)
'yes-or-no-p
。为了保持一致性,如果您希望在关闭 Emacs 时提示与此默认设置相同,请改用 (setq confirm-kill-emacs 'yes-or-n-p)
。 - WalterGR(setq confirm-kill-emacs 'yes-or-no-p)
会更加一致,而不是 (setq confirm-kill-emacs 'yes-or-n-p)
,您觉得呢? - mark在我看来,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
。
使用 @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 c
、C-x C-x
、C-x C-y
)。
lock-emacs
命令手动设置。稍后可以使用unlock-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)
(shell)