zsh-workers
 help / color / mirror / code / Atom feed
From: Mikael Magnusson <mikachu@gmail.com>
To: zsh workers <zsh-workers@zsh.org>
Subject: Re: PATCH: Make yank zle params writable
Date: Tue, 29 Sep 2015 20:09:38 +0200	[thread overview]
Message-ID: <CAHYJk3StDkUtj04FRBBVcPN5LGu5uNN7uA+D0t22n_vWFu=etA@mail.gmail.com> (raw)
In-Reply-To: <1443501793-29753-1-git-send-email-mikachu@gmail.com>

On Tue, Sep 29, 2015 at 6:43 AM, Mikael Magnusson <mikachu@gmail.com> wrote:
> Since these were added without much discussion, it seems a bit silly to
> add yet another interface (zle -f yank) to set them, so just make them
> writable.
>
> I haven't tried running with that movement of lastcmd in zle_main.c
> for a long time (approaching minutes), it is probably equivalent to not
> setting it at all there.  However, with this change, it should be the case
> that all wrapper widgets retain the lastcmd state of the last internal
> widget they call, so things like kill-word multiple times will append instead
> of replace, etc. (I have not tested that particular thing.)
>
> diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
> index 992f152..cdb2182 100644
> --- a/Src/Zle/zle_main.c
> +++ b/Src/Zle/zle_main.c
> @@ -1394,6 +1394,7 @@ execzlefunc(Thingy func, char **args, int set_bindk)
>                 while (*args)
>                     addlinknode(largs, dupstring(*args++));
>             }
> +           lastcmd = 0;
>             startparamscope();
>             makezleparams(0);
>             sfcontext = SFC_WIDGET;
> @@ -1402,7 +1403,6 @@ execzlefunc(Thingy func, char **args, int set_bindk)
>             opts[XTRACE] = oxt;
>             sfcontext = osc;
>             endparamscope();
> -           lastcmd = 0;
>             r = 1;
>             redup(osi, 0);
>         }

Oops, this of course makes it so a widget can't see if the previous
widget (not called from inside it) set the yank state. So that was a
silly change... Hm, if we did this instead,
  lastcmd &= ZLE_YANK;
then yank state is never unset automatically, because this part of the
code can't know if it was assigned the same value it already had, or
was just left alone.

This seems to work fine, using the w->flags variant from my zle -f
patch. I thought I could avoid that complication but I guess not. This
also means that setting YANK_ACTIVE inside a widget doesn't affect the
value you can read back from it (until you call another widget, at
least), and also that the yank state will be set correctly after
leaving even if you call widgets after assigning to it. So that's
probably all good.

It also looks like I had the before/after swapped in the code because
they refer to the yanked text, not the cursor. Here's an interdiff
because I'm lazy.

diff --git i/Src/Zle/zle_main.c w/Src/Zle/zle_main.c
index d605204..844984d 100644
--- i/Src/Zle/zle_main.c
+++ w/Src/Zle/zle_main.c
@@ -1422,7 +1422,6 @@ execzlefunc(Thingy func, char **args, int set_bindk)
                while (*args)
                    addlinknode(largs, dupstring(*args++));
            }
-           lastcmd = 0;
            startparamscope();
            makezleparams(0);
            sfcontext = SFC_WIDGET;
@@ -1431,6 +1430,8 @@ execzlefunc(Thingy func, char **args, int set_bindk)
            opts[XTRACE] = oxt;
            sfcontext = osc;
            endparamscope();
+           lastcmd = w->flags;
+           w->flags = 0;
            r = 1;
            redup(osi, 0);
        }
diff --git i/Src/Zle/zle_params.c w/Src/Zle/zle_params.c
index 1e95605..42d1b0b 100644
--- i/Src/Zle/zle_params.c
+++ w/Src/Zle/zle_params.c
@@ -506,7 +506,7 @@ get_yankend(UNUSED(Param pm))
 static zlong
 get_yankactive(UNUSED(Param pm))
 {
-    return !!(lastcmd & ZLE_YANK) + !!(lastcmd & ZLE_YANKBEFORE);
+    return !!(lastcmd & ZLE_YANK) + !!(lastcmd & ZLE_YANKAFTER);
 }

 /**/
@@ -527,11 +527,12 @@ set_yankend(UNUSED(Param pm), zlong i)
 static void
 set_yankactive(UNUSED(Param pm), zlong i)
 {
-    lastcmd &= ~ZLE_YANK;
-    if (i == 1)
-       lastcmd |= ZLE_YANKAFTER;
-    else if (i == 2)
-       lastcmd |= ZLE_YANKBEFORE;
+    if (bindk && bindk->widget) {
+       if (i == 1)
+           bindk->widget->flags |= ZLE_YANKBEFORE;
+       else if (i == 2)
+           bindk->widget->flags |= ZLE_YANKAFTER;
+    }
 }

 /**/


-- 
Mikael Magnusson


  parent reply	other threads:[~2015-09-29 18:09 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-29  4:43 Mikael Magnusson
2015-09-29  4:43 ` PATCH: Add a much simpler alternative to using url-quote-magic + bracketed-paste-magic Mikael Magnusson
2015-09-29 18:09 ` Mikael Magnusson [this message]
2015-09-30  1:15 ` PATCH: Make yank zle params writable Mikael Magnusson
2015-09-30  2:06   ` PATCH: zle -f from inside widget to set flags and make yank start/end " Mikael Magnusson
2015-10-01 15:33     ` Jun T.
2015-10-01 19:43       ` Mikael Magnusson
2015-10-02  8:09         ` Jun T.
2015-10-02 18:43           ` Mikael Magnusson
2015-10-02 19:58             ` Jun T.

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='CAHYJk3StDkUtj04FRBBVcPN5LGu5uNN7uA+D0t22n_vWFu=etA@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).