Today, I had an extremely specific need. I wanted the Elisp function y-or-n-p (which asks the user a yes-or-no question, expecting a one-key answer of y or n), but I wanted to interpret RET (or “Enter”) as “yes”. It turns out that by default it means “exit”, which is because y-or-n-p-map has no binding for RET, and y-or-n-p falls back on query-replace-map (in a rather convoluted way). So, here is one way I could change it:
(defconst y-or-n-p-ret-yes-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map y-or-n-p-map)
(define-key map [return] 'act)
map)
"A keymap for y-or-n-p with RET meaning \"yes\".")
;; this asks a y/n question with RET meaning "yes"
(let ((y-or-n-p-map y-or-n-p-ret-yes-map))
(y-or-n-p "yes or no? "))
Notice how we used the dynamic nature of the y-or-n-p-map variable here.