Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: 'zle redisplay' bug in 5.3?



On Sat, 7 Jan 2017 18:53:25 +0000
Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx> 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;
 }
 



Messages sorted by: Reverse Date, Date, Thread, Author