Quit Current Context
in category tipsThis is just a short post sharing one of those commands I use every day and would immediately miss in an uncustomized Emacs session. Have you ever tried to quit the minibuffer when point was in another window? Naturally you would try hammering C-g but in stock Emacs the minibuffer stays active and all you get are grumpy "Quit" messages.
Emacs comes with the keyboard-escape-quit
command which allows more sensible
quits in certain contexts. One thing I do not like about this command is that
one clause deletes other windows if there are any. I have written my own version
combining keyboard-quit
and keyboard-escape-quit
in a way that fits my
needs:
(defun keyboard-quit-context+ ()
"Quit current context.
This function is a combination of `keyboard-quit' and
`keyboard-escape-quit' with some parts omitted and some custom
behavior added."
(interactive)
(cond ((region-active-p)
;; Avoid adding the region to the window selection.
(setq saved-region-selection nil)
(let (select-active-regions)
(deactivate-mark)))
((eq last-command 'mode-exited) nil)
(current-prefix-arg
nil)
(defining-kbd-macro
(message
(substitute-command-keys
"Quit is ignored during macro defintion, use \\[kmacro-end-macro] if you want to stop macro definition"))
(cancel-kbd-macro-events))
((active-minibuffer-window)
(when (get-buffer-window "*Completions*")
;; hide completions first so point stays in active window when
;; outside the minibuffer
(minibuffer-hide-completions))
(abort-recursive-edit))
(t
;; if we got this far just use the default so we don't miss
;; any upstream changes
(keyboard-quit))))
(global-set-key [remap keyboard-quit] #'keyboard-quit-context+)
Most notably you can use this command to quit the minibuffer from any other window. Another thing I added recently is to ignore quits when defining macros.