Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] Widget fallbacks (Re: Bad effect of error in zle-line-pre-redraw)
- X-seq: zsh-workers 39934
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: zsh workers <zsh-workers@xxxxxxx>
- Subject: [PATCH] Widget fallbacks (Re: Bad effect of error in zle-line-pre-redraw)
- Date: Sun, 13 Nov 2016 11:16:03 -0800
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=from:message-id:date:in-reply-to:comments:references:to:subject :mime-version; bh=Ze7LyUnAyjaAedajGZtTMd/X/WgmpDhUDTLUixNlUoo=; b=IyI9+o5PJWYshDSkGeb9mAHdMw9IebC08SsOJ+7J/fmTpakyW+06V5EVu/Rh4qV899 VhHxeIC3NIeR9q444cIJTs1mSVzzmqO9ZiBB8LcmGz07/hqJymmxzsJo1ISGxHyobZpU kOyNYG2c6r6xI8DZ2QY3SgJqAAa0RD/uzoiiYosEkcJ2bjQJ0Ya7vsz2RhytNeNICmlN ZgXWiDoSTD3H1hQjW3sTZd0zD+VqqZNq+u5Wa3b9p6CtLD1N5WNlvqfFEZHvYzUs4YIX HTpUuUL0acrTox+EjuKrLD8VYfM1l6WfqbpGXTromkxU18TJOtvk7M7afhEG6T50bscm SMFg==
- In-reply-to: <161112124105.ZM4155@torch.brasslantern.com>
- 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: <161112090315.ZM1146@torch.brasslantern.com> <CAHYJk3Q0JruaPKGiAouYr+SeUyn3v3a4SFxXoJX01a9JXb_Sog@mail.gmail.com> <161112124105.ZM4155@torch.brasslantern.com>
On Nov 12, 12:41pm, Bart Schaefer wrote:
}
} On Nov 12, 6:54pm, Mikael Magnusson wrote:
} }
} } There are many many more ways to break a shell session, surely.
}
} Of course; e.g. just doing
}
} zle -N self-insert this-does-not-exist
Seems to me that if we have immortal widgets backing the built-ins,
we should use them in cases like this?
IMO the only controversial bit of this patch is the final hunk. As
there is no way to tell at what point the user-defined widget failed,
calling the immortal counterpart might duplicate something that was
already done. In the other cases we know nothing else has happened.
An alternate approach for that final bit is to simply bail out of ZLE
entirely (opts[USEZLE] = 0). That's a little tricky if we're a couple
of user-defined widgets down the call stack, as localoptions may end
up clobbering whatever we do here.
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 96b631e..1652b7c 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -1368,6 +1368,16 @@ zleread(char **lp, char **rp, int flags, int context, char *init, char *finish)
return s;
}
+/**/
+static int
+execimmortal(Thingy func, char **args)
+{
+ Thingy immortal = rthingy_nocreate(dyncat(".", func->nam));
+ if (immortal)
+ return execzlefunc(immortal, args, 0);
+ return 1;
+}
+
/*
* Execute a widget. The third argument indicates that the global
* variable bindk should be set temporarily so that WIDGET etc.
@@ -1389,7 +1399,7 @@ execzlefunc(Thingy func, char **args, int set_bindk)
remetafy = 1;
}
- if(func->flags & DISABLED) {
+ if (func->flags & DISABLED) {
/* this thingy is not the name of a widget */
char *nm = nicedup(func->nam, 0);
char *msg = tricat("No such widget `", nm, "'");
@@ -1397,7 +1407,7 @@ execzlefunc(Thingy func, char **args, int set_bindk)
zsfree(nm);
showmsg(msg);
zsfree(msg);
- ret = 1;
+ ret = execimmortal(func, args);
} else if((w = func->widget)->flags & (WIDGET_INT|WIDGET_NCOMP)) {
int wflags = w->flags;
@@ -1461,7 +1471,7 @@ execzlefunc(Thingy func, char **args, int set_bindk)
zsfree(nm);
showmsg(msg);
zsfree(msg);
- ret = 1;
+ ret = execimmortal(func, args);
} else {
int osc = sfcontext, osi = movefd(0);
int oxt = isset(XTRACE);
@@ -1483,6 +1493,8 @@ execzlefunc(Thingy func, char **args, int set_bindk)
opts[XTRACE] = oxt;
sfcontext = osc;
endparamscope();
+ if (errflag == ERRFLAG_ERROR && !(ret = execimmortal(func, args)))
+ errflag &= ~ERRFLAG_ERROR;
lastcmd = w->flags & ~(WIDGET_INUSE|WIDGET_FREE);
if (inuse) {
w->flags &= WIDGET_INUSE|WIDGET_FREE;
Messages sorted by:
Reverse Date,
Date,
Thread,
Author