diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Zle/zle_utils.c | 33 |
1 files changed, 9 insertions, 24 deletions
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c index 8b55403b3..d1d320613 100644 --- a/Src/Zle/zle_utils.c +++ b/Src/Zle/zle_utils.c @@ -1409,10 +1409,6 @@ zlong undo_changeno; zlong undo_limitno; -/* If non-zero, the last increment to undo_changeno was for the variable */ - -static int undo_set_by_variable; - /**/ void initundo(void) @@ -1423,7 +1419,6 @@ initundo(void) curchange->del = curchange->ins = NULL; curchange->dell = curchange->insl = 0; curchange->changeno = undo_changeno = undo_limitno = 0; - undo_set_by_variable = 0; lastline = zalloc((lastlinesz = linesz) * ZLE_CHAR_SIZE); ZS_memcpy(lastline, zleline, (lastll = zlell)); lastcs = zlecs; @@ -1549,7 +1544,6 @@ mkundoent(void) ch->prev = NULL; } ch->changeno = ++undo_changeno; - undo_set_by_variable = 0; endnextchanges = ch; } @@ -1584,14 +1578,13 @@ undo(char **args) struct change *prev = curchange->prev; if(!prev) return 1; - if (prev->changeno < last_change) + if (prev->changeno <= last_change) break; - if (prev->changeno < undo_limitno && !*args) + if (prev->changeno <= undo_limitno && !*args) return 1; - if (unapplychange(prev)) - curchange = prev; - else - break; + if (!unapplychange(prev) && last_change >= 0) + unapplychange(prev); + curchange = prev; } while (last_change >= (zlong)0 || (curchange->flags & CH_PREV)); setlastline(); return 0; @@ -1741,18 +1734,10 @@ zlecallhook(char *name, char *arg) zlong get_undo_current_change(UNUSED(Param pm)) { - if (undo_set_by_variable) { - /* We were the last to increment this, doesn't need another one. */ - return undo_changeno; - } - undo_set_by_variable = 1; - /* - * Increment the number in case a change is in progress; - * we don't want to back off what's already been done when - * we return to this change number. This eliminates any - * problem about the point where a change is numbered - */ - return ++undo_changeno; + /* add entry for any pending changes */ + mkundoent(); + setlastline(); + return undo_changeno; } /**/ |