From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23346 invoked by alias); 7 Jan 2017 20:05:05 -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: 40297 Received: (qmail 25995 invoked from network); 7 Jan 2017 20:05:04 -0000 X-Qmail-Scanner-Diagnostics: from know-smtprelay-omc-3.server.virginmedia.net by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(80.0.253.67):SA:0(-1.2/5.0):. Processed in 1.730444 secs); 07 Jan 2017 20:05:04 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.2 required=5.0 tests=RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: p.w.stephenson@ntlworld.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _smtprelay.virginmedia.com designates 80.0.253.67 as permitted sender) X-Originating-IP: [86.21.219.59] X-Spam: 0 X-Authority: v=2.1 cv=AtwTp7JP c=1 sm=1 tr=0 a=utowdAHh8RITBM/6U1BPxA==:117 a=utowdAHh8RITBM/6U1BPxA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=kj9zAlcOel0A:10 a=NLZqzBF-AAAA:8 a=Oy9vbMppt7cqhQP244MA:9 a=b_vQvB5uRy4vsNNf:21 a=eoHN1jWonZCLVGDT:21 a=CjuIK1q_8ugA:10 a=wW_WBVUImv98JQXhvVPZ:22 Date: Sat, 7 Jan 2017 20:04:55 +0000 From: Peter Stephenson To: "Zsh Hackers' List" Subject: Re: 'zle redisplay' bug in 5.3? Message-ID: <20170107200455.656cec0c@ntlworld.com> In-Reply-To: <20170107185325.061a57cf@ntlworld.com> References: <20170105030137.v4tzweda6pxyqnrq@majutsushi.net> <170105010914.ZM1529@torch.brasslantern.com> <20170105150135.75a490bb@pwslap01u.europe.root.pri> <170105090803.ZM3653@torch.brasslantern.com> <170107100505.ZM11210@torch.brasslantern.com> <20170107185325.061a57cf@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 On Sat, 7 Jan 2017 18:53:25 +0000 Peter Stephenson wrote: > The other uses showinglist and then calls listmatches(). Furthermore, > it then calls zrefresh() recursively. I modified that in 36416, commit > 32f5d3d8, only to get called if there was no error, but the recursive > call has always been there. This might have something to do with > it, particularly now errflag signals both error and interrupt. Could > propagation of ERRFLAG_INT or the lack of it or the fact that it affects > the code that calls zrefresh() recursively have something to do with > the interrupt problem that caused the changed to redisplaying? OK, how about this as an alternative to the previous change to the refresh code? If I'm following properly, this was a problem when TRAPINT () { zle reset-prompt return 127 } was in effect during interruption at a completion list. If we have been interrupted don't try to list matches at all; abort as if there ws no list. Obviously, I can't be sure this doesn't have side effects of its own but as far as I can see it seems to remove the TRAPINT problem without resorting to tweaking bits I haven't the faintest clue about, and it also seems OK without the trap. An additional fix is that at the zle call from the TRAPINT in this case we don't know where the command line has been, so should take account of both possibilities. In general allowing the command line to be modified here is dangerous but stopping it without forbidding all zle calls is difficult, so assume the user is only doing basic stuff here (like redisplay). Note that if the discussion returns nonetheless to showlinglist etc. I shall once again be unable to provide useful replies. pws 1diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c index 2edaf6e..0350388 100644 --- a/Src/Zle/complist.c +++ b/Src/Zle/complist.c @@ -1993,7 +1993,8 @@ complistmatches(UNUSED(Hookdef dummy), Chdata dat) if (noselect > 0) noselect = 0; - if ((minfo.asked == 2 && mselect < 0) || nlnct >= zterm_lines) { + if ((minfo.asked == 2 && mselect < 0) || nlnct >= zterm_lines || + errflag) { showinglist = 0; amatches = oamatches; return (noselect = 1); diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c index 8d173cd..8391739 100644 --- a/Src/Zle/zle_refresh.c +++ b/Src/Zle/zle_refresh.c @@ -2434,8 +2434,8 @@ redisplay(UNUSED(char **args)) moveto(0, 0); zputc(&zr_cr); /* extra care */ tc_upcurs(lprompth - 1); - resetneeded = !showinglist; - clearflag = showinglist; + resetneeded = 1; + clearflag = 0; return 0; } diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c index c709285..c003148 100644 --- a/Src/Zle/zle_thingy.c +++ b/Src/Zle/zle_thingy.c @@ -703,7 +703,7 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func)) { Thingy t; struct modifier modsave = zmod; - int ret, saveflag = 0, setbindk = 0; + int ret, saveflag = 0, setbindk = 0, remetafy; char *wname = *args++, *keymap_restore = NULL, *keymap_tmp; if (!wname) @@ -714,7 +714,15 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func)) return 1; } - UNMETACHECK(); + /* + * zle is callable in traps, so we can't be sure the line is + * in its normal state. + */ + if (zlemetaline) { + unmetafy_line(); + remetafy = 1; + } else + remetafy = 0; while (*args && **args == '-') { char *num; @@ -728,6 +736,8 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func)) num = args[0][1] ? args[0]+1 : args[1]; if (!num) { zwarnnam(name, "number expected after -%c", **args); + if (remetafy) + metafy_line(); return 1; } if (!args[0][1]) @@ -745,19 +755,26 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func)) keymap_tmp = args[0][1] ? args[0]+1 : args[1]; if (!keymap_tmp) { zwarnnam(name, "keymap expected after -%c", **args); + if (remetafy) + metafy_line(); return 1; } if (!args[0][1]) *++args = "" - 1; keymap_restore = dupstring(curkeymapname); - if (selectkeymap(keymap_tmp, 0)) + if (selectkeymap(keymap_tmp, 0)) { + if (remetafy) + metafy_line(); return 1; + } break; case 'w': setbindk = 1; break; default: zwarnnam(name, "unknown option: %s", *args); + if (remetafy) + metafy_line(); return 1; } } @@ -775,6 +792,8 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func)) zmod = modsave; if (keymap_restore) selectkeymap(keymap_restore, 0); + if (remetafy) + metafy_line(); return ret; }