zsh-workers
 help / color / mirror / code / Atom feed
From: Greg Klanderman <gak@klanderman.net>
To: Zsh list <zsh-workers@zsh.org>
Subject: Re: the function to show a digit argument while it is being typed
Date: Wed, 16 Dec 2009 12:31:01 -0500	[thread overview]
Message-ID: <m33a3au8q2.fsf@klanderman.net> (raw)
In-Reply-To: <m3r5s35on8.fsf@klanderman.net> (Greg Klanderman's message of "Thu, 12 Nov 2009 18:06:35 -0500")


[moved from zsh-users]

>>>>> On November 12, 2009 Greg Klanderman <gak@klanderman.net> 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;
 }
 


       reply	other threads:[~2009-12-16 17:31 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <10081257897632@webmail89.yandex.ru>
     [not found] ` <237967ef0911101822g5bfcf4fao25fc33ba0a2e8604@mail.gmail.com>
     [not found]   ` <091110204748.ZM28704@torch.brasslantern.com>
     [not found]     ` <237967ef0911102217m1325dc59y8d7388e9f6f21c7b@mail.gmail.com>
     [not found]       ` <091111001419.ZM28852@torch.brasslantern.com>
     [not found]         ` <m3eio56o4i.fsf@klanderman.net>
     [not found]           ` <091111094507.ZM30174@torch.brasslantern.com>
     [not found]             ` <m3r5s35on8.fsf@klanderman.net>
2009-12-16 17:31               ` Greg Klanderman [this message]
2009-12-16 18:03                 ` Peter Stephenson
2009-12-16 18:46                   ` Greg Klanderman

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=m33a3au8q2.fsf@klanderman.net \
    --to=gak@klanderman.net \
    --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).