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

Re: PATCH v2 (complete): Implement zle -P

On Sun, Sep 6, 2015 at 11:50 AM, Daniel Shahaf <d.s@xxxxxxxxxxxxxxxxxx> wrote:
> Peter Stephenson wrote on Tue, Sep 01, 2015 at 11:03:31 +0100:
>> On Tue, 1 Sep 2015 11:50:27 +0200
>> Oliver Kiddle <okiddle@xxxxxxxxxxx> wrote:
>> > Mikael Magnusson wrote:
>> > > Indeed, I'm not sure if a user can figure out which widgets are useful
>> > > to override in this way.  Would it be more useful to just do what Wayne
>> > > did originally and let zle -N take some flags that specify which specific
>> > > flags the new widget should have after all? The advantage of this method
>> > > is that if we add more flags, users can wrap those widgets without us
>> > > remembering to add a new zle -N flag as well.
>> >
>> > I think that approach is better than the prototypes.
>> I'd be inclined to think this is both clearer and more powerful, too.
> The 'zle -P' form is nice when wrapping arbitrary widgets and wanting to
> preserve their properties.  For example:
>     zsh -f
>     bindkey -e
>     bkw-wrapper() { zle .backward-kill-word }
>     zle -N backward-kill-word bkw-wrapper
>     echo foo bar<^W><^W><^Y>
> This results in "echo foo <CURSOR>", but in "echo foo bar <CURSOR>"
> without the third line — because 'bkw-wrapper' lacks the ZLE_KILL flag
> which backward-kill-word has.
> When I wrap a built-in widget, I would rather just say "Make my widget
> like that other widget" than enumerate all flags my widget requires;
> but when I define a new widget from scratch, being able to enumerate all
> flags my widgets required would be good.
> So, in summary, I think both forms are useful: 'zle -P' is useful for
> wrapping widgets and 'zle -f' for defining new ones.
> Cheers,
> Daniel
> P.S. As a concrete example, in zsh-syntax-highlighting, the difference
> in flags between a built-in widget and a user-defined wrapper thereof
> leads to issues such as [1], where wrapping a widget causes it to change
> behaviour: https://github.com/zsh-users/zsh-syntax-highlighting/issues/150
> I believe using 'zle -P' to define the wrapper widget would immediately
> solve that issue.

You can believe it, but it's not the case. The code that handles most
of these flags first checks that the widget is internal, and not a
shell wrapper function. Some more changes would be needed to make this
work. The yank flag is the only one that does something useful at the

Mikael Magnusson

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