From: Juri Linkov Date: Tue, 26 Nov 2019 23:18:17 +0000 (+0200) Subject: Allow recursive minibuffers for yes-or-no-p and y-or-n-p (bug#17272 bug#19064) X-Git-Tag: emacs-27.0.90~511 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b3c0fb21bd910f5d86490154451cc324ce9ad66b;p=emacs.git Allow recursive minibuffers for yes-or-no-p and y-or-n-p (bug#17272 bug#19064) * lisp/subr.el (y-or-n-p): Let-bind enable-recursive-minibuffers to t. * src/fns.c (Fyes_or_no_p): Specbind Qenable_recursive_minibuffers to Qt. --- diff --git a/lisp/subr.el b/lisp/subr.el index fe55566b52d..01f4f531b14 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -2847,6 +2847,7 @@ is nil and `use-dialog-box' is non-nil." (t (setq prompt (funcall padded prompt)) (let* ((empty-history '()) + (enable-recursive-minibuffers t) (str (read-from-minibuffer prompt nil (make-composed-keymap y-or-n-p-map query-replace-map) diff --git a/src/fns.c b/src/fns.c index cbb6879223d..3ae3192b3d5 100644 --- a/src/fns.c +++ b/src/fns.c @@ -2805,15 +2805,18 @@ if `last-nonmenu-event' is nil, and `use-dialog-box' is non-nil. */) AUTO_STRING (yes_or_no, "(yes or no) "); prompt = CALLN (Fconcat, prompt, yes_or_no); + ptrdiff_t count = SPECPDL_INDEX (); + specbind (Qenable_recursive_minibuffers, Qt); + while (1) { ans = Fdowncase (Fread_from_minibuffer (prompt, Qnil, Qnil, Qnil, Qyes_or_no_p_history, Qnil, Qnil)); if (SCHARS (ans) == 3 && !strcmp (SSDATA (ans), "yes")) - return Qt; + return unbind_to (count, Qt); if (SCHARS (ans) == 2 && !strcmp (SSDATA (ans), "no")) - return Qnil; + return unbind_to (count, Qnil); Fding (Qnil); Fdiscard_input ();