summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Doc/Zsh/zle.yo5
-rw-r--r--Src/Zle/iwidgets.list2
-rw-r--r--Src/Zle/zle.h1
-rw-r--r--Src/Zle/zle_main.c16
-rw-r--r--Src/Zle/zle_thingy.c5
-rw-r--r--Src/Zle/zle_utils.c2
-rw-r--r--Src/Zle/zle_vi.c2
8 files changed, 28 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 8cc48aae5..82a7ebbf6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2019-04-10 Peter Stephenson <p.stephenson@samsung.com>
+ * Roman Perepelitsa: 44215: Doc/Zsh/zle.yo,
+ Src/Zle/iwidgets.list, Src/Zle/zle.h, Src/Zle/zle_main.c,
+ Src/Zle/zle_thingy.c, Src/Zle/zle_utils.c, Src/Zle/zle_vi.c:
+ Maintain LASTWIDGET across reset-prompt, avoiding side effects
+ of asynchronous notifications.
+
* 44202: Src/Zle/compctl.c: Rewrite to use memmove()
for possibly overlapping copy.
diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo
index c2b9f5430..0986e5390 100644
--- a/Doc/Zsh/zle.yo
+++ b/Doc/Zsh/zle.yo
@@ -2415,9 +2415,12 @@ directory, or changes to the value of variables referred to by the
prompt).
Otherwise, the prompt is only expanded each time zle starts, and
-when the display as been interrupted by output from another part of the
+when the display has been interrupted by output from another part of the
shell (such as a job notification) which causes the command line to be
reprinted.
+
+tt(reset-prompt) doesn't alter the special parameter tt(LASTWIDGET).
+
)
tindex(send-break)
item(tt(send-break) (tt(^G ESC-^G)) (unbound) (unbound))(
diff --git a/Src/Zle/iwidgets.list b/Src/Zle/iwidgets.list
index 58310cd74..c95c7a491 100644
--- a/Src/Zle/iwidgets.list
+++ b/Src/Zle/iwidgets.list
@@ -99,7 +99,7 @@
"recursive-edit", recursiveedit, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL
"redisplay", redisplay, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL
"redo", redo, ZLE_KEEPSUFFIX
-"reset-prompt", resetprompt, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL
+"reset-prompt", resetprompt, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL | ZLE_NOTCOMMAND | ZLE_NOLAST
"reverse-menu-complete", reversemenucomplete, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_ISCOMP
"run-help", processcmd, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL
"select-a-word", selectword, ZLE_KEEPSUFFIX
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
index f06c56483..609493f8c 100644
--- a/Src/Zle/zle.h
+++ b/Src/Zle/zle.h
@@ -217,6 +217,7 @@ struct widget {
#define ZLE_ISCOMP (1<<11) /* usable for new style completion */
#define WIDGET_INUSE (1<<12) /* widget is in use */
#define WIDGET_FREE (1<<13) /* request to free when no longer in use */
+#define ZLE_NOLAST (1<<14) /* widget should not alter lbindk */
/* thingies */
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 71930f76b..d54e928a6 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -1073,7 +1073,7 @@ redrawhook(void)
* temporarily reset state for special variable handling etc.
*/
incompfunc = 0;
- execzlefunc(initthingy, args, 1);
+ execzlefunc(initthingy, args, 1, 0);
incompfunc = old_incompfunc;
/* Restore errflag and retflag as zlecallhook() does */
@@ -1136,7 +1136,7 @@ zlecore(void)
eofsent = 1;
break;
}
- if (execzlefunc(bindk, zlenoargs, 0)) {
+ if (execzlefunc(bindk, zlenoargs, 0, 0)) {
handlefeep(zlenoargs);
if (eofsent)
break;
@@ -1386,7 +1386,7 @@ execimmortal(Thingy func, char **args)
{
Thingy immortal = rthingy_nocreate(dyncat(".", func->nam));
if (immortal)
- return execzlefunc(immortal, args, 0);
+ return execzlefunc(immortal, args, 0, 0);
return 1;
}
@@ -1398,13 +1398,14 @@ execimmortal(Thingy func, char **args)
/**/
int
-execzlefunc(Thingy func, char **args, int set_bindk)
+execzlefunc(Thingy func, char **args, int set_bindk, int set_lbindk)
{
int r = 0, ret = 0, remetafy = 0;
int nestedvichg = vichgflag;
int isrepeat = (viinrepeat == 3);
Widget w;
Thingy save_bindk = bindk;
+ Thingy save_lbindk = lbindk;
if (set_bindk)
bindk = func;
@@ -1412,6 +1413,8 @@ execzlefunc(Thingy func, char **args, int set_bindk)
unmetafy_line();
remetafy = 1;
}
+ if (set_lbindk)
+ refthingy(save_lbindk);
if (isrepeat)
viinrepeat = 2;
@@ -1535,7 +1538,10 @@ execzlefunc(Thingy func, char **args, int set_bindk)
redup(osi, 0);
}
}
- if (r) {
+ if (set_lbindk) {
+ unrefthingy(lbindk);
+ lbindk = save_lbindk;
+ } else if (r) {
unrefthingy(lbindk);
refthingy(func);
lbindk = func;
diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
index 6b892b822..ce61db27b 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, remetafy;
+ int ret, saveflag = 0, setbindk = 0, setlbindk, remetafy;
char *wname = *args++, *keymap_restore = NULL, *keymap_tmp;
if (!wname)
@@ -787,7 +787,8 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func))
* a vi range to detect a repeated key */
setbindk = setbindk ||
(t->widget && (t->widget->flags & (WIDGET_INT | ZLE_VIOPER)) == WIDGET_INT);
- ret = execzlefunc(t, args, setbindk);
+ setlbindk = t->widget && (t->widget->flags & ZLE_NOLAST) == ZLE_NOLAST;
+ ret = execzlefunc(t, args, setbindk, setlbindk);
unrefthingy(t);
if (saveflag)
zmod = modsave;
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index c6df3d89c..0277d4917 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -1733,7 +1733,7 @@ zlecallhook(char *name, char *arg)
args[0] = arg;
args[1] = NULL;
- execzlefunc(thingy, args, 1);
+ execzlefunc(thingy, args, 1, 0);
unrefthingy(thingy);
/* Retain any user interrupt error status */
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index a5ff9200c..0f198d0e8 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -216,7 +216,7 @@ getvirange(int wf)
* a number of lines is used. If the function used
* returns 1, we fail.
*/
- if ((k2 == bindk) ? dovilinerange() : execzlefunc(k2, zlenoargs, 1))
+ if ((k2 == bindk) ? dovilinerange() : execzlefunc(k2, zlenoargs, 1, 0))
ret = -1;
if (viinrepeat)
zmult = mult1;