GNU bug report logs -
#46583
28.0.50; nested minibuffers
Previous Next
Reported by: rms <at> gnu.org
Date: Wed, 17 Feb 2021 04:04:02 UTC
Severity: normal
Found in version 28.0.50
To reply to this bug, email your comments to 46583 AT debbugs.gnu.org.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Wed, 17 Feb 2021 04:04:02 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
rms <at> gnu.org
:
New bug report received and forwarded. Copy sent to
bug-gnu-emacs <at> gnu.org
.
(Wed, 17 Feb 2021 04:04:02 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
I save a file that is read-only, so I am asked
File phones is write-protected; try to save anyway? (yes or no)
Then I type C-x b and it tries to read a buffer name.
But enable-recursive-minibuffers is nil!
In GNU Emacs 28.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 2.24.32, cairo version 1.15.10)
of 2020-12-08 built on freetop
Repository revision: 0155bd0fdb166c97a2ce76cc5bc64fd195a676d3
Repository branch: master
System Description: Trisquel GNU/Linux Etiona (9.0)
Configured using:
'configure --with-gnutls=ifavailable 'CFLAGS=-O0 -g''
Configured features:
XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND GPM DBUS GSETTINGS GLIB NOTIFY
INOTIFY LIBXML2 FREETYPE HARFBUZZ M17N_FLT LIBOTF ZLIB
TOOLKIT_SCROLL_BARS GTK2 X11 XDBE XIM MODULES THREADS PDUMPER
Important settings:
value of $LANG: en_US.UTF-8
locale-coding-system: utf-8-unix
Major mode: Mail
Minor modes in effect:
shell-dirtrack-mode: t
gpm-mouse-mode: t
tooltip-mode: t
global-eldoc-mode: t
mouse-wheel-mode: t
tool-bar-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
line-number-mode: t
transient-mark-mode: t
abbrev-mode: t
Load-path shadows:
None found.
Features:
(shadow emacsbug novice quail help-mode shr kinsoku svg xml dom
mule-util epa-mail shell pcomplete thingatpt files-x grep compile
comint ansi-color ring rmailsum dabbrev qp misearch multi-isearch
mailalias sendmail rmailkwd rmailout rmailmm message rmc puny rfc822
mml mml-sec epa epg epg-config gnus-util text-property-search
time-date mm-decode mm-bodies mm-encode mailabbrev gmm-utils
mailheader mail-parse rfc2231 rmail rmail-loaddefs rfc2047 rfc2045
ietf-drums mm-util mail-prsvr mail-utils dired-aux dired
dired-loaddefs t-mouse term/linux view derived paren cus-start
cus-load advice finder-inf package easymenu browse-url url url-proxy
url-privacy url-expand url-methods url-history url-cookie url-domsuf
url-util mailcap url-handlers url-parse auth-source cl-seq eieio
eieio-core cl-macs eieio-loaddefs password-cache json subr-x map
url-vars seq byte-opt gv bytecomp byte-compile cconv cl-loaddefs
cl-lib iso-transl tooltip eldoc electric uniquify ediff-hook vc-hooks
lisp-float-type mwheel term/x-win x-win term/common-win x-dnd tool-bar
dnd fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode elisp-mode lisp-mode prog-mode register page tab-bar
menu-bar rfn-eshadow isearch timer select scroll-bar mouse jit-lock
font-lock syntax facemenu font-core term/tty-colors frame minibuffer
cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai
tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian
slovak czech european ethiopic indian cyrillic chinese composite
charscript charprop case-table epa-hook jka-cmpr-hook help simple
abbrev obarray cl-preloaded nadvice button loaddefs faces cus-face
macroexp files window text-properties overlay sha1 md5 base64 format
env code-pages mule custom widget hashtable-print-readable backquote
threads dbusbind inotify dynamic-setting system-font-setting
font-render-setting cairo move-toolbar gtk x-toolkit x multi-tty
make-network-process emacs)
Memory information:
((conses 16 468665 79574)
(symbols 48 23339 4)
(strings 32 95476 13396)
(string-bytes 1 2287671)
(vectors 16 30546)
(vector-slots 8 1438917 257443)
(floats 8 55 269)
(intervals 56 85633 1433)
(buffers 984 53))
[[[ To any NSA and FBI agents reading my email: please consider ]]]
[[[ whether defending the US Constitution against all enemies, ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]
--
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Wed, 17 Feb 2021 19:11:02 GMT)
Full text and
rfc822 format available.
Message #8 received at 46583 <at> debbugs.gnu.org (full text, mbox):
> I save a file that is read-only, so I am asked
>
> File phones is write-protected; try to save anyway? (yes or no)
>
> Then I type C-x b and it tries to read a buffer name.
>
> But enable-recursive-minibuffers is nil!
Let-binding enable-recursive-minibuffers temporarily to t was necessary
to fix bug#17272/bug#19064.
So when the minibuffer is already activated, and a minibuffer command
wants to ask a question, displaying another recursive minibuffer with
such question should override the value of enable-recursive-minibuffers.
But you found the problem that is a side-effect of this fix.
The problem is that currently it's impossible for a command
to override enable-recursive-minibuffers only for its own use,
while keeping it disabled for more recursive minibuffer calls.
Maybe enable-recursive-minibuffers should support a numeric value
that is decremented in every recursive minibuffer calls
until reaching zero value that disables more recursive calls?
Then a command that needs to use the recursive minibuffer
could let-bind enable-recursive-minibuffers to 1,
allowing this only for own use, while it will be 0
in more recursive calls.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Wed, 17 Feb 2021 19:47:01 GMT)
Full text and
rfc822 format available.
Message #11 received at 46583 <at> debbugs.gnu.org (full text, mbox):
> From: Juri Linkov <juri <at> linkov.net>
> Date: Wed, 17 Feb 2021 20:48:08 +0200
> Cc: 46583 <at> debbugs.gnu.org
>
> Let-binding enable-recursive-minibuffers temporarily to t was necessary
> to fix bug#17272/bug#19064.
>
> So when the minibuffer is already activated, and a minibuffer command
> wants to ask a question, displaying another recursive minibuffer with
> such question should override the value of enable-recursive-minibuffers.
Those bugs are about an echo-area message overwriting the minibuffer
prompt, are they not? If so, doesn't the set-message-function feature
we now have fixed those bugs indirectly, this removing the need for
let-binding enable-recursive-minibuffers?
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Wed, 17 Feb 2021 20:21:02 GMT)
Full text and
rfc822 format available.
Message #14 received at 46583 <at> debbugs.gnu.org (full text, mbox):
>> Let-binding enable-recursive-minibuffers temporarily to t was necessary
>> to fix bug#17272/bug#19064.
>>
>> So when the minibuffer is already activated, and a minibuffer command
>> wants to ask a question, displaying another recursive minibuffer with
>> such question should override the value of enable-recursive-minibuffers.
>
> Those bugs are about an echo-area message overwriting the minibuffer
> prompt, are they not? If so, doesn't the set-message-function feature
> we now have fixed those bugs indirectly, this removing the need for
> let-binding enable-recursive-minibuffers?
This problem is not fixed by set-message-function that only improves
messaging. The problem was reported by João in the same bug report
https://debbugs.gnu.org/17272#114
Emacs -Q
M-x fido-mode
C-x b
C-k ;; to kill the Messages buffer
This affects yes-or-no-p that C-k needs to use from the minibuffer
in fido-mode.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Wed, 17 Feb 2021 20:36:02 GMT)
Full text and
rfc822 format available.
Message #17 received at 46583 <at> debbugs.gnu.org (full text, mbox):
> From: Juri Linkov <juri <at> linkov.net>
> Cc: rms <at> gnu.org, 46583 <at> debbugs.gnu.org
> Date: Wed, 17 Feb 2021 22:20:01 +0200
>
> >> Let-binding enable-recursive-minibuffers temporarily to t was necessary
> >> to fix bug#17272/bug#19064.
> >>
> >> So when the minibuffer is already activated, and a minibuffer command
> >> wants to ask a question, displaying another recursive minibuffer with
> >> such question should override the value of enable-recursive-minibuffers.
> >
> > Those bugs are about an echo-area message overwriting the minibuffer
> > prompt, are they not? If so, doesn't the set-message-function feature
> > we now have fixed those bugs indirectly, this removing the need for
> > let-binding enable-recursive-minibuffers?
>
> This problem is not fixed by set-message-function that only improves
> messaging.
It prevents messages from overwriting minibuffer prompts. And both of
the bugs you mentioned seem to be about messages that overwrite such
prompts. So what am I missing?
> The problem was reported by João in the same bug report
> https://debbugs.gnu.org/17272#114
>
> Emacs -Q
> M-x fido-mode
> C-x b
> C-k ;; to kill the Messages buffer
>
> This affects yes-or-no-p that C-k needs to use from the minibuffer
> in fido-mode.
Sorry, I don't understand: how is this related to what I asked about?
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Thu, 18 Feb 2021 09:54:01 GMT)
Full text and
rfc822 format available.
Message #20 received at 46583 <at> debbugs.gnu.org (full text, mbox):
> It prevents messages from overwriting minibuffer prompts. And both of
> the bugs you mentioned seem to be about messages that overwrite such
> prompts. So what am I missing?
Sorry for mentioning old bugs that added confusion to this bug report.
What we have now is a new bug found by Richard:
I save a file that is read-only, so I am asked
File phones is write-protected; try to save anyway? (yes or no)
Then I type C-x b and it tries to read a buffer name.
I could send a patch that fixes this bug.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Thu, 18 Feb 2021 14:32:02 GMT)
Full text and
rfc822 format available.
Message #23 received at 46583 <at> debbugs.gnu.org (full text, mbox):
> From: Juri Linkov <juri <at> linkov.net>
> Cc: rms <at> gnu.org, 46583 <at> debbugs.gnu.org
> Date: Thu, 18 Feb 2021 11:39:54 +0200
>
> > It prevents messages from overwriting minibuffer prompts. And both of
> > the bugs you mentioned seem to be about messages that overwrite such
> > prompts. So what am I missing?
>
> Sorry for mentioning old bugs that added confusion to this bug report.
> What we have now is a new bug found by Richard:
>
> I save a file that is read-only, so I am asked
>
> File phones is write-protected; try to save anyway? (yes or no)
>
> Then I type C-x b and it tries to read a buffer name.
>
> I could send a patch that fixes this bug.
Thanks. I hoped first to understand why we bind
enable-recursive-minibuffers in these cases, but if you prefer to
begin with a patch, please do, and let's take it from there.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Thu, 18 Feb 2021 17:36:02 GMT)
Full text and
rfc822 format available.
Message #26 received at 46583 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
>> I could send a patch that fixes this bug.
>
> Thanks. I hoped first to understand why we bind
> enable-recursive-minibuffers in these cases, but if you prefer to
> begin with a patch, please do, and let's take it from there.
To understand the problem, it's better to start from the manual.
The node (info "(elisp) Recursive Mini") says:
If a command name has a property ‘enable-recursive-minibuffers’ that
is non-‘nil’, then the command can use the minibuffer to read arguments
even if it is invoked from the minibuffer. A command can also achieve
this by binding ‘enable-recursive-minibuffers’ to ‘t’ in the interactive
declaration (*note Using Interactive::). The minibuffer command
‘next-matching-history-element’ (normally ‘M-s’ in the minibuffer) does
the latter.
And indeed the command ‘next-matching-history-element’ (‘M-s’)
mentioned as an example in the documentation, exhibits the same
problem reported by Richard:
0. emacs -Q
1. M-x ;; execute-extended-command
2. M-s ;; next-matching-history-element
3. C-x b ;; switch-to-buffer
And it tries to read a buffer name, ignoring the default nil value
of ‘enable-recursive-minibuffers’.
This is because the manual documents the official way by binding
‘enable-recursive-minibuffers’ to ‘t’ that next-matching-history-element
does:
(defun next-matching-history-element (regexp n)
(interactive
(let* ((enable-recursive-minibuffers t)
(regexp (read-from-minibuffer "Next element matching (regexp): "
...
One possible solution is to support an additional value ‘transient’
for the variable ‘enable-recursive-minibuffers’. Then this value
could have its effect only for the next invocation of
read-from-minibuffer. Afterwards it will be set to ‘nil’
for any further recursive calls of read-from-minibuffer.
PS: Such transient value is similar to the value ‘lambda’ of
‘transient-mark-mode’ described in (info "(elisp) The Mark").
Currently this patch fixes the reported problem only
for the commands yes-or-no-p and next-matching-history-element:
[transient-enable-recursive-minibuffers.patch (text/x-diff, inline)]
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
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Fri, 19 Feb 2021 05:42:01 GMT)
Full text and
rfc822 format available.
Message #29 received at 46583 <at> debbugs.gnu.org (full text, mbox):
[[[ To any NSA and FBI agents reading my email: please consider ]]]
[[[ whether defending the US Constitution against all enemies, ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> The problem is that currently it's impossible for a command
> to override enable-recursive-minibuffers only for its own use,
> while keeping it disabled for more recursive minibuffer calls.
I see. Thanks.
> Maybe enable-recursive-minibuffers should support a numeric value
> that is decremented in every recursive minibuffer calls
> until reaching zero value that disables more recursive calls?
That should be a simple and adequate fix.
I don't see a need to support values greater than 1,
but I don't think they do any harm, and I see
no way to make this simpler by not supporting them.
--
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Fri, 17 Jun 2022 15:24:02 GMT)
Full text and
rfc822 format available.
Message #32 received at 46583 <at> debbugs.gnu.org (full text, mbox):
Juri Linkov <juri <at> linkov.net> writes:
> Maybe enable-recursive-minibuffers should support a numeric value
> that is decremented in every recursive minibuffer calls
> until reaching zero value that disables more recursive calls?
I think that makes sense...
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Fri, 17 Jun 2022 19:23:02 GMT)
Full text and
rfc822 format available.
Message #35 received at 46583 <at> debbugs.gnu.org (full text, mbox):
>> Maybe enable-recursive-minibuffers should support a numeric value
>> that is decremented in every recursive minibuffer calls
>> until reaching zero value that disables more recursive calls?
>
> I think that makes sense...
I don't know, later I sent a different patch that sets
the value 'transient' of enable-recursive-minibuffers
in yes-or-no-p.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#46583
; Package
emacs
.
(Sat, 18 Jun 2022 11:35:02 GMT)
Full text and
rfc822 format available.
Message #38 received at 46583 <at> debbugs.gnu.org (full text, mbox):
Juri Linkov <juri <at> linkov.net> writes:
> I don't know, later I sent a different patch that sets
> the value 'transient' of enable-recursive-minibuffers
> in yes-or-no-p.
I wasn't quite sure whether that patch would cover all the use cases...
but I didn't really look closely at this, so if you think that's the way
to go, that's fine with me.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
This bug report was last modified 3 years and 93 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.