Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: add-zle-hook-widget and multiple hooks

On 6/6/20, Daniel Shahaf <d.s@xxxxxxxxxxxxxxxxxx> wrote:
> When two or more zle-line-pre-redraw hooks are registered using
> add-zle-hook-widget, the value of $LASTWIDGET when the each hook is
> called is the name of the former hook:
>     [Eric Freese wrote in
> https://github.com/zsh-users/zsh-autosuggestions/issues/529#issuecomment-632113840]
>     $ zsh -df
>     % autoload add-zle-hook-widget
>     % f() {}
>     % g() { zle -M "$(typeset -p LASTWIDGET)" }
>     % add-zle-hook-widget line-pre-redraw f
>     % add-zle-hook-widget line-pre-redraw g
>     % x<CURSOR>
>     typeset -r LASTWIDGET=f
> The issue here is that g would like to to know what widget was invoked
> immediately before the redraw.  In the example, that'd be self-insert.
> I've attached two proofs of concept.  WDYT?
> I'll add docs, etc, once an approach is chosen.
> Cheers,
> Daniel
> P.S.  For the latter patch, note that «zle $widget -f» is distinct from
> «zle -f».

I think the warning message when -f is not followed by nolast should
be phrased in the same way it would if there were other valid flags,
since it would have to change when more are added anyway (we will
probably not want to enumerate all possible flags in this warning

Also, I think rather than reusing the concept of the -f option, it
would be better to use another flag (maybe -l for LASTWIDGET) which is
analogous to the existing -w option:
    Normally, calling a widget in this way does not set the special
    parameter  WIDGET  and related parameters, so that the environ‐
    ment appears as if the top-level widget called by the user were
    still  active.   With the option -w, WIDGET and related parame‐
    ters are set to reflect the widget being executed  by  the  zle

Mikael Magnusson

Messages sorted by: Reverse Date, Date, Thread, Author