In Emacs, what's the canonical way to protect vital buffers like *scratch* and *Messages* from ever being killed?
I was reading this question and the answers are a convoluted mess (timer function REALLY?)
In any case, I don't care about recreating these buffers, as that is trivial. But these buffers contain information which should never be deleted, and because they don't have associated filenames, they are usually killed without confirmation.
I do have a solution in mind, but I want to see if someone has a more "canonical" one.
jtahlborn provided the most canonical solution, except the "keep-buffers" package is showing its age has some issues:
You had to specify whether all protected buffers are to be buried and erased (erased buffers can be recovered with `undo') when killed, or just buried when killed.
member
is reimplemented asfin开发者_开发知识库d-in-list
less efficiently.Helper functions that didn't really help.
I made the the protected-list
an alist that associates regexp to erase-action, and deleted the useless (IMO) code. By default, "scratch" is erased when killed, "Messages" is never erased or killed.
See github
You can try adding a function to the kill-buffer-query-functions
variable that checks the current buffer, if it is scratch or Messages then return nil. I've never tried this before but it should prevent them from getting killed.
Edit: Here's an example of using kill-buffer-query-functions
that allows you to protect specific buffers: http://www.emacswiki.org/emacs/protbuf-by-name.el
i use the keep-buffers utility.
In addition to what has been said by others --
*scratch*
is in no way a "vital" buffer. And by default nothing and no one automatically writes anything to *scratch*
or modifies anything there.
(FWIW, I tend to use an ordinary Emacs-Lisp mode file buffer instead of *scratch*
. One reason is that I do typically want to save it at some point. (Another reason: I prefer that C-j do what it does in Emacs-Lisp mode. Yes, I could change just that key binding, but instead I keep *scratch*
for some kinds of interaction, but typically not for a coding sandbox.)
*Messages*
is a different story.
But how are you accidentally deleting *Messages*
? In decades of using Emacs I don't think I've ever accidentally killed *Messages*
. What's the scenario to produce the problem you are looking for a solution to?
精彩评论