From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11536 invoked by alias); 11 Sep 2015 20:29:26 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 36496 Received: (qmail 15730 invoked from network); 11 Sep 2015 20:29:24 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.0 X-Originating-IP: [80.3.228.158] X-Spam: 0 X-Authority: v=2.1 cv=RLtOZNW+ c=1 sm=1 tr=0 a=P+FLVI8RzFchTbbqTxIDRw==:117 a=P+FLVI8RzFchTbbqTxIDRw==:17 a=NLZqzBF-AAAA:8 a=kj9zAlcOel0A:10 a=KL3pV6RFVabAol6ItoUA:9 a=CjuIK1q_8ugA:10 Date: Fri, 11 Sep 2015 21:29:20 +0100 From: Peter Stephenson To: Zsh hackers list Subject: PATCH: read full multibyte string a bit more sooner Message-ID: <20150911212920.2b2433fa@ntlworld.com> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.28; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit This is going along the right lines to make KEYS and read-command do the right thing with self-insert. I'm a little unhappy at the special casing, but that aspect isn't obviously any worse than what we did before. I'll commit it now the release is out of the way but it'll need some shaking down. Some other tests for !lastchar_wide_valid may have become redundant. pws diff --git a/Src/Zle/zle_hist.c b/Src/Zle/zle_hist.c index c61b4ef..0cff039 100644 --- a/Src/Zle/zle_hist.c +++ b/Src/Zle/zle_hist.c @@ -1643,7 +1643,7 @@ doisearch(char **args, int dir, int pattern) } else if (cmd == Th(z_selfinsert)) { #ifdef MULTIBYTE_SUPPORT if (!lastchar_wide_valid) - if (getrestchar(lastchar) == WEOF) { + if (getrestchar(lastchar, NULL, NULL) == WEOF) { handlefeep(zlenoargs); continue; } @@ -1877,7 +1877,7 @@ getvisrchstr(void) } else { #ifdef MULTIBYTE_SUPPORT if (!lastchar_wide_valid) - if (getrestchar(lastchar) == WEOF) { + if (getrestchar(lastchar, NULL, NULL) == WEOF) { handlefeep(zlenoargs); continue; } diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c index 5b4189f..0405c84 100644 --- a/Src/Zle/zle_keymap.c +++ b/Src/Zle/zle_keymap.c @@ -1501,6 +1501,20 @@ getkeymapcmd(Keymap km, Thingy *funcp, char **strp) * they wait till a key is pressed for the movement anyway */ timeout = !(!virangeflag && !region_active && f && f->widget && f->widget->flags & ZLE_VIOPER); +#ifdef MULTIBYTE_SUPPORT + if ((f == Th(z_selfinsert) || f == Th(z_selfinsertunmeta)) && + !lastchar_wide_valid) { + int len; + VARARR(char, mbc, MB_CUR_MAX); + ZLE_INT_T inchar = getrestchar(lastchar, mbc, &len); + if (inchar != WEOF && len) { + char *ptr = mbc; + lastlen += len; + while (len--) + addkeybuf(STOUC(*ptr++)); + } + } +#endif } if (!ispfx) break; @@ -1521,6 +1535,20 @@ getkeymapcmd(Keymap km, Thingy *funcp, char **strp) return keybuf; } +/**/ +static void +addkeybuf(int c) +{ + if(keybuflen + 3 > keybufsz) + keybuf = realloc(keybuf, keybufsz *= 2); + if(imeta(c)) { + keybuf[keybuflen++] = Meta; + keybuf[keybuflen++] = c ^ 32; + } else + keybuf[keybuflen++] = c; + keybuf[keybuflen] = 0; +} + /* * Add a (possibly metafied) byte to the key input so far. * This handles individual bytes of a multibyte string separately; @@ -1542,14 +1570,7 @@ getkeybuf(int w) if(c < 0) return EOF; - if(keybuflen + 3 > keybufsz) - keybuf = realloc(keybuf, keybufsz *= 2); - if(imeta(c)) { - keybuf[keybuflen++] = Meta; - keybuf[keybuflen++] = c ^ 32; - } else - keybuf[keybuflen++] = c; - keybuf[keybuflen] = 0; + addkeybuf(c); return c; } diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index ec3d2c3..992f152 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -933,7 +933,7 @@ getfullchar(int do_keytmout) int inchar = getbyte((long)do_keytmout, NULL); #ifdef MULTIBYTE_SUPPORT - return getrestchar(inchar); + return getrestchar(inchar, NULL, NULL); #else return inchar; #endif @@ -951,7 +951,7 @@ getfullchar(int do_keytmout) /**/ mod_export ZLE_INT_T -getrestchar(int inchar) +getrestchar(int inchar, char *outstr, int *outcount) { char c = inchar; wchar_t outchar; @@ -965,6 +965,8 @@ getrestchar(int inchar) */ lastchar_wide_valid = 1; + if (outcount) + *outcount = 0; if (inchar == EOF) { /* End of input, so reset the shift state. */ memset(&mbs, 0, sizeof mbs); @@ -1013,6 +1015,10 @@ getrestchar(int inchar) return lastchar_wide = WEOF; } c = inchar; + if (outstr) { + *outstr++ = c; + (*outcount)++; + } } return lastchar_wide = (ZLE_INT_T)outchar; } diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c index 2d18628..12143e0 100644 --- a/Src/Zle/zle_misc.c +++ b/Src/Zle/zle_misc.c @@ -115,9 +115,7 @@ selfinsert(UNUSED(char **args)) ZLE_CHAR_T tmp; #ifdef MULTIBYTE_SUPPORT - if (!lastchar_wide_valid) - if (getrestchar(lastchar) == WEOF) - return 1; + DPUTS(!lastchar_wide_valid, "keybuf did not read full wide character"); #endif tmp = LASTFULLCHAR; doinsert(&tmp, 1); @@ -1431,7 +1429,7 @@ executenamedcommand(char *prmt) else { #ifdef MULTIBYTE_SUPPORT if (!lastchar_wide_valid) - getrestchar(lastchar); + getrestchar(lastchar, NULL, NULL); if (lastchar_wide == WEOF) feep = 1; else diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c index 42dc46e..86840bd 100644 --- a/Src/Zle/zle_vi.c +++ b/Src/Zle/zle_vi.c @@ -151,7 +151,7 @@ vigetkey(void) #ifdef MULTIBYTE_SUPPORT if (!lastchar_wide_valid) { - getrestchar(lastchar); + getrestchar(lastchar, NULL, NULL); } #endif return LASTFULLCHAR;