Shorten Emacs Yes-or-No Confirmation Dialogs

Press 'y' to confirm!

Some commands in Emacs and its various packages are destructive. They require a confirmation by the user. These usually use yes-or-no-p, which won’t complete the command until the user replies by writing “yes” and then hits enter, or “no”, or aborts the command with C-g.

Some of the commands that require confirmation in this way are overly protective, I find. Like projectile-kill-buffers (C-p k) which closes all open buffers for a project at once. I use this heavily when e.g. editing my website: jump into the project, edit a file or two, commit, then leave. I don’t want to type “yes” and hit enter just for that. (Please note that killing a buffer this way will still ask me if I want to save or discard changes, so the kill command alone is not destructive.)

There’s a shorter variant of the confirmation, y-or-n-p, where you only have to hit the “y” or “n” key to select an answer. It’s more like a dialog prompt and less like a conversational chat UI.

Ingenious people on the interwebs figured out that you can temporarily, or rather locally, override the yes-or-no-p with the shorter y-or-n-p by using what’s called an “advice”. It’s basically a function decorator. If all you know is Objective-C, think “method swizzling”.

(defun yes-or-no-p->-y-or-n-p (orig-fun &rest r)
  (cl-letf (((symbol-function 'yes-or-no-p) #'y-or-n-p))
    (apply orig-fun r)))

(advice-add 'projectile-kill-buffers :around #'yes-or-no-p->-y-or-n-p)
(advice-add 'project-kill-buffers :around #'yes-or-no-p->-y-or-n-p)

Update 2020-12-21: Since I discovered that Emacs comes with project-related navigation shortcuts similar to projectile but under the C-x p prefix, I advised project-kill-buffers in a similar way.

With this code, when I run projectile-kill-buffers, the actual call ((apply orig-fun r)) is wrapped in a context where all yes-or-no-p calls will actually invoke y-or-n-p. I love it.