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

Re: the function to show a digit argument while it is being typed



[moved from zsh-users]

>>>>> On November 12, 2009 Greg Klanderman <gak@xxxxxxxxxxxxxx> wrote:

> So I hacked up a proof of concept in C for showing the argument in the
> universal-argument code.. let me know what you think.

Is there any interest in including a cleaned up version of this patch?
Has been working well for me..

Greg

Index: Src/Zle/zle_misc.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_misc.c,v
retrieving revision 1.58
diff -u -r1.58 zle_misc.c
--- Src/Zle/zle_misc.c	24 Apr 2009 09:00:38 -0000	1.58
+++ Src/Zle/zle_misc.c	16 Dec 2009 17:24:03 -0000
@@ -709,16 +709,81 @@
     return 0;
 }
 
+static char *
+baseprefix(char *buf, int base)
+{
+    if (base == 10)
+        buf[0] = (char)0;
+    else if (base == 2)
+        strcpy(buf, "0b");
+    else if (base == 8)
+        strcpy(buf, "0o");
+    else if (base == 16)
+        strcpy(buf, "0x");
+    else
+        sprintf(buf, "%d#", base);
+    return buf;
+}
+
+static char *
+int2string(char *buf, int i, int base)
+{
+    char *b = buf;
+    int p, v;
+
+    if (i < 0) {
+        *b++ = '-';
+        i = -i;
+    }
+
+    baseprefix(b, base);
+    b += strlen(b);
+
+    for (p = 1; p <= i; p *= base)
+        ;
+
+    while (p > 1) {
+        p /= base;
+        v = i / p;
+        i -= v * p;
+        *b++ = (v < 10) ? v+'0' : v-10+'A';
+    }
+
+    *b = (char)0;
+    return buf;
+}
+
+static void
+showarg(int digcnt, int pref, int minus)
+{
+    char msg[100], buf[100], buf2[10];
+
+    if (!digcnt)
+        /* implicit multiplier; will be replaced if digits are entered */
+        sprintf(msg, "arg: (%s)", int2string(buf, 4*zmod.tmult, zmod.base));
+    else if (minus < 0 && digcnt <= 1)
+        /* no digits, just a '-' has been entered so far */
+        sprintf(msg, "arg: -%s", baseprefix(buf2, zmod.base));
+    else
+        /* digits have been entered */
+        sprintf(msg, "arg: %s", int2string(buf, minus * (pref ? pref : 1), zmod.base));
+
+    showmsg(msg);
+    zrefresh();
+}
+
 /**/
 int
 universalargument(char **args)
 {
     int digcnt = 0, pref = 0, minus = 1, gotk;
+
     if (*args) {
 	zmod.mult = atoi(*args);
 	zmod.flags |= MOD_MULT;
 	return 0;
     }
+
     /*
      * TODO: this is quite tricky to do when trying to maintain
      * compatibility between the old input system and Unicode.
@@ -734,16 +799,19 @@
      *
      * Hence for now this remains byte-by-byte.
      */
+    showarg(digcnt, pref, minus);
     while ((gotk = getbyte(0L, NULL)) != EOF) {
 	if (gotk == '-' && !digcnt) {
 	    minus = -1;
 	    digcnt++;
+            showarg(digcnt, pref, minus);
 	} else {
 	    int newdigit = parsedigit(gotk);
 
 	    if (newdigit >= 0) {
 		pref = pref * zmod.base + newdigit;
 		digcnt++;
+                showarg(digcnt, pref, minus);
 	    } else {
 		ungetbyte(gotk);
 		break;
@@ -756,6 +824,8 @@
 	zmod.tmult *= 4;
     zmod.flags |= MOD_TMULT;
     prefixflag = 1;
+    showmsg("");
+    zrefresh();
     return 0;
 }
 



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