unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* New multi-command facility displays in the wrong echo area.
@ 2020-10-09 16:34 Alan Mackenzie
  2020-10-09 19:47 ` Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Alan Mackenzie @ 2020-10-09 16:34 UTC (permalink / raw)
  To: emacs-devel

Hello, Emacs.

With a recent master:

(i) In a GUI environment, create two frames, each displaying a buffer.
(ii) In frame F1, do C-x b `switch-to-buffer', but don't type anything
more.
(iii) Move to frame F2, and start an isearch with C-s some-text.

Although currently in F2, the isearch's pattern is displayed in the echo
area for F1.  This is wrong.

It's wrong because F1's echo area isn't necessarily visible.  It may
have been moved off the screen by GUI facilities.  The effect is then
missing text in the echo area.

Instead do the same on a TTY, where frame switching commands have been
bound to keys.  The effect of the missing echo area text is more
pronounced, since there is no way of ever seeing it - on pressing the
key to return to F1, the command in F2 is cancelled along with its echo
text.

I wasn't previously aware of this multiple command facility.  I think
the above should be fixed, somehow.

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-09 16:34 New multi-command facility displays in the wrong echo area Alan Mackenzie
@ 2020-10-09 19:47 ` Stefan Monnier
  2020-10-09 20:38   ` Alan Mackenzie
  2020-10-09 21:14   ` Gregory Heytings via Emacs development discussions.
  0 siblings, 2 replies; 45+ messages in thread
From: Stefan Monnier @ 2020-10-09 19:47 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> (i) In a GUI environment, create two frames, each displaying a buffer.
> (ii) In frame F1, do C-x b `switch-to-buffer', but don't type anything
> more.
> (iii) Move to frame F2, and start an isearch with C-s some-text.
>
> Although currently in F2, the isearch's pattern is displayed in the echo
> area for F1.  This is wrong.

FWIW, this behavior has been with us at least since Emacs-21.


        Stefan




^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-09 19:47 ` Stefan Monnier
@ 2020-10-09 20:38   ` Alan Mackenzie
  2020-10-09 22:12     ` Stefan Monnier
  2020-10-10  6:52     ` Eli Zaretskii
  2020-10-09 21:14   ` Gregory Heytings via Emacs development discussions.
  1 sibling, 2 replies; 45+ messages in thread
From: Alan Mackenzie @ 2020-10-09 20:38 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Hello, Stefan.

On Fri, Oct 09, 2020 at 15:47:15 -0400, Stefan Monnier wrote:
> > (i) In a GUI environment, create two frames, each displaying a buffer.
> > (ii) In frame F1, do C-x b `switch-to-buffer', but don't type anything
> > more.
> > (iii) Move to frame F2, and start an isearch with C-s some-text.
> >
> > Although currently in F2, the isearch's pattern is displayed in the echo
> > area for F1.  This is wrong.

> FWIW, this behavior has been with us at least since Emacs-21.

Yes.  At least, it's present in Emacs 27.1.  How come I've never noticed
it before?

This morning, it was C-x C-s which failed to give me any output,
although I was expecting to see "(No files need saving)".

I still say it's wrong, but I suppose if I want it fixed, I'll have to
fix it myself.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-09 19:47 ` Stefan Monnier
  2020-10-09 20:38   ` Alan Mackenzie
@ 2020-10-09 21:14   ` Gregory Heytings via Emacs development discussions.
  2020-10-09 21:48     ` Gregory Heytings via Emacs development discussions.
  1 sibling, 1 reply; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-09 21:14 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Alan Mackenzie, emacs-devel


Hi Stefan,

>> (i) In a GUI environment, create two frames, each displaying a buffer.
>> (ii) In frame F1, do C-x b `switch-to-buffer', but don't type anything more.
>> (iii) Move to frame F2, and start an isearch with C-s some-text.
>>
>> Although currently in F2, the isearch's pattern is displayed in the 
>> echo area for F1.  This is wrong.
>
> FWIW, this behavior has been with us at least since Emacs-21.
>

I fear that's not correct.  I don't see this behavior in Emacs 21 to 26 
(inclusive), it is new in Emacs 27.1.  More precisely, it is because the 
new variable set-message-function has the default value 
set-minibuffer-message.  To restore the previous default behavior:

(setq set-message-function nil)



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-09 21:14   ` Gregory Heytings via Emacs development discussions.
@ 2020-10-09 21:48     ` Gregory Heytings via Emacs development discussions.
  2020-10-10 10:15       ` Alan Mackenzie
  0 siblings, 1 reply; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-09 21:48 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Alan Mackenzie, emacs-devel


Hi Stefan,

>>> (i) In a GUI environment, create two frames, each displaying a buffer.
>>> (ii) In frame F1, do C-x b `switch-to-buffer', but don't type anything more.
>>> (iii) Move to frame F2, and start an isearch with C-s some-text.
>>> 
>>> Although currently in F2, the isearch's pattern is displayed in the 
>>> echo area for F1.  This is wrong.
>> 
>> FWIW, this behavior has been with us at least since Emacs-21.
>> 
>
> I fear that's not correct.  I don't see this behavior in Emacs 21 to 26 
> (inclusive), it is new in Emacs 27.1.  More precisely, it is because the 
> new variable set-message-function has the default value 
> set-minibuffer-message. To restore the previous default behavior:
>
> (setq set-message-function nil)
>

IMO this could/should be fixed in set-minibuffer-message, by checking that 
the active minibuffer is on the same frame:

(when (and (not noninteractive)
            (window-live-p (active-minibuffer-window))
            (eq (window-frame) (window-frame (active-minibuffer-window))))



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-09 20:38   ` Alan Mackenzie
@ 2020-10-09 22:12     ` Stefan Monnier
  2020-10-09 22:56       ` Drew Adams
  2020-10-10  6:52     ` Eli Zaretskii
  1 sibling, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2020-10-09 22:12 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> I still say it's wrong, but I suppose if I want it fixed, I'll have to
> fix it myself.

Just to clarify: I didn't mean to say that "it's been that way for so
long that it must be right", but just pointing out that it's not
a new problem.

I have no idea how easy it is to address.
Tho I think there is one way to avoid the problem: make isearch signal
an error in that case.  You'd get an error if isearch used a minibuffer
(because it'd be a recursive minibuffer which are disallowed by
default), and whether isearch uses a minibuffer or not is (to a large
extent) an internal implementation detail.


        Stefan




^ permalink raw reply	[flat|nested] 45+ messages in thread

* RE: New multi-command facility displays in the wrong echo area.
  2020-10-09 22:12     ` Stefan Monnier
@ 2020-10-09 22:56       ` Drew Adams
  0 siblings, 0 replies; 45+ messages in thread
From: Drew Adams @ 2020-10-09 22:56 UTC (permalink / raw)
  To: Stefan Monnier, Alan Mackenzie; +Cc: emacs-devel

> make isearch signal
> an error in that case.  You'd get an error if isearch used a minibuffer
> (because it'd be a recursive minibuffer which are disallowed by
> default), and whether isearch uses a minibuffer or not is (to a large
> extent) an internal implementation detail.

Not sure it's the same thing, but if you're also saying
that it should be an error to use a recursive _edit_
during Isearch then I disagree with that.

I have Isearch keys that open a recursive edit.

(And a recursive edit could use a minibuffer and even
recursive minibuffers.)



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-09 20:38   ` Alan Mackenzie
  2020-10-09 22:12     ` Stefan Monnier
@ 2020-10-10  6:52     ` Eli Zaretskii
  2020-10-10 10:32       ` Alan Mackenzie
  1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-10  6:52 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: monnier, emacs-devel

> Date: Fri, 9 Oct 2020 20:38:10 +0000
> From: Alan Mackenzie <acm@muc.de>
> Cc: emacs-devel@gnu.org
> 
> > FWIW, this behavior has been with us at least since Emacs-21.
> 
> Yes.  At least, it's present in Emacs 27.1.  How come I've never noticed
> it before?
> 
> This morning, it was C-x C-s which failed to give me any output,
> although I was expecting to see "(No files need saving)".
> 
> I still say it's wrong, but I suppose if I want it fixed, I'll have to
> fix it myself.

It is quite unusual to leave an active minibuffer and switch to
another frame to start an Isearch.

If you want to fix that, let's please first talk about what kind if
fix are you looking for.  Do you intend to leave the active minibuffer
on the original frame, and use the other frame for Isearch?  Note that
Isearch also uses the minibuffer.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-09 21:48     ` Gregory Heytings via Emacs development discussions.
@ 2020-10-10 10:15       ` Alan Mackenzie
  2020-10-10 13:44         ` Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Alan Mackenzie @ 2020-10-10 10:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Stefan Monnier, emacs-devel

Hello, Gregory.

On Fri, Oct 09, 2020 at 21:48:49 +0000, Gregory Heytings wrote:

> Hi Stefan,

> >>> (i) In a GUI environment, create two frames, each displaying a buffer.
> >>> (ii) In frame F1, do C-x b `switch-to-buffer', but don't type anything more.
> >>> (iii) Move to frame F2, and start an isearch with C-s some-text.

> >>> Although currently in F2, the isearch's pattern is displayed in the 
> >>> echo area for F1.  This is wrong.

> >> FWIW, this behavior has been with us at least since Emacs-21.


> > I fear that's not correct.  I don't see this behavior in Emacs 21 to 26 
> > (inclusive), it is new in Emacs 27.1.  More precisely, it is because the 
> > new variable set-message-function has the default value 
> > set-minibuffer-message. To restore the previous default behavior:

> > (setq set-message-function nil)


> IMO this could/should be fixed in set-minibuffer-message, by checking that 
> the active minibuffer is on the same frame:

> (when (and (not noninteractive)
>             (window-live-p (active-minibuffer-window))
>             (eq (window-frame) (window-frame (active-minibuffer-window)))

Thanks!  I've just tried this out, and it appears to work well.

In particular, in the scenario I outlined, on a TTY, the echo area for
frame F2 is used when F2 is the current frame, even if there is a
minibuffer active in F1.

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10  6:52     ` Eli Zaretskii
@ 2020-10-10 10:32       ` Alan Mackenzie
  2020-10-10 11:13         ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Alan Mackenzie @ 2020-10-10 10:32 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: monnier, emacs-devel

Hello, Eli.

On Sat, Oct 10, 2020 at 09:52:33 +0300, Eli Zaretskii wrote:
> > Date: Fri, 9 Oct 2020 20:38:10 +0000
> > From: Alan Mackenzie <acm@muc.de>
> > Cc: emacs-devel@gnu.org

> > > FWIW, this behavior has been with us at least since Emacs-21.

> > Yes.  At least, it's present in Emacs 27.1.  How come I've never noticed
> > it before?

> > This morning, it was C-x C-s which failed to give me any output,
> > although I was expecting to see "(No files need saving)".

> > I still say it's wrong, but I suppose if I want it fixed, I'll have to
> > fix it myself.

> It is quite unusual to leave an active minibuffer and switch to
> another frame to start an Isearch.

It's rather something I tend to do by accident.  I start a command in
frame F1 which uses the minibuffer, I swap to F2 to look for the text I
want to enter in F1, then sometimes forget I've got the command in F1
still active.

> If you want to fix that, let's please first talk about what kind if
> fix are you looking for.

Above all, I want the command in F2 to use the echo area of F2, not that
of F1 (which in my TTY setup is not visible).

> Do you intend to leave the active minibuffer on the original frame, and
> use the other frame for Isearch?  Note that Isearch also uses the
> minibuffer.

I'm not understanding that, properly.  When I enter characters into
isearch in F2, this doesn't throw an error when the F1 minibuffer is
still active.  Is isearch perhaps just using the echo area, here?

Anyway, I tried the suggestion of Gregory Heytings from yesterday evening
at 21:48:49 +0000.  He put an extra condition into
set-minibuffer-message, so that it only does its thing when the current
frame is also the minibuffer's frame.  It appears to work well.

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 10:32       ` Alan Mackenzie
@ 2020-10-10 11:13         ` Eli Zaretskii
  2020-10-10 12:36           ` Gregory Heytings via Emacs development discussions.
  2020-10-10 12:44           ` Alan Mackenzie
  0 siblings, 2 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-10 11:13 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: monnier, emacs-devel

> Date: Sat, 10 Oct 2020 10:32:33 +0000
> From: Alan Mackenzie <acm@muc.de>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> > Do you intend to leave the active minibuffer on the original frame, and
> > use the other frame for Isearch?  Note that Isearch also uses the
> > minibuffer.
> 
> I'm not understanding that, properly.  When I enter characters into
> isearch in F2, this doesn't throw an error when the F1 minibuffer is
> still active.  Is isearch perhaps just using the echo area, here?
> 
> Anyway, I tried the suggestion of Gregory Heytings from yesterday evening
> at 21:48:49 +0000.  He put an extra condition into
> set-minibuffer-message, so that it only does its thing when the current
> frame is also the minibuffer's frame.  It appears to work well.

Does that work if you set tty-menu-open-use-tmm non-nil, then press
f10 while the I-search: prompt is active?  This is one case where
Isearch reads from the minibuffer.

Another, perhaps more important, use case is when you type "M-s e"
during Isearch: that enters the minibuffer to let you edit the search
string.  Yet another similar use case is when you type "C-x 8 RET"
during Isearch: that reads the character's name/codepoint from the
minibuffer.

These are the use cases I had in mind when I asked about Isearch using
the minibuffer.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 11:13         ` Eli Zaretskii
@ 2020-10-10 12:36           ` Gregory Heytings via Emacs development discussions.
  2020-10-10 12:44           ` Alan Mackenzie
  1 sibling, 0 replies; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-10 12:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Alan Mackenzie, monnier, emacs-devel


>
> Does that work if you set tty-menu-open-use-tmm non-nil, then press f10 
> while the I-search: prompt is active?  This is one case where Isearch 
> reads from the minibuffer.
>

This gives "Command attempted to use minibuffer while in minibuffer", with 
earlier and current Emacs versions, with or without the bugfix.

>
> Another, perhaps more important, use case is when you type "M-s e" 
> during Isearch: that enters the minibuffer to let you edit the search 
> string.
>

This gives "Command attempted to use minibuffer while in minibuffer", with 
earlier and current Emacs versions, with or without the bugfix.

>
> Yet another similar use case is when you type "C-x 8 RET" during 
> Isearch: that reads the character's name/codepoint from the minibuffer.
>

This one works (the active minibuffer is moved to the current frame), with 
earlier and current Emacs versions, with or without the bugfix.

In short: these three use cases are orthogonal to the problem at hand, 
they are not improved or worsened by the bugfix.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 11:13         ` Eli Zaretskii
  2020-10-10 12:36           ` Gregory Heytings via Emacs development discussions.
@ 2020-10-10 12:44           ` Alan Mackenzie
  2020-10-10 12:50             ` Eli Zaretskii
  2020-10-10 13:03             ` Gregory Heytings via Emacs development discussions.
  1 sibling, 2 replies; 45+ messages in thread
From: Alan Mackenzie @ 2020-10-10 12:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: monnier, emacs-devel

Hello, Eli.

On Sat, Oct 10, 2020 at 14:13:32 +0300, Eli Zaretskii wrote:
> > Date: Sat, 10 Oct 2020 10:32:33 +0000
> > From: Alan Mackenzie <acm@muc.de>
> > Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org

> > > Do you intend to leave the active minibuffer on the original frame, and
> > > use the other frame for Isearch?  Note that Isearch also uses the
> > > minibuffer.

> > I'm not understanding that, properly.  When I enter characters into
> > isearch in F2, this doesn't throw an error when the F1 minibuffer is
> > still active.  Is isearch perhaps just using the echo area, here?

> > Anyway, I tried the suggestion of Gregory Heytings from yesterday evening
> > at 21:48:49 +0000.  He put an extra condition into
> > set-minibuffer-message, so that it only does its thing when the current
> > frame is also the minibuffer's frame.  It appears to work well.

> Does that work if you set tty-menu-open-use-tmm non-nil, then press
> f10 while the I-search: prompt is active?  This is one case where
> Isearch reads from the minibuffer.

Ah, yes.  Sorry for being a bit dim, there.

When just the isearch is active, f10 does indeed work.  When,
additionally, C-x b is active on another frame, it throws the error
"Command attempted to use minibuffer while in minibuffer".  This is
surely correct.  However, the isearch highlighting doesn't get removed in
this error case.  That is incorrect.

> Another, perhaps more important, use case is when you type "M-s e"
> during Isearch: that enters the minibuffer to let you edit the search
> string.

This works fine.  Without the C-x b in another frame, it just works.
With the C-x b in the other frame it throws the "Command ... minibuffer"
error and removes the highlighting.

> Yet another similar use case is when you type "C-x 8 RET" during
> Isearch: that reads the character's name/codepoint from the minibuffer.

This goes wrong.  With C-x b active on frame F1, move to F2, start an
isearch, C-x 8 RET, use TAB completion to select a character and RET.
This displays

    Switch to buffer (default xdisp.c):  [Failing I-search: su�] 

on F2.  On terminating the isearch and completing the C-x b action in
F2's minibufer, the buffer switch has worked in frame F1.

At a guess, C-x 8 RET uses a recursive edit, but fails to bind the
variable holding the minibuffer frame.  It changes this variable, but on
exiting the recursive edit, fails to restore it.  Or something like that.

> These are the use cases I had in mind when I asked about Isearch using
> the minibuffer.

OK.

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 12:44           ` Alan Mackenzie
@ 2020-10-10 12:50             ` Eli Zaretskii
  2020-10-10 13:00               ` Eli Zaretskii
  2020-10-10 13:03             ` Gregory Heytings via Emacs development discussions.
  1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-10 12:50 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: monnier, emacs-devel

> Date: Sat, 10 Oct 2020 12:44:46 +0000
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> From: Alan Mackenzie <acm@muc.de>
> 
> When just the isearch is active, f10 does indeed work.  When,
> additionally, C-x b is active on another frame, it throws the error
> "Command attempted to use minibuffer while in minibuffer".  This is
> surely correct.  However, the isearch highlighting doesn't get removed in
> this error case.  That is incorrect.

Is this different from what happened in versions of Emacs before 27.1?

> > Another, perhaps more important, use case is when you type "M-s e"
> > during Isearch: that enters the minibuffer to let you edit the search
> > string.
> 
> This works fine.  Without the C-x b in another frame, it just works.
> With the C-x b in the other frame it throws the "Command ... minibuffer"
> error and removes the highlighting.
> 
> > Yet another similar use case is when you type "C-x 8 RET" during
> > Isearch: that reads the character's name/codepoint from the minibuffer.
> 
> This goes wrong.  With C-x b active on frame F1, move to F2, start an
> isearch, C-x 8 RET, use TAB completion to select a character and RET.
> This displays
> 
>     Switch to buffer (default xdisp.c):  [Failing I-search: su�] 
> 
> on F2.  On terminating the isearch and completing the C-x b action in
> F2's minibufer, the buffer switch has worked in frame F1.

Same question here.

If Gregory's change doesn't make things worse than they were before
Emacs 27.1, then I think we should install it.  In the emacs-27
branch, please.

Thanks.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 12:50             ` Eli Zaretskii
@ 2020-10-10 13:00               ` Eli Zaretskii
  2020-10-10 20:30                 ` Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-10 13:00 UTC (permalink / raw)
  To: acm; +Cc: monnier, emacs-devel

> Date: Sat, 10 Oct 2020 15:50:07 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> If Gregory's change doesn't make things worse than they were before
> Emacs 27.1, then I think we should install it.  In the emacs-27
> branch, please.

Btw, to make sure the change is not for the worse, those same
experiments should be repeated with enable-recursive-minibuffers set
non-nil.

Thanks.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 12:44           ` Alan Mackenzie
  2020-10-10 12:50             ` Eli Zaretskii
@ 2020-10-10 13:03             ` Gregory Heytings via Emacs development discussions.
  2020-10-10 13:47               ` Alan Mackenzie
  1 sibling, 1 reply; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-10 13:03 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Eli Zaretskii, monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1182 bytes --]


> When just the isearch is active, f10 does indeed work.  When, 
> additionally, C-x b is active on another frame, it throws the error 
> "Command attempted to use minibuffer while in minibuffer".  This is 
> surely correct.  However, the isearch highlighting doesn't get removed 
> in this error case.  That is incorrect.
>

It's not removed because isearch is not aborted.  You can continue your 
isearch or abort it with C-g.  That's a difference indeed: in earlier 
Emacsen isearch would have aborted in this case.  Which one is better is 
not clear to me.

>> Yet another similar use case is when you type "C-x 8 RET" during 
>> Isearch: that reads the character's name/codepoint from the minibuffer.
>
> This goes wrong.  With C-x b active on frame F1, move to F2, start an 
> isearch, C-x 8 RET, use TAB completion to select a character and RET. 
> This displays
>
>    Switch to buffer (default xdisp.c):  [Failing I-search: su�]
>
> on F2.  On terminating the isearch and completing the C-x b action in 
> F2's minibufer, the buffer switch has worked in frame F1.
>

It doesn't go wrong, it has moved the minibuffer from frame F1 to frame 
F2.

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 10:15       ` Alan Mackenzie
@ 2020-10-10 13:44         ` Stefan Monnier
  0 siblings, 0 replies; 45+ messages in thread
From: Stefan Monnier @ 2020-10-10 13:44 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Gregory Heytings, emacs-devel

>> (when (and (not noninteractive)
>>             (window-live-p (active-minibuffer-window))
>>             (eq (window-frame) (window-frame (active-minibuffer-window)))
>
> Thanks!  I've just tried this out, and it appears to work well.
>
> In particular, in the scenario I outlined, on a TTY, the echo area for
> frame F2 is used when F2 is the current frame, even if there is a
> minibuffer active in F1.

Indeed.  It looks like I misremembered!
This looks like a plain bug fix that should be on `emacs-27`.
Thanks,


        Stefan




^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 13:03             ` Gregory Heytings via Emacs development discussions.
@ 2020-10-10 13:47               ` Alan Mackenzie
  2020-10-10 20:20                 ` Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 45+ messages in thread
From: Alan Mackenzie @ 2020-10-10 13:47 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, monnier, emacs-devel

Hello, Gregory.

On Sat, Oct 10, 2020 at 13:03:49 +0000, Gregory Heytings wrote:

> > When just the isearch is active, f10 does indeed work.  When, 
> > additionally, C-x b is active on another frame, it throws the error 
> > "Command attempted to use minibuffer while in minibuffer".  This is 
> > surely correct.  However, the isearch highlighting doesn't get removed 
> > in this error case.  That is incorrect.

> It's not removed because isearch is not aborted.  You can continue your 
> isearch or abort it with C-g.  That's a difference indeed: in earlier 
> Emacsen isearch would have aborted in this case.  Which one is better is 
> not clear to me.

Sorry, yes, you're sort of right, here.  But in this scenario, typing
C-b or C-a moves the cursor without terminating the isearch.  That is
definitely incorrect.

> >> Yet another similar use case is when you type "C-x 8 RET" during 
> >> Isearch: that reads the character's name/codepoint from the minibuffer.

> > This goes wrong.  With C-x b active on frame F1, move to F2, start an 
> > isearch, C-x 8 RET, use TAB completion to select a character and RET. 
> > This displays

> >    Switch to buffer (default xdisp.c):  [Failing I-search: su�]

> > on F2.  On terminating the isearch and completing the C-x b action in 
> > F2's minibufer, the buffer switch has worked in frame F1.


> It doesn't go wrong, it has moved the minibuffer from frame F1 to frame 
> F2.

The minibuffer's contents, the C-x b, is acting on F1.  It is surely
wrong to have moved the minibuffer to F2.

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* RE: New multi-command facility displays in the wrong echo area.
       [not found]     ` <<83imbi609a.fsf@gnu.org>
@ 2020-10-10 16:11       ` Drew Adams
  2020-10-10 20:40         ` Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 45+ messages in thread
From: Drew Adams @ 2020-10-10 16:11 UTC (permalink / raw)
  To: Eli Zaretskii, Alan Mackenzie; +Cc: monnier, emacs-devel

> It is quite unusual to leave an active minibuffer
> and switch to another frame to start an Isearch.

It's not unusual at all, for me.  I often have an
open minibuffer while I move to other buffers and
perform various actions before returning to the
minibuffer and finishing with it.  And most often
those buffers are, yes, in windows on other frames.

This includes using minibuffer keys that let me
explore elsewhere, and may themselves open
recursive minibuffers, using Isearch in any
buffer, including but not limited to, the
minibuffer itself (which for me is in its own
frame) and *Completions* (which for me is also in
its own frame).

My use (and Icicles use generally) may not be
"typical", but (1) it's very useful to be able to
do this, and (2) it's always been possible to do
it, before now (since Day One).

I don't yet use Emacs 27, but this sounds like a
very limiting regression, and one that isn't
compensated by any gain.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 13:47               ` Alan Mackenzie
@ 2020-10-10 20:20                 ` Gregory Heytings via Emacs development discussions.
  0 siblings, 0 replies; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-10 20:20 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Eli Zaretskii, monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1111 bytes --]


Hi Alan,

>>>> Yet another similar use case is when you type "C-x 8 RET" during 
>>>> Isearch: that reads the character's name/codepoint from the 
>>>> minibuffer.
>>>
>>> This goes wrong.  With C-x b active on frame F1, move to F2, start an 
>>> isearch, C-x 8 RET, use TAB completion to select a character and RET. 
>>> This displays
>>>
>>>    Switch to buffer (default xdisp.c):  [Failing I-search: su�]
>>>
>>> on F2.  On terminating the isearch and completing the C-x b action in 
>>> F2's minibufer, the buffer switch has worked in frame F1.
>>
>> It doesn't go wrong, it has moved the minibuffer from frame F1 to frame 
>> F2.
>
> The minibuffer's contents, the C-x b, is acting on F1.  It is surely 
> wrong to have moved the minibuffer to F2.
>

It can perhaps be argued that it is wrong, but it's a different problem, 
and this behavior exists since Emacs 24.

FWIW, I don't think it is wrong: the minibuffer has indeed moved to F2, 
but when you press RET after choosing the buffer you want, the buffer 
switch happens in F1.  And on a TTY, Emacs even goes back to F1.

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 13:00               ` Eli Zaretskii
@ 2020-10-10 20:30                 ` Gregory Heytings via Emacs development discussions.
  2020-10-11 14:38                   ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-10 20:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: acm, monnier, emacs-devel


>> If Gregory's change doesn't make things worse than they were before 
>> Emacs 27.1, then I think we should install it.  In the emacs-27 branch, 
>> please.
>
> Btw, to make sure the change is not for the worse, those same 
> experiments should be repeated with enable-recursive-minibuffers set 
> non-nil.
>

Repeating the same experiments with (setq enable-recursive-minibuffers t):

>
> Does that work if you set tty-menu-open-use-tmm non-nil, then press f10 
> while the I-search: prompt is active?  This is one case where Isearch 
> reads from the minibuffer.
>

This works (the active minibuffer is moved to the current frame), with 
earlier and current Emacs versions, with or without the bugfix.

>
> Another, perhaps more important, use case is when you type "M-s e" 
> during Isearch: that enters the minibuffer to let you edit the search 
> string.
>

This works (the active minibuffer is moved to the current frame), with 
earlier and current Emacs versions, with or without the bugfix.

>
> Yet another similar use case is when you type "C-x 8 RET" during 
> Isearch: that reads the character's name/codepoint from the minibuffer.
>

This still works (the active minibuffer is moved to the current frame), 
with earlier and current Emacs versions, with or without the bugfix.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* RE: New multi-command facility displays in the wrong echo area.
  2020-10-10 16:11       ` Drew Adams
@ 2020-10-10 20:40         ` Gregory Heytings via Emacs development discussions.
  2020-10-11  0:59           ` Drew Adams
  0 siblings, 1 reply; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-10 20:40 UTC (permalink / raw)
  To: Drew Adams; +Cc: Eli Zaretskii, Alan Mackenzie, monnier, emacs-devel


>
> I don't yet use Emacs 27, but this sounds like a very limiting 
> regression, and one that isn't compensated by any gain.
>

Don't worry, it is now fixed.

The gain is explained in NEWS.27: When the minibuffer is active, echo-area 
messages are displayed at the end of the minibuffer instead of hiding the 
minibuffer by the echo area display.

For example, if you do C-x C-f, you see "Find file: ...".  If you now 
switch to another window and do C-s foo, you will see: "Find file: ... 
[I-search: foo]".

With earlier Emacsen, or with Emacs 27 and (setq set-message-function 
nil), you see instead: "I-search: foo" (that is, the "Find file: ..." is 
hidden).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* RE: New multi-command facility displays in the wrong echo area.
  2020-10-10 20:40         ` Gregory Heytings via Emacs development discussions.
@ 2020-10-11  0:59           ` Drew Adams
  0 siblings, 0 replies; 45+ messages in thread
From: Drew Adams @ 2020-10-11  0:59 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Alan Mackenzie, Eli Zaretskii, monnier, emacs-devel

> The gain is explained in NEWS.27: When the minibuffer is active, echo-area
> messages are displayed at the end of the minibuffer instead of hiding the
> minibuffer by the echo area display.

Yes, I know.  That's a misfeature, IMO - a regression
for users and libraries - but it was done on purpose.

It should have continued to be possible for `message'
to temporarily write to the echo area (yes, hiding
the minibuffer temporarily), instead of being co-opted
by the `minibuffer-message' behavior.

Instead of having both behaviors possible, and thus
usable for different purposes, they are collapsed
into only the `minibuffer-message' behavior (write
at the end of the minibuffer, instead of to the echo
area).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-10 20:30                 ` Gregory Heytings via Emacs development discussions.
@ 2020-10-11 14:38                   ` Eli Zaretskii
  2020-10-12  9:12                     ` Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-11 14:38 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: acm, monnier, emacs-devel

> Date: Sat, 10 Oct 2020 20:30:07 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: acm@muc.de, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> > Does that work if you set tty-menu-open-use-tmm non-nil, then press f10 
> > while the I-search: prompt is active?  This is one case where Isearch 
> > reads from the minibuffer.
> >
> 
> This works (the active minibuffer is moved to the current frame), with 
> earlier and current Emacs versions, with or without the bugfix.
> 
> >
> > Another, perhaps more important, use case is when you type "M-s e" 
> > during Isearch: that enters the minibuffer to let you edit the search 
> > string.
> >
> 
> This works (the active minibuffer is moved to the current frame), with 
> earlier and current Emacs versions, with or without the bugfix.
> 
> >
> > Yet another similar use case is when you type "C-x 8 RET" during 
> > Isearch: that reads the character's name/codepoint from the minibuffer.
> >
> 
> This still works (the active minibuffer is moved to the current frame), 
> with earlier and current Emacs versions, with or without the bugfix.

Thanks.  So I think your change is a definite improvement, and I
therefore installed it on the emacs-27 branch.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-11 14:38                   ` Eli Zaretskii
@ 2020-10-12  9:12                     ` Gregory Heytings via Emacs development discussions.
  2020-10-12 12:00                       ` Alan Mackenzie
                                         ` (2 more replies)
  0 siblings, 3 replies; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-12  9:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: acm, monnier, emacs-devel


>
> Thanks.  So I think your change is a definite improvement, and I 
> therefore installed it on the emacs-27 branch.
>

Thank you.  Alas, it's not the only bug of this new feature.  A recipe:

emacs -Q
(progn
   (set-frame-width nil 80)
   (setq max-mini-window-height 1)
   (setq default-directory (concat "/" (make-string 67 ?a)))
   (call-interactively 'find-file))
press C-x o
press C-s

At this point you see no indication that I-search has been started.  (If 
you look close enough, the only thing you can see is a curly arrow in the 
right fringe of the miniwindow.)  Likewise, if you press C-x C-s, you see 
no indication that changes have been saved (or not).  And so forth.

I suggest the following fourth condition in set-minibuffer-message:

(< (buffer-size (window-buffer (active-minibuffer-window))) (/ (frame-width (window-frame (active-minibuffer-window))) 2))

Of course it's a heuristic (it could still fail when the face used in the 
miniwindow is different, and larger than, the default face), but it should 
catch 99.99% of the remaining error cases.

It is amazing that such a feature got accepted, was included in an 
official Emacs release, and became Emacs' default behavior, without even 
trying the two obvious cases to test: what happens when there is not 
enough free space in the minibuffer? and what happens when the active 
minibuffer is not on the same frame?

It is even more amazing that, at the same time, my proposed solution to 
display completion candidates in the minibuffer is rejected on the grounds 
that it could cause "potential problems", when so far no one has managed 
to show a case in which it would create an actual problem.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12  9:12                     ` Gregory Heytings via Emacs development discussions.
@ 2020-10-12 12:00                       ` Alan Mackenzie
  2020-10-12 12:18                         ` Gregory Heytings via Emacs development discussions.
  2020-10-12 14:37                       ` Eli Zaretskii
  2020-10-14 20:44                       ` Gregory Heytings via Emacs development discussions.
  2 siblings, 1 reply; 45+ messages in thread
From: Alan Mackenzie @ 2020-10-12 12:00 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, monnier, emacs-devel

Hello, Gregory.

On Mon, Oct 12, 2020 at 09:12:05 +0000, Gregory Heytings wrote:

> > Thanks.  So I think your change is a definite improvement, and I 
> > therefore installed it on the emacs-27 branch.

> Thank you.  Alas, it's not the only bug of this new feature.  A recipe:

> emacs -Q
> (progn
>    (set-frame-width nil 80)
>    (setq max-mini-window-height 1)
>    (setq default-directory (concat "/" (make-string 67 ?a)))
>    (call-interactively 'find-file))
> press C-x o
> press C-s

> At this point you see no indication that I-search has been started.  (If 
> you look close enough, the only thing you can see is a curly arrow in the 
> right fringe of the miniwindow.)  Likewise, if you press C-x C-s, you see 
> no indication that changes have been saved (or not).  And so forth.

Well, whoever sees/doesn't see this did set max-mini-window-height to 1.
Surely this is a case of you ask for it, you get it.

> I suggest the following fourth condition in set-minibuffer-message:

> (< (buffer-size (window-buffer (active-minibuffer-window))) (/ (frame-width (window-frame (active-minibuffer-window))) 2))

> Of course it's a heuristic (it could still fail when the face used in the 
> miniwindow is different, and larger than, the default face), but it should 
> catch 99.99% of the remaining error cases.

Perhaps there's a less heuristic way of dealing with it.  I haven't
looked into it closely.

> It is amazing that such a feature got accepted, was included in an 
> official Emacs release, and became Emacs' default behavior, without even 
> trying the two obvious cases to test: what happens when there is not 
> enough free space in the minibuffer? and what happens when the active 
> minibuffer is not on the same frame?

Bugs are always obvious after somebody's pointed them out.  Well done
for finding them!

> It is even more amazing that, at the same time, my proposed solution to 
> display completion candidates in the minibuffer is rejected on the grounds 
> that it could cause "potential problems", when so far no one has managed 
> to show a case in which it would create an actual problem.

Emacs is ~45 years old.  Some of the maintainers have been on the job
for more than half of that time.  They've developed a feel for what fits
in harmoniously and what could easily jar and cause problems in the
future.  Given the complexity of Emacs, we can't really afford to wait
until potential problems become real problems - there might just be too
many of these to cope with.

For what it's worth, others (including me) have had effective bug fixes
rejected on various grounds.  For better or for worse, it's just part of
Emacs development.

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 12:00                       ` Alan Mackenzie
@ 2020-10-12 12:18                         ` Gregory Heytings via Emacs development discussions.
  0 siblings, 0 replies; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-12 12:18 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Eli Zaretskii, monnier, emacs-devel


Hi Alan,

>>> Thanks.  So I think your change is a definite improvement, and I 
>>> therefore installed it on the emacs-27 branch.
>>
>> Thank you.  Alas, it's not the only bug of this new feature.  A recipe:
>>
>> emacs -Q
>> (progn
>>    (set-frame-width nil 80)
>>    (setq max-mini-window-height 1)
>>    (setq default-directory (concat "/" (make-string 67 ?a)))
>>    (call-interactively 'find-file))
>> press C-x o
>> press C-s
>>
>> At this point you see no indication that I-search has been started. 
>> (If you look close enough, the only thing you can see is a curly arrow 
>> in the right fringe of the miniwindow.)  Likewise, if you press C-x 
>> C-s, you see no indication that changes have been saved (or not).  And 
>> so forth.
>
> Well, whoever sees/doesn't see this did set max-mini-window-height to 1. 
> Surely this is a case of you ask for it, you get it.
>

With earlier Emacsen that setting would not have had such effect, the 
contents of the minibuffer would have been overwritten by the echo area in 
all cases.  Setting max-mini-window-height to 1 is perfectly valid, and by 
the way the same thing could happen with max-mini-window-height set to 2 
and a longer input, and so forth.  This also could happen for those who 
use independent miniwindows, which have a fixed size.

>> It is amazing that such a feature got accepted, was included in an 
>> official Emacs release, and became Emacs' default behavior, without 
>> even trying the two obvious cases to test: what happens when there is 
>> not enough free space in the minibuffer? and what happens when the 
>> active minibuffer is not on the same frame?
>
> Bugs are always obvious after somebody's pointed them out.  Well done 
> for finding them!
>

I don't think so, these two cases are obvious things to check.  I did not 
know about that feature before you sent your message three days ago, and 
after fixing the bug you found this bug is the second thing that 
immediately came to my mind.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12  9:12                     ` Gregory Heytings via Emacs development discussions.
  2020-10-12 12:00                       ` Alan Mackenzie
@ 2020-10-12 14:37                       ` Eli Zaretskii
  2020-10-12 15:41                         ` Gregory Heytings via Emacs development discussions.
                                           ` (2 more replies)
  2020-10-14 20:44                       ` Gregory Heytings via Emacs development discussions.
  2 siblings, 3 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-12 14:37 UTC (permalink / raw)
  To: Gregory Heytings, Juri Linkov; +Cc: acm, monnier, emacs-devel

> Date: Mon, 12 Oct 2020 09:12:05 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: acm@muc.de, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> emacs -Q
> (progn
>   (set-frame-width nil 80)
>   (setq max-mini-window-height 1)
>   (setq default-directory (concat "/" (make-string 67 ?a)))
>   (call-interactively 'find-file))
> press C-x o
> press C-s
> 
> At this point you see no indication that I-search has been started. (If you look close enough, the only thing you can see is a curly arrow in the right fringe of the miniwindow.) Likewise, if you press C-x C-s, you see no indication that changes have been saved (or not). And so forth.

Right.

> I suggest the following fourth condition in set-minibuffer-message:
> 
> (< (buffer-size (window-buffer (active-minibuffer-window))) (/ (frame-width 
> (window-frame (active-minibuffer-window))) 2))

So you suggest in that case to overwrite the minibuffer prompt, like
Emacs 26 did?  I'm not sure I like this: it would bring back many
problems this feature was supposed to fix.  Can we do better than
obliterating the entire minibuffer text?

Juri, any ideas?

In any case, I think the condition could be relaxed: we only care
about how much space is left from the minibuffer text's end till the
end of the screen line, so "if minibuffer text size modulo
window-width is less than something" would be better, I think.  E.g.,
if you use 70 instead of 67 in your recipe, the problem is mostly
gone.

Also, it would be safer to use string-width instead of the number of
characters, or even window-text-pixel-size: some people do customize
the faces used in the minibuffer.

> It is amazing that such a feature got accepted, was included in an official Emacs release, and became Emacs' default behavior, without even trying the two obvious cases to test: what happens when there is not enough free space in the minibuffer? and what happens when the active minibuffer is not on the same frame?

This has some history.  You are welcome to read the discussion in
bug#38457, especially starting at

  https://debbugs.gnu.org/cgi/bugreport.cgi?bug=38457#17

You will see that many issues were discussed, the dangers were
expected, and as result the change became less invasive, which was
especially important because the release cycle was about to start.
However, it didn't sound wise to reject the changes outright because
they've fixed several important use cases that were an annoyance for a
long time.

But yes, any significant change in such basic functionality runs a
risk to break something, especially in relatively rare use cases
(max-mini-window-height set to 1, followed by "C-x o" out of the
minibuffer).  This risk is inherent part of development, and sometimes
mistakes are being made.  We try at least not to make the mistakes we
know about.

> It is even more amazing that, at the same time, my proposed solution to display completion candidates in the minibuffer is rejected on the grounds that it could cause "potential problems", when so far no one has managed to show a case in which it would create an actual problem.

Maybe because we are now wiser and don't want to repeat past mistakes?

Btw, the C-s use case is special, you can see that if you do just
this:

  C-x C-f
  C-s

Juri, would it make sense to do something special for Isearch in the
"C-x o" case as well?  Or am I wrong, and there's nothing special
with Isearch using the mini-window here?



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 14:37                       ` Eli Zaretskii
@ 2020-10-12 15:41                         ` Gregory Heytings via Emacs development discussions.
  2020-10-12 16:01                           ` Eli Zaretskii
  2020-10-12 17:12                         ` Drew Adams
  2020-10-12 19:46                         ` Juri Linkov
  2 siblings, 1 reply; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-12 15:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Juri Linkov, acm, monnier, emacs-devel


>> At this point you see no indication that I-search has been started. (If 
>> you look close enough, the only thing you can see is a curly arrow in 
>> the right fringe of the miniwindow.) Likewise, if you press C-x C-s, 
>> you see no indication that changes have been saved (or not). And so 
>> forth.
>
> Right.
>
>> I suggest the following fourth condition in set-minibuffer-message:
>>
>> (< (buffer-size (window-buffer (active-minibuffer-window))) (/ (frame-width (window-frame (active-minibuffer-window))) 2))
>
> So you suggest in that case to overwrite the minibuffer prompt, like 
> Emacs 26 did?
>

Yes, indeed.  That's clearly better than not showing anything at all. 
When there is not enough space on the right of the current minibuffer 
contents, IMO it should be overwritten.

>
> I'm not sure I like this: it would bring back many problems this feature 
> was supposed to fix.
>

So far I did not know what problems that feature was supposed to fix, so I 
could not make a judgment on this.  The NEWS item does not indicate what 
these problems were, and I had myself never encountered a situation where 
overwriting the current minibuffer contents was problematic.  It seemed to 
me so far that it was only something more aesthetically pleasing.  Now 
that I've read bug#38457, I see that this is not the case, but I'm not at 
all convinced by the proposed solution.  Something like what eldoc does 
when the minibuffer is active (temporarily displaying the info at the 
beginning of the mode-line) would have been a much better and more robust 
solution.  Otherwise, another solution would be to temporarily add a 
"zeroth" (or "minusoneth") line to the minibuffer with the message.

>
> In any case, I think the condition could be relaxed: we only care about 
> how much space is left from the minibuffer text's end till the end of 
> the screen line, so "if minibuffer text size modulo window-width is less 
> than something" would be better, I think.  E.g., if you use 70 instead 
> of 67 in your recipe, the problem is mostly gone.
>

The condition could be refined indeed, but the modulo operation you 
propose would not work with variable pitch faces.  I intentionally 
proposed something simple, which should work in (almost) all cases.  I'm 
an adept of the KISS principle.

>
> Also, it would be safer to use string-width instead of the number of 
> characters, or even window-text-pixel-size: some people do customize the 
> faces used in the minibuffer.
>

I won't comment on this.  As I already said elsewhere, it's IMO awful to 
expect any code to do something like this.

>> It is amazing that such a feature got accepted, was included in an 
>> official Emacs release, and became Emacs' default behavior, without 
>> even trying the two obvious cases to test: what happens when there is 
>> not enough free space in the minibuffer? and what happens when the 
>> active minibuffer is not on the same frame?
>
> This has some history.  You are welcome to read the discussion in 
> bug#38457, especially starting at
>
>  https://debbugs.gnu.org/cgi/bugreport.cgi?bug=38457#17
>
> You will see that many issues were discussed, the dangers were expected, 
> and as result the change became less invasive, which was especially 
> important because the release cycle was about to start. However, it 
> didn't sound wise to reject the changes outright because they've fixed 
> several important use cases that were an annoyance for a long time.
>

See above.  I've now read that bug thread, and I'm not at all convinced 
that the chosen solution was TRT, quite the contrary.

>
> But yes, any significant change in such basic functionality runs a risk 
> to break something, especially in relatively rare use cases 
> (max-mini-window-height set to 1, followed by "C-x o" out of the 
> minibuffer).
>

As I said to Alan, this recipe is just a recipe, it exhibits a more 
general problem.  The same problem would happen with 
max-mini-window-height set to 2 and a longer text, with a miniwindow only 
frame, with a small enough Emacs frame, and so forth.

>
> This risk is inherent part of development, and sometimes mistakes are 
> being made.  We try at least not to make the mistakes we know about.
>

Well... no: the bug#38457 thread contains a message (#317) by Dmitry Gutov 
which points to a problem that is similar to the one I "discovered". 
BTW, he also suggests to use eldoc-minibuffer-message instead of the 
current solution.

>> It is even more amazing that, at the same time, my proposed solution to 
>> display completion candidates in the minibuffer is rejected on the 
>> grounds that it could cause "potential problems", when so far no one 
>> has managed to show a case in which it would create an actual problem.
>
> Maybe because we are now wiser and don't want to repeat past mistakes?
>

It seems to me that being wiser would mean taking the time to evaluate a 
proposed solution, instead of rejecting it outright based on a gut 
feeling.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 15:41                         ` Gregory Heytings via Emacs development discussions.
@ 2020-10-12 16:01                           ` Eli Zaretskii
  2020-10-12 16:31                             ` Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-12 16:01 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: acm, emacs-devel, monnier, juri

> Date: Mon, 12 Oct 2020 15:41:35 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: Juri Linkov <juri@linkov.net>, acm@muc.de, monnier@iro.umontreal.ca,
>         emacs-devel@gnu.org
> 
> > In any case, I think the condition could be relaxed: we only care about 
> > how much space is left from the minibuffer text's end till the end of 
> > the screen line, so "if minibuffer text size modulo window-width is less 
> > than something" would be better, I think.  E.g., if you use 70 instead 
> > of 67 in your recipe, the problem is mostly gone.
> 
> The condition could be refined indeed, but the modulo operation you 
> propose would not work with variable pitch faces.

It will, if the calculation is done in pixels.  The APIs you mentioned
can return pixels instead of columns, or there are alternatives which
do.

> I intentionally proposed something simple, which should work in
> (almost) all cases.  I'm an adept of the KISS principle.

Me too; "the solution should as simple as possible, but not simpler."

> > Also, it would be safer to use string-width instead of the number of 
> > characters, or even window-text-pixel-size: some people do customize the 
> > faces used in the minibuffer.
> 
> I won't comment on this.  As I already said elsewhere, it's IMO awful to 
> expect any code to do something like this.

That function was written because it's really needed and useful.  We
use it under the hood, and I see no reason not to use it in this case,
which is exactly one of the cases for which the function was
implemented.

> See above.  I've now read that bug thread, and I'm not at all convinced 
> that the chosen solution was TRT, quite the contrary.

We can discuss other solutions, of course.  However, significant
changes will have to wait for Emacs 28.

> It seems to me that being wiser would mean taking the time to evaluate a 
> proposed solution, instead of rejecting it outright based on a gut 
> feeling.

Please give me the credit of having done so.  I've given you no reason
to believe otherwise; disagreement doesn't imply incompetence or
sloppiness on my part.  It is simply unfair and even rude to suggest
that.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 16:01                           ` Eli Zaretskii
@ 2020-10-12 16:31                             ` Gregory Heytings via Emacs development discussions.
  2020-10-12 17:20                               ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-12 16:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: juri, acm, monnier, emacs-devel


>>> In any case, I think the condition could be relaxed: we only care 
>>> about how much space is left from the minibuffer text's end till the 
>>> end of the screen line, so "if minibuffer text size modulo 
>>> window-width is less than something" would be better, I think.  E.g., 
>>> if you use 70 instead of 67 in your recipe, the problem is mostly 
>>> gone.
>>
>> The condition could be refined indeed, but the modulo operation you 
>> propose would not work with variable pitch faces.
>
> It will, if the calculation is done in pixels.  The APIs you mentioned 
> can return pixels instead of columns, or there are alternatives which 
> do.
>

Indeed, this would also work:

(< (mod (car (window-text-pixel-size (active-minibuffer-window))) (window-text-width (active-minibuffer-window) t))
    (/ (car (window-text-pixel-size (active-minibuffer-window))) 2))

But going in that direction means that one should also take the current 
window height into account: if the miniwindow is tall enough, the above 
condition could be nil even though there would be enough room to display 
the message.

>> See above.  I've now read that bug thread, and I'm not at all convinced 
>> that the chosen solution was TRT, quite the contrary.
>
> We can discuss other solutions, of course.  However, significant changes 
> will have to wait for Emacs 28.
>

Ouch.  So this last-minute change will last for several years?

>> It seems to me that being wiser would mean taking the time to evaluate 
>> a proposed solution, instead of rejecting it outright based on a gut 
>> feeling.
>
> Please give me the credit of having done so.  I've given you no reason 
> to believe otherwise; disagreement doesn't imply incompetence or 
> sloppiness on my part.  It is simply unfair and even rude to suggest 
> that.
>

I do not suggest anything like that.  But I'm a doubting Thomas, and I 
can't give you this credit until I see a recipe that would convincingly 
demonstrate a potential problem that my proposed solution would create. 
Especially given I explained that this solution is only _at the moment_ 
the best solution, for earlier versions and the current version of Emacs, 
until a better solution is implemented.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* RE: New multi-command facility displays in the wrong echo area.
  2020-10-12 14:37                       ` Eli Zaretskii
  2020-10-12 15:41                         ` Gregory Heytings via Emacs development discussions.
@ 2020-10-12 17:12                         ` Drew Adams
  2020-10-12 17:34                           ` Eli Zaretskii
  2020-10-12 19:46                         ` Juri Linkov
  2 siblings, 1 reply; 45+ messages in thread
From: Drew Adams @ 2020-10-12 17:12 UTC (permalink / raw)
  To: Eli Zaretskii, Gregory Heytings, Juri Linkov; +Cc: acm, monnier, emacs-devel

> So you suggest in that case to overwrite the minibuffer
> prompt, like Emacs 26 did?

I do.

> I'm not sure I like this: it would bring back many
> problems this feature was supposed to fix.  Can we do
> better than obliterating the entire minibuffer text?

Here's the problem, IMO:

The minibuffer and echo area share the same space.

For simple interactions with a user, there's no
problem: either input and output are ordered in
an expected way - no surprises.

For complex interactions, which can include delayed
echoes or echoes from other processes etc., `message'
overwriting minibuffer input (and prompt) can be
disconcerting, and it can even mean that a user might
miss seeing a prompt, and thus become confused by the
ensuing dialog.  And as a result, a user could even
end up mistakenly deleting data or worse.

But complex interactions also allow the use of a
minibuffer as almost a regular buffer - but one that
also gives you access to sets of completions etc.

They let you interrupt your current minibuffer
"dialog" to do something else - examine something
relevant in another buffer, make some changes to
something - whatever.  This is an important _feature_,
not a bug.

Minibuffer interaction is extremely flexible,
precisely because it's more or less a normal buffer
in more or less a normal window.

The changes made for Emacs 27, AFAICT, break this.
They prevent `message' from using the echo area
whenever the minibuffer is active.  In effect, they
turn `message' into `minibuffer-message' when the
minibuffer is active.

There was a reason why we had both `message' and
`minibuffer-message'.  They're both useful when the
minibuffer is active.  Yes.

And the usefulness of `message' in this context is
precisely the same as the problem that you've sought
to cure: by using the echo area it _interrupts_ the
minibuffer dialog temporarily.  And yes, that can
mean hiding input and prompt.

If you really feel that the problem you sought to
fix is so serious, a proper fix would do this: in
some way, _physically separate_ the minibuffer and
the echo area, so they are _both_ visible at the
same time.  Problems solved; end of story.  (But
that needs to be designed and implemented well.)

I object strongly to the "fix" that was made.
And I don't think it should have been made with
discussion only in a bug thread, not here.  And
I said so at the time.

Nothing in that thread really addressed the real
problem, IMO: echo area and minibuffer sharing
the same space.  That elephant in the room was
ignored.

Instead, the "fix" doubled down on that problem,
in effect removing the rich possibilities of
interaction (see complex interactions, above),
and imposing ONLY the simple interaction: initiate
minibuffer and prevent any use of the echo area
until the minibuffer is exited.

Same thing, BTW, with the change of `y-or-n-p' to
using the minibuffer.  That obviates using it
during minibuffer input to just read a character
(without using a recursive minibuffer etc.).

These are, IMO, misguided "fixes" based on a too
simple understanding of the minibuffer.

Users used to be free, while the minibuffer was
active, to do all sorts of things anywhere in
Emacs.  Now you've gone down the road of confining
the minibuffer to a simple, linear, modal (in
effect) ask-and-read behavior.  That's not emacsy,
IMO, and it breaks lots of my uses of the
minibuffer.

If `message' and the echo area are _sometimes_ a
problem for _some_ minibuffer interactions then
find a proper solution by, in some way, separating
the echo area and minibuffer - NOT in time, and
not modally, but in space.

> In any case, I think the condition could be relaxed: we only care
> about how much space is left from the minibuffer text's end till the
> end of the screen line, so "if minibuffer text size modulo
> window-width is less than something" would be better, I think.  E.g.,
> if you use 70 instead of 67 in your recipe, the problem is mostly
> gone.
>
> Also, it would be safer to use string-width instead of the number of
> characters, or even window-text-pixel-size: some people do customize
> the faces used in the minibuffer.

There should be no fiddling with minibuffer size,
no guesses or dependencies on particular line
length, etc.

`minibuffer-message', appending text to the
minibuffer input is definitely not something that
should be overworked.  It's for simple echoes of
info directly relevant to the particular minibuffer
interactions in progress.

> > It is amazing that such a feature got accepted, was included in an official
> Emacs release, and became Emacs' default behavior, without even trying the
> two obvious cases to test: what happens when there is not enough free space
> in the minibuffer? and what happens when the active minibuffer is not on the
> same frame?
> 
> This has some history.  You are welcome to read the discussion in
> bug#38457, especially starting at
> 
> https://urldefense.com/v3/__https://debbugs.gnu.org/cgi/bugreport.cgi?bug=384
> 57*17__;Iw!!GqivPVa7Brio!KMf2iSSkE7JvnGnijw3sBBDFxR7wBlsojqiXwTMqPArBC1Nm-
> LDnhZG-lghgzrvY$
> 
> You will see that many issues were discussed, the dangers were
> expected, and as result the change became less invasive, which was
> especially important because the release cycle was about to start.
> However, it didn't sound wise to reject the changes outright because
> they've fixed several important use cases that were an annoyance for a
> long time.

I don't agree that they've fixed several important
use cases.  Anything they've "fixed" has been with
us from Day One - and has long been recognized as
somewhat problematic.  There was no urgency to toss
this "fix" onto Emacs.

> But yes, any significant change in such basic functionality runs a
> risk to break something, especially in relatively rare use cases
> (max-mini-window-height set to 1, followed by "C-x o" out of the
> minibuffer).  This risk is inherent part of development, and sometimes
> mistakes are being made.  We try at least not to make the mistakes we
> know about.

I pointed to mistakes being made in that bug thread.
That was ignored.  There was entirely too much haste
to "fix" the problems reported - which were nothing
new.

> > It is even more amazing that, at the same time, my proposed solution to
> display completion candidates in the minibuffer is rejected on the grounds
> that it could cause "potential problems", when so far no one has managed to
> show a case in which it would create an actual problem.
> 
> Maybe because we are now wiser and don't want to repeat past mistakes?
> 
> Btw, the C-s use case is special, you can see that if you do just
> this: C-x C-f C-s

I don't see anything special about that.  Without
changing to another buffer, `C-s' just searches
your minibuffer input.  It should do exactly that.

And with changing to another buffer/window, `C-s'
should just search that space instead.  Nothing
special here.  Same behavior as a non-minibuffer
buffer.

The minibuffer is a general text-editing buffer,
in addition to being a question-answering
text-input area.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 16:31                             ` Gregory Heytings via Emacs development discussions.
@ 2020-10-12 17:20                               ` Eli Zaretskii
  2020-10-12 21:06                                 ` Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-12 17:20 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: acm, emacs-devel, monnier, juri

> Date: Mon, 12 Oct 2020 16:31:27 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: juri@linkov.net, acm@muc.de, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> Indeed, this would also work:
> 
> (< (mod (car (window-text-pixel-size (active-minibuffer-window))) (window-text-width (active-minibuffer-window) t))
>     (/ (car (window-text-pixel-size (active-minibuffer-window))) 2))
> 
> But going in that direction means that one should also take the current 
> window height into account: if the miniwindow is tall enough, the above 
> condition could be nil even though there would be enough room to display 
> the message.

You mean, if the message to be displayed in the minibuffer uses large
fonts or includes tall images?  In that case, we will simply display
the single line with partially-visible text/image (assuming
max-mini-window-height doesn't allow to resize to see all of it), and
I don't see what can be done about that.

It is highly unusual for messages to use such faces or images, and if
some features do that, users of those features should be told to not
limit the mini-window height to a size that's too small.

> > We can discuss other solutions, of course.  However, significant changes 
> > will have to wait for Emacs 28.
> 
> Ouch.  So this last-minute change will last for several years?

Unless we can come up with a change that is either simple or safe.  Or
if we decide that the current situation is so unacceptable that we are
willing to take higher risks of releasing a less stable Emacs 27.2.

> > Please give me the credit of having done so.  I've given you no reason 
> > to believe otherwise; disagreement doesn't imply incompetence or 
> > sloppiness on my part.  It is simply unfair and even rude to suggest 
> > that.
> 
> I do not suggest anything like that.  But I'm a doubting Thomas, and I 
> can't give you this credit until I see a recipe that would convincingly 
> demonstrate a potential problem that my proposed solution would create. 

I cannot help you with your doubts more than I already did.  If you
still have those doubts, I'd appreciate if you keep them to yourself,
because having them written here is an insult I don't think I deserve.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 17:12                         ` Drew Adams
@ 2020-10-12 17:34                           ` Eli Zaretskii
  0 siblings, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-12 17:34 UTC (permalink / raw)
  To: Drew Adams; +Cc: ghe, acm, emacs-devel, monnier, juri

> Date: Mon, 12 Oct 2020 10:12:39 -0700 (PDT)
> From: Drew Adams <drew.adams@oracle.com>
> Cc: acm@muc.de, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> > So you suggest in that case to overwrite the minibuffer
> > prompt, like Emacs 26 did?
> 
> I do.

Drew, please don't go there.  These "rearguard wars" are pointless:
you've already argued all those arguments in the past, and were unable
to convince.  There's no need to reiterate your opinions; we know all
too well that you are unhappy about this change in behavior, and will
never agree with it.

But we aren't going back to what Emacs 26 did.  We might decide to
change the current behavior to improve it, but there's no chance we
are going to remove it.  So please don't start that argument again.
You can always customize your Emacs to behave like Emacs 26 did.

I'm sorry, I cannot afford reading the rest of your message, as it
simply repeats what you have already said in the past, several times.
Life is too short.

Just let go, will you?  TIA.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 14:37                       ` Eli Zaretskii
  2020-10-12 15:41                         ` Gregory Heytings via Emacs development discussions.
  2020-10-12 17:12                         ` Drew Adams
@ 2020-10-12 19:46                         ` Juri Linkov
  2020-10-13  2:25                           ` Eli Zaretskii
  2 siblings, 1 reply; 45+ messages in thread
From: Juri Linkov @ 2020-10-12 19:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gregory Heytings, acm, monnier, emacs-devel

> Btw, the C-s use case is special, you can see that if you do just
> this:
>
>   C-x C-f
>   C-s
>
> Juri, would it make sense to do something special for Isearch in the
> "C-x o" case as well?  Or am I wrong, and there's nothing special
> with Isearch using the mini-window here?

Actually, this case is not special to Isearch.

AFAIU, the problem is following: typing more characters at the end of
the minibuffer enlarges the minibuffer window when the minibuffer grows
longer than the frame's width.  The question is why the minibuffer window
is not enlarged when an overlay is added at the end of the minibuffer?
Is it possible to do this for an added overlay?  If this is impossible
to do automatically, then maybe the minibuffer window could be enlarged
in set-minibuffer-message?



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 17:20                               ` Eli Zaretskii
@ 2020-10-12 21:06                                 ` Gregory Heytings via Emacs development discussions.
  2020-10-13 14:03                                   ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-12 21:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: acm, emacs-devel, monnier, juri


>>> We can discuss other solutions, of course.  However, significant 
>>> changes will have to wait for Emacs 28.
>>
>> Ouch.  So this last-minute change will last for several years?
>
> Unless we can come up with a change that is either simple or safe.  Or 
> if we decide that the current situation is so unacceptable that we are 
> willing to take higher risks of releasing a less stable Emacs 27.2.
>

I cannot make such a judgment.  But I think options should at least be 
explored.  Would doing something like what eldoc-minibuffer-message does 
possibly be a good solution?  It seems to me that this is safer than the 
current situation, as it does not fiddle with the minibuffer contents. 
If so, what do you (and others) think of the following:

(defvar minibuffer-message-mode-line-string nil)
(setq minibuffer-message-clear-timeout 3)
(defun clear-minibuffer-message ()
   (when (not noninteractive)
     (when (timerp minibuffer-message-timer)
       (cancel-timer minibuffer-message-timer)
       (setq minibuffer-message-timer nil))
     (setq minibuffer-message-mode-line-string nil)))
(defface minibuffer-message-face
   `((t (:background ,(face-attribute 'default :background)
         :foreground ,(face-attribute 'default :foreground)))) "")
(defun set-minibuffer-message (message)
   (when (and (not noninteractive)
              (window-live-p (active-minibuffer-window))
              (eq (window-frame) (window-frame (active-minibuffer-window))))
     (progn
       (when (numberp minibuffer-message-clear-timeout)
         (setq minibuffer-message-timer
               (run-with-timer minibuffer-message-clear-timeout nil
                               #'clear-minibuffer-message)))
       (with-current-buffer
           (window-buffer
            (or (window-in-direction 'above (minibuffer-window))
                (minibuffer-selected-window)
                (get-largest-window)))
         (clear-minibuffer-message)
         (when (and mode-line-format
                    (not (and (listp mode-line-format)
                              (assq 'minibuffer-message-mode-line-string
                                    mode-line-format))))
           (setq mode-line-format
                 (list "" '(minibuffer-message-mode-line-string
                            (" " (:propertize minibuffer-message-mode-line-string
                                              face minibuffer-message-face) " "))
                       mode-line-format)))
         (setq minibuffer-message-mode-line-string message)
         (force-mode-line-update))
       t)))

>
> I cannot help you with your doubts more than I already did.  If you 
> still have those doubts, I'd appreciate if you keep them to yourself, 
> because having them written here is an insult I don't think I deserve.
>

Where do you see an insult in what I wrote?  I'm simply asking for a piece 
of code instead of abstract arguments.  Anyway, as you said to Drew, life 
is too short, so I will simply continue to use my code for myself, and I 
hope that others will find it useful too.  And if the situation has not 
improved in a few months, I'll ring the bell again.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 19:46                         ` Juri Linkov
@ 2020-10-13  2:25                           ` Eli Zaretskii
  0 siblings, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-13  2:25 UTC (permalink / raw)
  To: Juri Linkov; +Cc: ghe, acm, monnier, emacs-devel

> From: Juri Linkov <juri@linkov.net>
> Cc: Gregory Heytings <ghe@sdf.org>,  acm@muc.de,  monnier@iro.umontreal.ca,
>   emacs-devel@gnu.org
> Date: Mon, 12 Oct 2020 22:46:29 +0300
> 
> AFAIU, the problem is following: typing more characters at the end of
> the minibuffer enlarges the minibuffer window when the minibuffer grows
> longer than the frame's width.  The question is why the minibuffer window
> is not enlarged when an overlay is added at the end of the minibuffer?

It isn't related to the overlay, it is related to the fact that
max-mini-window-height is set to 1.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12 21:06                                 ` Gregory Heytings via Emacs development discussions.
@ 2020-10-13 14:03                                   ` Eli Zaretskii
  2020-10-13 19:27                                     ` Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-13 14:03 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: acm, juri, monnier, emacs-devel

> Date: Mon, 12 Oct 2020 21:06:12 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: acm@muc.de, emacs-devel@gnu.org, monnier@iro.umontreal.ca, juri@linkov.net
> 
> > Unless we can come up with a change that is either simple or safe.  Or 
> > if we decide that the current situation is so unacceptable that we are 
> > willing to take higher risks of releasing a less stable Emacs 27.2.
> >
> 
> I cannot make such a judgment.  But I think options should at least be 
> explored.

That goes without saying.

> Would doing something like what eldoc-minibuffer-message does 
> possibly be a good solution?  It seems to me that this is safer than the 
> current situation, as it does not fiddle with the minibuffer contents. 
> If so, what do you (and others) think of the following:

I personally feel that moving echo-area messages to the mode line is
too drastic a change to make it by default, and certainly in a minor
release.  But let's hear wjat others think, and what other ideas will
be brought up.

> (defvar minibuffer-message-mode-line-string nil)
> (setq minibuffer-message-clear-timeout 3)

This seem to make the message clear automatically after a 3-sec
timeout?  If so, this is also a change in behavior wrt what 'message'
does: the current behavior is to clear the message only when an input
event comes in, the timeout is optional and off by default.

> > I cannot help you with your doubts more than I already did.  If you 
> > still have those doubts, I'd appreciate if you keep them to yourself, 
> > because having them written here is an insult I don't think I deserve.
> >
> 
> Where do you see an insult in what I wrote?

That you publicly accuse me of not evaluating your proposal properly,
based on nothing but your tendency to doubt (and the fact that I
disagreed with your opinions).



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-13 14:03                                   ` Eli Zaretskii
@ 2020-10-13 19:27                                     ` Gregory Heytings via Emacs development discussions.
  2020-10-13 21:22                                       ` Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-13 19:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: acm, juri, monnier, emacs-devel


Hi Eli,

Thanks for your comments.

>> (defvar minibuffer-message-mode-line-string nil)
>> (setq minibuffer-message-clear-timeout 3)
>
> This seem to make the message clear automatically after a 3-sec timeout? 
> If so, this is also a change in behavior wrt what 'message' does: the 
> current behavior is to clear the message only when an input event comes 
> in, the timeout is optional and off by default.
>

Indeed, sorry, I forgot to remove that line (which I used to test the 
function) before sending my mail.  It can of course be removed.

Here is a slightly improved version of the code, which removes the 
(minibuffer-message-mode-line-string ...) from mode-line-format when 
clearing the minibuffer message.

(defvar minibuffer-message-mode-line-string nil)
(defvar minibuffer-message-buffer nil)
(defun clear-minibuffer-message ()
   (when (not noninteractive)
     (when (timerp minibuffer-message-timer)
       (cancel-timer minibuffer-message-timer)
       (setq minibuffer-message-timer nil))
     (setq minibuffer-message-mode-line-string nil)
     (if (bufferp minibuffer-message-buffer)
         (with-current-buffer minibuffer-message-buffer
           (let ((mls (and (listp mode-line-format)
                           (assq 'minibuffer-message-mode-line-string
                                 mode-line-format))))
             (if mls (setq mode-line-format (remq mls mode-line-format))))))))
(defface minibuffer-message-face
   `((t (:background ,(face-attribute 'default :background)
         :foreground ,(face-attribute 'default :foreground)))) "")
(defun set-minibuffer-message (message)
   (when (and (not noninteractive)
              (window-live-p (active-minibuffer-window))
              (eq (window-frame) (window-frame (active-minibuffer-window))))
     (progn
       (when (numberp minibuffer-message-clear-timeout)
         (setq minibuffer-message-timer
               (run-with-timer minibuffer-message-clear-timeout nil
                               #'clear-minibuffer-message)))
       (with-current-buffer
           (window-buffer
            (or (window-in-direction 'above (minibuffer-window))
                (minibuffer-selected-window)
                (get-largest-window)))
         (clear-minibuffer-message)
         (when (and mode-line-format
                    (not (and (listp mode-line-format)
                              (assq 'minibuffer-message-mode-line-string
                                    mode-line-format))))
           (setq minibuffer-message-buffer (current-buffer))
           (setq mode-line-format
                 (list "" '(minibuffer-message-mode-line-string
                            (" " (:propertize minibuffer-message-mode-line-string
                                              face minibuffer-message-face) " "))
                       mode-line-format)))
         (setq minibuffer-message-mode-line-string message)
         (force-mode-line-update))
       t)))



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-13 19:27                                     ` Gregory Heytings via Emacs development discussions.
@ 2020-10-13 21:22                                       ` Gregory Heytings via Emacs development discussions.
  0 siblings, 0 replies; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-13 21:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: acm, juri, monnier, emacs-devel


Hi Eli,

>
> Here is a slightly improved version of the code, which removes the 
> (minibuffer-message-mode-line-string ...) from mode-line-format when 
> clearing the minibuffer message.
>

Please ignore the code I sent you two hours ago, and replace it with the 
following one:

(defvar minibuffer-message-mode-line-string nil)
(defvar minibuffer-message-mode-line-buffer nil)
(defun clear-minibuffer-message ()
   (when (not noninteractive)
     (when (timerp minibuffer-message-timer)
       (cancel-timer minibuffer-message-timer)
       (setq minibuffer-message-timer nil))
     (setq minibuffer-message-mode-line-string nil)
     (when (bufferp minibuffer-message-mode-line-buffer)
       (with-current-buffer minibuffer-message-mode-line-buffer
         (let ((mls (and (listp mode-line-format)
                         (assq 'minibuffer-message-mode-line-string
                               mode-line-format))))
           (if mls (setq mode-line-format (cadr (remq mls mode-line-format))))))
       (setq minibuffer-message-mode-line-buffer nil))))
(defface minibuffer-message-face
   `((t (:background ,(face-attribute 'default :background)
         :foreground ,(face-attribute 'default :foreground)))) "")
(defun set-minibuffer-message (message)
   (when (and (not noninteractive)
              (window-live-p (active-minibuffer-window))
              (eq (window-frame) (window-frame (active-minibuffer-window))))
     (progn
       (when (numberp minibuffer-message-clear-timeout)
         (setq minibuffer-message-timer
               (run-with-timer minibuffer-message-clear-timeout nil
                               #'clear-minibuffer-message)))
       (with-current-buffer
           (window-buffer
            (or (window-in-direction 'above (minibuffer-window))
                (minibuffer-selected-window)
                (get-largest-window)))
         (clear-minibuffer-message)
         (when (and mode-line-format
                    (not (and (listp mode-line-format)
                              (assq 'minibuffer-message-mode-line-string
                                    mode-line-format))))
           (setq minibuffer-message-mode-line-buffer (current-buffer))
           (setq mode-line-format
                 (list "" '(minibuffer-message-mode-line-string
                            (" " (:propertize minibuffer-message-mode-line-string
                                              face minibuffer-message-face) " "))
                       mode-line-format)))
         (setq minibuffer-message-mode-line-string (substring-no-properties message))
         (force-mode-line-update))
       t)))



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-12  9:12                     ` Gregory Heytings via Emacs development discussions.
  2020-10-12 12:00                       ` Alan Mackenzie
  2020-10-12 14:37                       ` Eli Zaretskii
@ 2020-10-14 20:44                       ` Gregory Heytings via Emacs development discussions.
       [not found]                         ` <1cd65040-f7ad-4613-b3fb-7cfa62bb0488@default>
                                           ` (2 more replies)
  2 siblings, 3 replies; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-14 20:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: acm, monnier, emacs-devel


Hi Eli,

>> Thanks.  So I think your change is a definite improvement, and I 
>> therefore installed it on the emacs-27 branch.
>
> Thank you.
>

I just realized (thanks to Stefan's last email on this list) that my patch 
introduces a regression for those who (like him) use miniwindow-only 
frames.

To correct that regression, the third condition in set-minibuffer-message:

(eq (window-frame) (window-frame (active-minibuffer-window))

should be:

(or (eq (window-frame) (window-frame (active-minibuffer-window)))
     (eq (frame-parameter (window-frame (active-minibuffer-window)) 'minibuffer) 'only)))

It means: display the message at the end of the active minibuffer if it is 
either on the same frame as the current window, or if it is in a 
miniwindow-only frame.

Gregory



^ permalink raw reply	[flat|nested] 45+ messages in thread

* RE: New multi-command facility displays in the wrong echo area.
       [not found]                         ` <1cd65040-f7ad-4613-b3fb-7cfa62bb0488@default>
@ 2020-10-14 22:15                           ` Gregory Heytings via Emacs development discussions.
  0 siblings, 0 replies; 45+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-14 22:15 UTC (permalink / raw)
  To: Drew Adams; +Cc: Eli Zaretskii, acm, monnier, emacs-devel


Hi Drew,

>> I just realized (thanks to Stefan's last email on this list) that my 
>> patch introduces a regression for those who (like him) use 
>> miniwindow-only frames.
>>
>> To correct that regression, ...
>>
>> display the message at the end of the active minibuffer if it is either 
>> on the same frame as the current window, or if it is in a 
>> miniwindow-only frame.
>
> That takes care of that regression, but it doesn't take care of the 
> problem for minibuffer-only frames that it aims to solve otherwise.
>
> This is another reason why echo display in the mode-line is a 
> half-measure.  I'm in the same boat as Stefan on this: I use a 
> standalone minibuffer frame.  And I don't want any `message' output 
> shown in the minibuffer.
>

I gave you a (rough) draft that shows how this can be done yesterday.  I 
copy it here again:

(progn
   (select-frame (make-frame '((minibuffer . nil) (name . "Drew's Echo Area"))))
   (set-frame-height nil 1)
   (set-frame-parameter nil 'tool-bar-lines nil)
   (set-frame-parameter nil 'menu-bar-lines nil)
   (switch-to-buffer " *Drew's Echo Area*")
   (setq-local mode-line-format nil)
   (setq cursor-in-non-selected-windows nil))

(defun set-minibuffer-message (message)
   (with-current-buffer (get-buffer " *Drew's Echo Area*")
     (setq-local inhibit-read-only t)
     (erase-buffer)
     (insert message))
   t)

It's only a rough draft, but it seems to work quite well already.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-14 20:44                       ` Gregory Heytings via Emacs development discussions.
       [not found]                         ` <1cd65040-f7ad-4613-b3fb-7cfa62bb0488@default>
@ 2020-10-14 22:51                         ` Stefan Monnier
  2020-10-16  7:19                           ` Eli Zaretskii
  2020-10-16  7:19                         ` Eli Zaretskii
  2 siblings, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2020-10-14 22:51 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: acm, Eli Zaretskii, emacs-devel

> (or (eq (window-frame) (window-frame (active-minibuffer-window)))
>     (eq (frame-parameter (window-frame (active-minibuffer-window)) 'minibuffer) 'only)))

I think it would be cleaner (i.e. better express the intent) if it was
written something like

    (eq (mini-window-of (selected-frame))
        (active-minibuffer-window))

which may require writing `mini-window-of` first (and choosing a better
name for it along the way).


        Stefan




^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-14 20:44                       ` Gregory Heytings via Emacs development discussions.
       [not found]                         ` <1cd65040-f7ad-4613-b3fb-7cfa62bb0488@default>
  2020-10-14 22:51                         ` Stefan Monnier
@ 2020-10-16  7:19                         ` Eli Zaretskii
  2 siblings, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-16  7:19 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: acm, monnier, emacs-devel

> Date: Wed, 14 Oct 2020 20:44:15 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: acm@muc.de, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> I just realized (thanks to Stefan's last email on this list) that my patch 
> introduces a regression for those who (like him) use miniwindow-only 
> frames.
> 
> To correct that regression, the third condition in set-minibuffer-message:
> 
> (eq (window-frame) (window-frame (active-minibuffer-window))
> 
> should be:
> 
> (or (eq (window-frame) (window-frame (active-minibuffer-window)))
>      (eq (frame-parameter (window-frame (active-minibuffer-window)) 'minibuffer) 'only)))
> 
> It means: display the message at the end of the active minibuffer if it is 
> either on the same frame as the current window, or if it is in a 
> miniwindow-only frame.

Thanks, I fixed this with a similar change.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: New multi-command facility displays in the wrong echo area.
  2020-10-14 22:51                         ` Stefan Monnier
@ 2020-10-16  7:19                           ` Eli Zaretskii
  0 siblings, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-10-16  7:19 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: ghe, acm, emacs-devel

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>,  acm@muc.de,  emacs-devel@gnu.org
> Date: Wed, 14 Oct 2020 18:51:09 -0400
> 
> > (or (eq (window-frame) (window-frame (active-minibuffer-window)))
> >     (eq (frame-parameter (window-frame (active-minibuffer-window)) 'minibuffer) 'only)))
> 
> I think it would be cleaner (i.e. better express the intent) if it was
> written something like
> 
>     (eq (mini-window-of (selected-frame))
>         (active-minibuffer-window))
> 
> which may require writing `mini-window-of` first (and choosing a better
> name for it along the way).

Yes, I've used let* to avoid calling active-minibuffer-window (and
other functions) more than once.



^ permalink raw reply	[flat|nested] 45+ messages in thread

end of thread, other threads:[~2020-10-16  7:19 UTC | newest]

Thread overview: 45+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-09 16:34 New multi-command facility displays in the wrong echo area Alan Mackenzie
2020-10-09 19:47 ` Stefan Monnier
2020-10-09 20:38   ` Alan Mackenzie
2020-10-09 22:12     ` Stefan Monnier
2020-10-09 22:56       ` Drew Adams
2020-10-10  6:52     ` Eli Zaretskii
2020-10-10 10:32       ` Alan Mackenzie
2020-10-10 11:13         ` Eli Zaretskii
2020-10-10 12:36           ` Gregory Heytings via Emacs development discussions.
2020-10-10 12:44           ` Alan Mackenzie
2020-10-10 12:50             ` Eli Zaretskii
2020-10-10 13:00               ` Eli Zaretskii
2020-10-10 20:30                 ` Gregory Heytings via Emacs development discussions.
2020-10-11 14:38                   ` Eli Zaretskii
2020-10-12  9:12                     ` Gregory Heytings via Emacs development discussions.
2020-10-12 12:00                       ` Alan Mackenzie
2020-10-12 12:18                         ` Gregory Heytings via Emacs development discussions.
2020-10-12 14:37                       ` Eli Zaretskii
2020-10-12 15:41                         ` Gregory Heytings via Emacs development discussions.
2020-10-12 16:01                           ` Eli Zaretskii
2020-10-12 16:31                             ` Gregory Heytings via Emacs development discussions.
2020-10-12 17:20                               ` Eli Zaretskii
2020-10-12 21:06                                 ` Gregory Heytings via Emacs development discussions.
2020-10-13 14:03                                   ` Eli Zaretskii
2020-10-13 19:27                                     ` Gregory Heytings via Emacs development discussions.
2020-10-13 21:22                                       ` Gregory Heytings via Emacs development discussions.
2020-10-12 17:12                         ` Drew Adams
2020-10-12 17:34                           ` Eli Zaretskii
2020-10-12 19:46                         ` Juri Linkov
2020-10-13  2:25                           ` Eli Zaretskii
2020-10-14 20:44                       ` Gregory Heytings via Emacs development discussions.
     [not found]                         ` <1cd65040-f7ad-4613-b3fb-7cfa62bb0488@default>
2020-10-14 22:15                           ` Gregory Heytings via Emacs development discussions.
2020-10-14 22:51                         ` Stefan Monnier
2020-10-16  7:19                           ` Eli Zaretskii
2020-10-16  7:19                         ` Eli Zaretskii
2020-10-10 13:03             ` Gregory Heytings via Emacs development discussions.
2020-10-10 13:47               ` Alan Mackenzie
2020-10-10 20:20                 ` Gregory Heytings via Emacs development discussions.
2020-10-09 21:14   ` Gregory Heytings via Emacs development discussions.
2020-10-09 21:48     ` Gregory Heytings via Emacs development discussions.
2020-10-10 10:15       ` Alan Mackenzie
2020-10-10 13:44         ` Stefan Monnier
     [not found] <<20201009163445.GB4027@ACM>
     [not found] ` <<jwv362nkwss.fsf-monnier+emacs@gnu.org>
     [not found]   ` <<20201009203810.GC4027@ACM>
     [not found]     ` <<83imbi609a.fsf@gnu.org>
2020-10-10 16:11       ` Drew Adams
2020-10-10 20:40         ` Gregory Heytings via Emacs development discussions.
2020-10-11  0:59           ` Drew Adams

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).