From fef127bdcd4472e052566e0c7a3625bd53cbea66 Mon Sep 17 00:00:00 2001 From: pi-bot-01 Date: Thu, 26 Mar 2026 01:01:07 -0700 Subject: [PATCH] Initial commit --- quick-yes.el | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 quick-yes.el diff --git a/quick-yes.el b/quick-yes.el new file mode 100644 index 0000000..1f1ae18 --- /dev/null +++ b/quick-yes.el @@ -0,0 +1,162 @@ +;;; quick-yes.el --- M-y to answer "yes" to `yes-or-no-p'. + +;; Copyright 2004, 2005, 2007, 2009, 2010, 2015, 2017 Kevin Ryde + +;; Author: Kevin Ryde +;; Version: 10 +;; Keywords: convenience, minibuffer +;; URL: http://user42.tuxfamily.org/quick-yes/index.html +;; EmacsWiki: QuickYes + +;; quick-yes.el is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by the +;; Free Software Foundation; either version 3, or (at your option) any later +;; version. +;; +;; quick-yes.el is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +;; Public License for more details. +;; +;; You can get a copy of the GNU General Public License online at +;; . + + +;;; Commentary: + +;; This spot of code binds M-y and M-n to answer "yes" or "no" to a +;; `yes-or-no-p' question. +;; +;; Some `yes-or-no-p' questions can be disabled, but if you leave them +;; enabled as a reminder or if sometimes important then M-y is a good +;; shortcut for accepting. +;; +;; If you start typing "y" or "ye", etc, you can still use M-y to finish it. +;; Typing "y" is easy to do if you don't immediately notice it's +;; `yes-or-no-p' instead of `y-or-n-p'. +;; +;; quick-yes.el only affects a `yes-or-no-p' question in the minibuffer, it +;; doesn't change a window system dialog box (as used by `yes-or-no-p' when +;; the invoking action was a mouse button press instead of something from +;; the keyboard). + +;;; Emacsen: + +;; Designed for Emacs 20 up and XEmacs 21 up. + +;;; Install: + +;; Put quick-yes.el in one of your `load-path' directories, and in your +;; .emacs add +;; +;; (require 'quick-yes) + +;;; History: + +;; Version 1 - the first version +;; Version 2 - add M-n for no +;; Version 3 - cope with xemacs prompt not part of the minibuffer as such +;; Version 4 - GPL v.3 +;; Version 5 - track other hacks to minibuffer-local-map value too +;; Version 6 - complete "y" etc when point at start of minibuffer too +;; Version 7 - undo defadvice on unload-feature +;; Version 8 - express dependency on 'advice +;; Version 9 - new email +;; Version 10 - allow for recursive yes-or-no-p + +;;; Code: + +;; Explicit dependency on advice.el since `quick-yes-unload-function' +;; needs `ad-find-advice' macro when running not byte compiled, and that +;; macro is not autoloaded. +(require 'advice) + +;; checkdoc-autoload: no-entrypoint + +;; This is implemented as an advice around `yes-or-no-p' and a temporarily +;; applied `quick-yes-map' keymap, so as to restrict the effect to just +;; `yes-or-no-p'. All other minibuffer reading is unchanged, and M-y can be +;; bound to other things in other minibuffer contexts, through additions to +;; `minibuffer-local-map' or whatever. + +(defun quick-yes-answer-yes () + "Say \"yes\" in the minibuffer. +It either enters \"yes\" or finishes a \"y\" or \"ye\" you've +started to type, then presses return (ie. `exit-minibuffer'). + +Read more in the comments in quick-yes.el. The quick-yes.el home +page is URL `http://user42.tuxfamily.org/quick-yes/index.html'" + (interactive) + ;; in xemacs the prompt isn't part of the buffer, so must watch out for + ;; going below (point-min) when subtracting from (point) + (goto-char (point-max)) + (cond ((string= "y" (buffer-substring (max (point-min) (1- (point))) + (point))) + (insert "es")) + ((string= "ye" (buffer-substring (max (point-min) (- (point) 2)) + (point))) + (insert "s")) + ((string= "yes" (buffer-substring (max (point-min) (- (point) 3)) + (point)))) + (t + (insert "yes"))) + (exit-minibuffer)) + +(defun quick-yes-answer-no () + "Say \"no\" in the minibuffer. +It either enters \"no\" or finishes an \"n\" you've started to +type, then presses return (ie. `exit-minibuffer')." + (interactive) + ;; in xemacs the prompt isn't part of the buffer, so must watch out for + ;; going below (point-min) when subtracting from (point) + (goto-char (point-max)) + (cond ((string= "n" (buffer-substring (max (point-min) (1- (point))) + (point))) + (insert "o")) + ((string= "no" (buffer-substring (max (point-min) (- (point) 2)) + (point)))) + (t + (insert "no"))) + (exit-minibuffer)) + +(defvar quick-yes-map + (let ((m (make-sparse-keymap))) + (define-key m [?\M-n] 'quick-yes-answer-no) + (define-key m [?\M-y] 'quick-yes-answer-yes) + m) + "Extra keymap advised around `yes-or-no-p' by quick-yes.") + +(defadvice yes-or-no-p (around quick-yes activate) + "\\\\[quick-yes-answer-yes] to answer yes (`quick-yes-answer-yes'), and \\\\[quick-yes-answer-no] for no." + + ;; set-keymap-parent each time in case minibuffer-local-map changes, + ;; perhaps someone else mucking about with it the same as here! + ;; + ;; keymap-parent is unset on leaving, so a recursive yes-or-no-p (under + ;; `enable-recursive-minibuffers') can be detected and the parent not set + ;; again since that would usually cause cyclic inheritance. + ;; + (let ((recurse (keymap-parent quick-yes-map))) + ;; (message "quick-yes.el recurse %S" (not (not recurse))) + (unwind-protect + (progn + (unless recurse + (set-keymap-parent quick-yes-map minibuffer-local-map)) + (let ((minibuffer-local-map quick-yes-map)) + ad-do-it)) + (unless recurse + (set-keymap-parent quick-yes-map nil))))) + +(defun quick-yes-unload-function () + "Remove defadvice from `yes-or-no-p'. +This is called by `unload-feature'." + (when (ad-find-advice 'yes-or-no-p 'around 'quick-yes) + (ad-remove-advice 'yes-or-no-p 'around 'quick-yes) + (ad-activate 'yes-or-no-p)) + nil) ;; and do normal unload-feature actions too + +;; LocalWords: minibuffer el + +(provide 'quick-yes) + +;;; quick-yes.el ends here