From: Mikael Magnusson <mikachu@gmail.com>
To: zsh workers <zsh-workers@zsh.org>
Subject: Re: PATCH: zle -f from inside widget to set flags
Date: Thu, 3 Sep 2015 12:40:00 +0200 [thread overview]
Message-ID: <CAHYJk3SjPpWpbej82Yh8300iLODgCEtj61Ub+zCDrPi6FyeK3A@mail.gmail.com> (raw)
In-Reply-To: <1441276703-23980-1-git-send-email-mikachu@gmail.com>
On Thu, Sep 3, 2015 at 12:38 PM, Mikael Magnusson <mikachu@gmail.com> wrote:
> This works for "yank", if you inserted text with another yank widget.
>
> It's not very likely to do anything useful for "keepsuffix", since the
> code that handles that flag only triggers for internal widgets, so we need
> to fiddle some more with that path. I don't really know what menucmp,
> linemove and kill are for. The others seemed definitely not useful,
> but I could be wrong.
>
> Thoughts? Am I correct in assuming it's pretty safe to use bindk like that?
>
> We could potentially pass yankb and yanke as arguments like zle -f
> yank15:36 (but with some nicer syntax) to make it work in the general case™.
I haven't tried, but I highly suspect that if you call another user
widget, and that widget uses zle -f, then this won't have any effect since
the parent widget's flags will trump those. That's probably okay. If not,
we could add a 'zle -f copy' that sticks lastcmd in w->flags (not tested).
> Src/Zle/zle_main.c | 5 +++--
> Src/Zle/zle_thingy.c | 33 +++++++++++++++++++++++++++++++++
> 2 files changed, 36 insertions(+), 2 deletions(-)
>
> diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
> index 5440a48..af878eb 100644
> --- a/Src/Zle/zle_main.c
> +++ b/Src/Zle/zle_main.c
> @@ -1396,7 +1396,8 @@ execzlefunc(Thingy func, char **args, int set_bindk)
> opts[XTRACE] = oxt;
> sfcontext = osc;
> endparamscope();
> - lastcmd = 0;
> + lastcmd = w->flags;
> + w->flags = 0;
> r = 1;
> redup(osi, 0);
> }
> @@ -1975,7 +1976,7 @@ zle_main_entry(int cmd, va_list ap)
> static struct builtin bintab[] = {
> BUILTIN("bindkey", 0, bin_bindkey, 0, -1, 0, "evaM:ldDANmrsLRp", NULL),
> BUILTIN("vared", 0, bin_vared, 1, 1, 0, "aAcef:hi:M:m:p:r:t:", NULL),
> - BUILTIN("zle", 0, bin_zle, 0, -1, 0, "aAcCDFgGIKlLmMNrRTUw", NULL),
> + BUILTIN("zle", 0, bin_zle, 0, -1, 0, "aAcCDfFgGIKlLmMNrRTUw", NULL),
> };
>
> /* The order of the entries in this table has to match the *HOOK
> diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
> index 7fd3a59..8b7390c 100644
> --- a/Src/Zle/zle_thingy.c
> +++ b/Src/Zle/zle_thingy.c
> @@ -352,6 +352,7 @@ bin_zle(char *name, char **args, Options ops, UNUSED(int func))
> { 'U', bin_zle_unget, 1, 1 },
> { 'K', bin_zle_keymap, 1, 1 },
> { 'I', bin_zle_invalidate, 0, 0 },
> + { 'f', bin_zle_flags, 1, -1 },
> { 'F', bin_zle_fd, 0, 2 },
> { 'T', bin_zle_transform, 0, 2},
> { 0, bin_zle_call, 0, -1 },
> @@ -625,6 +626,38 @@ bin_zle_complete(char *name, char **args, UNUSED(Options ops), UNUSED(char func)
>
> /**/
> static int
> +bin_zle_flags(char *name, char **args, UNUSED(Options ops), UNUSED(char func))
> +{
> + char **flag;
> +
> + if (!zle_usable()) {
> + zwarnnam(name, "can only set flags from a widget");
> + return 1;
> + }
> +
> + if (bindk) {
> + Widget w = bindk->widget;
> + if (w) {
> + for (flag = args; *flag; flag++) {
> + if (!strcmp(*flag, "yank"))
> + w->flags |= ZLE_YANKBEFORE;
> + else if (!strcmp(*flag, "menucmp"))
> + w->flags |= ZLE_MENUCMP;
> + else if (!strcmp(*flag, "linemove"))
> + w->flags |= ZLE_LINEMOVE;
> + else if (!strcmp(*flag, "kill"))
> + w->flags |= ZLE_KILL;
> + else if (!strcmp(*flag, "keepsuffix"))
> + w->flags |= ZLE_KEEPSUFFIX;
> + else
> + zwarnnam(name, "invalid flag `%s' given to zle -f", *flag);
> + }
> + }
> + }
> +}
> +
> +/**/
> +static int
> zle_usable()
> {
> return zleactive && !incompctlfunc && !incompfunc
> --
> 2.5.0
>
--
Mikael Magnusson
prev parent reply other threads:[~2015-09-03 10:40 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-01 6:07 PATCH v2 (complete): Implement zle -P Mikael Magnusson
2015-09-01 6:53 ` Bart Schaefer
2015-09-01 9:50 ` Oliver Kiddle
2015-09-01 10:03 ` Peter Stephenson
2015-09-06 9:50 ` Daniel Shahaf
2015-09-06 11:51 ` Mikael Magnusson
2015-09-01 23:32 ` Bart Schaefer
2015-09-03 10:38 ` PATCH: zle -f from inside widget to set flags Mikael Magnusson
2015-09-03 10:40 ` Mikael Magnusson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAHYJk3SjPpWpbej82Yh8300iLODgCEtj61Ub+zCDrPi6FyeK3A@mail.gmail.com \
--to=mikachu@gmail.com \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).