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;
}
next parent 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).