zsh-workers
 help / color / mirror / code / Atom feed
* Bug: Callback to widget set with `zle -Fw <widget>` shouldn't change $LASTWIDGET
@ 2022-11-16 15:06 Marlon Richert
  2022-11-16 18:24 ` Bart Schaefer
  0 siblings, 1 reply; 5+ messages in thread
From: Marlon Richert @ 2022-11-16 15:06 UTC (permalink / raw)
  To: Zsh hackers list

Currently, when the ZLE calls a widget set with `zle -Fw <widget>`,
this changes the value of $LASTWIDGET. This in turn breaks several of
the widgets listed in the manual under User Contributions. For
example:

% zsh -f
% autoload -Uz copy-earlier-word
% zle -N copy-earlier-word
% bindkey '\e,' copy-earlier-word
% # Pressing ^[, multiple times at this point successfully cycles
through the current words on the command line.
% handler() { local fd=$1; zle -F $fd; exec {fd}<&- }
% zle-line-pre-redraw() { local fd; exec {fd}< <( print ); zle -Fw $fd handler }
% zle -N handler
% zle -N zle-line-pre-redraw
% # Now ^[, still copies the last word on the line, but can no longer
cycle to previous words when pressed again.


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

* Re: Bug: Callback to widget set with `zle -Fw <widget>` shouldn't change $LASTWIDGET
  2022-11-16 15:06 Bug: Callback to widget set with `zle -Fw <widget>` shouldn't change $LASTWIDGET Marlon Richert
@ 2022-11-16 18:24 ` Bart Schaefer
  2022-11-17 13:04   ` Marlon Richert
  0 siblings, 1 reply; 5+ messages in thread
From: Bart Schaefer @ 2022-11-16 18:24 UTC (permalink / raw)
  To: Marlon Richert; +Cc: Zsh hackers list

On Wed, Nov 16, 2022 at 7:08 AM Marlon Richert <marlon.richert@gmail.com> wrote:
>
> Currently, when the ZLE calls a widget set with `zle -Fw <widget>`,
> this changes the value of $LASTWIDGET.

Hrm, normally (running "zle WIDGET ..." explicitly) this would be
skipped (unless "zle WIDGET -w ...").  Too bad -w was overloaded in
this way.  It's not technically overloading because it's used in
different contexts, but mnemonically at least it could be confusing
that "zle -Fw FD WIDGET" and "zle WIDGET -w" would seem to have
inverted meanings of -w if we were to change the default behavior of
-F.

Of course it's also "-Fw" as a single "option", not "-F -w", so we
can't even do something like "zle -F +w" to indicate the desired
behavior.


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

* Re: Bug: Callback to widget set with `zle -Fw <widget>` shouldn't change $LASTWIDGET
  2022-11-16 18:24 ` Bart Schaefer
@ 2022-11-17 13:04   ` Marlon Richert
  2022-11-17 13:28     ` Roman Perepelitsa
  2022-11-17 16:18     ` Bart Schaefer
  0 siblings, 2 replies; 5+ messages in thread
From: Marlon Richert @ 2022-11-17 13:04 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: Zsh hackers list

The -w in `zle -Fw arg` is not the inverse of the -w in `zle -w arg`.
It has a different purpose:
* In `zle -F callback`, callback is a function and gets called as such.
* In `zle -Fw callback`, callback is a widget and gets called as such.

The latter form is necessary if you want to be able to call other ZLE
widgets from the callback or access other ZLE functionality. You
cannot do that with the first form.

It's not the "inverted meaning" here that is the bug. `zle -F` (with
or without -w) just shouldn't ever change $LASTWIDGET in the first
place. It breaks a lot of existing widget functions and there is no
possible workaround.

On Wed, Nov 16, 2022 at 8:25 PM Bart Schaefer <schaefer@brasslantern.com> wrote:
>
> On Wed, Nov 16, 2022 at 7:08 AM Marlon Richert <marlon.richert@gmail.com> wrote:
> >
> > Currently, when the ZLE calls a widget set with `zle -Fw <widget>`,
> > this changes the value of $LASTWIDGET.
>
> Hrm, normally (running "zle WIDGET ..." explicitly) this would be
> skipped (unless "zle WIDGET -w ...").  Too bad -w was overloaded in
> this way.  It's not technically overloading because it's used in
> different contexts, but mnemonically at least it could be confusing
> that "zle -Fw FD WIDGET" and "zle WIDGET -w" would seem to have
> inverted meanings of -w if we were to change the default behavior of
> -F.
>
> Of course it's also "-Fw" as a single "option", not "-F -w", so we
> can't even do something like "zle -F +w" to indicate the desired
> behavior.


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

* Re: Bug: Callback to widget set with `zle -Fw <widget>` shouldn't change $LASTWIDGET
  2022-11-17 13:04   ` Marlon Richert
@ 2022-11-17 13:28     ` Roman Perepelitsa
  2022-11-17 16:18     ` Bart Schaefer
  1 sibling, 0 replies; 5+ messages in thread
From: Roman Perepelitsa @ 2022-11-17 13:28 UTC (permalink / raw)
  To: Marlon Richert; +Cc: Bart Schaefer, Zsh hackers list

On Thu, Nov 17, 2022 at 2:06 PM Marlon Richert <marlon.richert@gmail.com> wrote:
>
> It's not the "inverted meaning" here that is the bug. `zle -F` (with
> or without -w) just shouldn't ever change $LASTWIDGET in the first
> place. It breaks a lot of existing widget functions and there is no
> possible workaround.

Relevant: https://www.zsh.org/mla/workers/2019/msg00204.html

Especially this part:

> The same branch also adds -W option to zle widget command. This
> option instructs zle to keep LASTWIDGET unchanged.

This part of the patch wasn't applied and the code is long gone (I
didn't attach it to the email) but it's fairly straightforward to
implement.

Roman.


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

* Re: Bug: Callback to widget set with `zle -Fw <widget>` shouldn't change $LASTWIDGET
  2022-11-17 13:04   ` Marlon Richert
  2022-11-17 13:28     ` Roman Perepelitsa
@ 2022-11-17 16:18     ` Bart Schaefer
  1 sibling, 0 replies; 5+ messages in thread
From: Bart Schaefer @ 2022-11-17 16:18 UTC (permalink / raw)
  To: Marlon Richert; +Cc: Zsh hackers list

On Thu, Nov 17, 2022 at 5:05 AM Marlon Richert <marlon.richert@gmail.com> wrote:
>
> The -w in `zle -Fw arg` is not the inverse of the -w in `zle -w arg`.
> It has a different purpose:

I KNOW that.  I was just pointing out potential future confusion.


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

end of thread, other threads:[~2022-11-17 16:18 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-16 15:06 Bug: Callback to widget set with `zle -Fw <widget>` shouldn't change $LASTWIDGET Marlon Richert
2022-11-16 18:24 ` Bart Schaefer
2022-11-17 13:04   ` Marlon Richert
2022-11-17 13:28     ` Roman Perepelitsa
2022-11-17 16:18     ` Bart Schaefer

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

	https://git.vuxu.org/mirror/zsh/

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 NNTP newsgroup(s).