diff --git a/src/minibuf.c b/src/minibuf.c index 4b1f4b1ff7..8a46693846 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -592,7 +592,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, if (!STRINGP (prompt)) prompt = empty_unibyte_string; - if (!enable_recursive_minibuffers + if (NILP (Venable_recursive_minibuffers) && minibuf_level > 0) { Lisp_Object str @@ -604,6 +604,9 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, Fthrow (Qexit, str); } + if (EQ (Venable_recursive_minibuffers, Qtransient)) + specbind (Qenable_recursive_minibuffers, Qnil); + if ((noninteractive /* In case we are running as a daemon, only do this before detaching from the terminal. */ @@ -2242,6 +2245,7 @@ syms_of_minibuf (void) DEFSYM (Qcase_fold_search, "case-fold-search"); DEFSYM (Qmetadata, "metadata"); DEFSYM (Qcycle_sort_function, "cycle-sort-function"); + DEFSYM (Qtransient, "transient"); /* A frame parameter. */ DEFSYM (Qminibuffer_exit, "minibuffer-exit"); @@ -2311,12 +2315,12 @@ syms_of_minibuf (void) controls the behavior, rather than this variable. */); completion_ignore_case = 0; - DEFVAR_BOOL ("enable-recursive-minibuffers", enable_recursive_minibuffers, + DEFVAR_LISP ("enable-recursive-minibuffers", Venable_recursive_minibuffers, doc: /* Non-nil means to allow minibuffer commands while in the minibuffer. This variable makes a difference whenever the minibuffer window is active. Also see `minibuffer-depth-indicate-mode', which may be handy if this variable is non-nil. */); - enable_recursive_minibuffers = 0; + Venable_recursive_minibuffers = Qnil; DEFVAR_LISP ("minibuffer-completion-table", Vminibuffer_completion_table, doc: /* Alist or obarray used for completion in the minibuffer. diff --git a/src/fns.c b/src/fns.c index f51ef2781d..4744fddf27 100644 --- a/src/fns.c +++ b/src/fns.c @@ -2882,7 +2882,8 @@ DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, 1, 0, prompt = CALLN (Fconcat, prompt, yes_or_no); ptrdiff_t count = SPECPDL_INDEX (); - specbind (Qenable_recursive_minibuffers, Qt); + if (NILP (Venable_recursive_minibuffers)) + specbind (Qenable_recursive_minibuffers, Qtransient); while (1) { diff --git a/lisp/simple.el b/lisp/simple.el index 7eee65e204..99b959b2fc 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -2370,7 +2370,7 @@ next-matching-history-element `case-fold-search' is non-nil, but an uppercase letter in REGEXP makes the search case-sensitive." (interactive - (let* ((enable-recursive-minibuffers t) + (let* ((enable-recursive-minibuffers (or enable-recursive-minibuffers 'transient)) (regexp (read-from-minibuffer "Next element matching (regexp): " nil minibuffer-local-map