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
- X-seq: zsh-workers 27525
- From: Greg Klanderman <gak@xxxxxxxxxxxxxx>
- To: Zsh list <zsh-workers@xxxxxxx>
- Subject: Re: the function to show a digit argument while it is being typed
- Date: Wed, 16 Dec 2009 12:31:01 -0500
- In-reply-to: <m3r5s35on8.fsf@xxxxxxxxxxxxxx> (Greg Klanderman's message of "Thu, 12 Nov 2009 18:06:35 -0500")
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- References: <10081257897632@xxxxxxxxxxxxxxxxxxx> <237967ef0911101822g5bfcf4fao25fc33ba0a2e8604@xxxxxxxxxxxxxx> <091110204748.ZM28704@xxxxxxxxxxxxxxxxxxxxxx> <237967ef0911102217m1325dc59y8d7388e9f6f21c7b@xxxxxxxxxxxxxx> <091111001419.ZM28852@xxxxxxxxxxxxxxxxxxxxxx> <m3eio56o4i.fsf@xxxxxxxxxxxxxx> <091111094507.ZM30174@xxxxxxxxxxxxxxxxxxxxxx> <m3r5s35on8.fsf@xxxxxxxxxxxxxx>
- Reply-to: gak@xxxxxxxxxxxxxx
[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