zsh-workers
 help / color / mirror / code / Atom feed
From: Mikael Magnusson <mikachu@gmail.com>
To: zsh-workers@zsh.org
Subject: PATCH: Make yank zle params writable
Date: Tue, 29 Sep 2015 06:43:13 +0200	[thread overview]
Message-ID: <1443501793-29753-1-git-send-email-mikachu@gmail.com> (raw)

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.)

---
 Doc/Zsh/zle.yo       |  5 ++++-
 Src/Zle/zle_main.c   |  2 +-
 Src/Zle/zle_params.c | 39 ++++++++++++++++++++++++++++++++-------
 3 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo
index 7d95eb3..2ca2dc8 100644
--- a/Doc/Zsh/zle.yo
+++ b/Doc/Zsh/zle.yo
@@ -1013,7 +1013,8 @@ xitem(tt(YANK_START) (integer))
 item(tt(YANK_END) (integer))(
 These three parameters indicate whether text has just been yanked (pasted)
 into the buffer.  tt(YANK_START) and tt(YANK_END) are in the same units as
-tt(CURSOR), and are only valid when tt(YANK_ACTIVE) is non-zero.
+tt(CURSOR), and are only valid when tt(YANK_ACTIVE) is non-zero.  They can
+also be assigned to from widgets that insert text in a yank-like fashion,
+for example wrappers of bracketed-paste.  tt(YANK_ACTIVE) can be set to 1
+if the cursor is after the pasted text, or 2 if it is before the text.
-
-All three are read-only.
 )
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);
 	}
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index 000bc38..0c43dee 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -98,11 +98,11 @@ static const struct gsu_integer undo_change_no_gsu =
 static const struct gsu_integer undo_limit_no_gsu =
 { get_undo_limit_change, set_undo_limit_change, zleunsetfn };
 static const struct gsu_integer yankstart_gsu =
-{ get_yankstart, NULL, zleunsetfn };
+{ get_yankstart, set_yankstart, zleunsetfn };
 static const struct gsu_integer yankend_gsu =
-{ get_yankend, NULL, zleunsetfn };
+{ get_yankend, set_yankend, zleunsetfn };
 static const struct gsu_integer yankactive_gsu =
-{ get_yankactive, NULL, zleunsetfn };
+{ get_yankactive, set_yankactive, zleunsetfn };
 
 static const struct gsu_array killring_gsu =
 { get_killring, set_killring, unset_killring };
@@ -149,9 +149,9 @@ static struct zleparam {
     { "WIDGET", PM_SCALAR | PM_READONLY, GSU(widget_gsu), NULL },
     { "WIDGETFUNC", PM_SCALAR | PM_READONLY, GSU(widgetfunc_gsu), NULL },
     { "WIDGETSTYLE", PM_SCALAR | PM_READONLY, GSU(widgetstyle_gsu), NULL },
-    { "YANK_START", PM_INTEGER | PM_READONLY, GSU(yankstart_gsu), NULL },
-    { "YANK_END", PM_INTEGER | PM_READONLY, GSU(yankend_gsu), NULL },
-    { "YANK_ACTIVE", PM_INTEGER | PM_READONLY, GSU(yankactive_gsu), NULL },
+    { "YANK_START", PM_INTEGER, GSU(yankstart_gsu), NULL },
+    { "YANK_END", PM_INTEGER, GSU(yankend_gsu), NULL },
+    { "YANK_ACTIVE", PM_INTEGER, GSU(yankactive_gsu), NULL },
     { "ZLE_STATE", PM_SCALAR | PM_READONLY, GSU(zle_state_gsu), NULL },
     { NULL, 0, NULL, NULL }
 };
@@ -503,7 +503,32 @@ get_yankend(UNUSED(Param pm))
 static zlong
 get_yankactive(UNUSED(Param pm))
 {
-    return lastcmd & ZLE_YANK;
+    return !!(lastcmd & ZLE_YANK) + !!(lastcmd & ZLE_YANKBEFORE);
+}
+
+/**/
+static void
+set_yankstart(UNUSED(Param pm), zlong i)
+{
+    yankb = i;
+}
+
+/**/
+static void
+set_yankend(UNUSED(Param pm), zlong i)
+{
+    yanke = 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;
 }
 
 /**/
-- 
2.5.0


             reply	other threads:[~2015-09-29  4:43 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-29  4:43 Mikael Magnusson [this message]
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 ` PATCH: Make yank zle params writable Mikael Magnusson
2015-09-30  1:15 ` 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=1443501793-29753-1-git-send-email-mikachu@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).