diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2012-03-29 20:31:33 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2012-03-29 20:31:33 +0000 |
commit | 13a45d74eb246894516aa9315622cf99d7f27697 (patch) | |
tree | 680a07a1d9c4215c050b41e89c9bf1d7f3491e95 /Src/Zle/zle_utils.c | |
parent | 8bb9818cd403092830896c7c7dd02e3ccd744213 (diff) | |
download | zsh-13a45d74eb246894516aa9315622cf99d7f27697.tar.gz zsh-13a45d74eb246894516aa9315622cf99d7f27697.tar.xz zsh-13a45d74eb246894516aa9315622cf99d7f27697.zip |
users/16932: implement $UNDO_CHANGE_NO and argument to undo widget
Diffstat (limited to 'Src/Zle/zle_utils.c')
-rw-r--r-- | Src/Zle/zle_utils.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c index 45e30445e..cf6787f3a 100644 --- a/Src/Zle/zle_utils.c +++ b/Src/Zle/zle_utils.c @@ -1359,6 +1359,10 @@ static struct change *changes, *curchange; static struct change *nextchanges, *endnextchanges; +/* incremented to provide a unique change number */ + +static zlong undo_changeno; + /**/ void initundo(void) @@ -1368,6 +1372,7 @@ initundo(void) curchange->prev = curchange->next = NULL; curchange->del = curchange->ins = NULL; curchange->dell = curchange->insl = 0; + curchange->changeno = undo_changeno = 0; lastline = zalloc((lastlinesz = linesz) * ZLE_CHAR_SIZE); ZS_memcpy(lastline, zleline, (lastll = zlell)); lastcs = zlecs; @@ -1492,6 +1497,7 @@ mkundoent(void) ch->flags = 0; ch->prev = NULL; } + ch->changeno = ++undo_changeno; endnextchanges = ch; } @@ -1512,8 +1518,15 @@ setlastline(void) /**/ int -undo(UNUSED(char **args)) +undo(char **args) { + zlong last_change = (zlong)0; + + if (*args) + { + last_change = zstrtol(*args, NULL, 0); + } + handleundo(); do { if(!curchange->prev) @@ -1522,7 +1535,8 @@ undo(UNUSED(char **args)) curchange = curchange->prev; else break; - } while(curchange->flags & CH_PREV); + } while (*args ? curchange->changeno != last_change : + (curchange->flags & CH_PREV)); setlastline(); return 0; } @@ -1637,3 +1651,15 @@ zlecallhook(char *name, char *arg) errflag = saverrflag; retflag = savretflag; } + +/* + * Return the number corresponding to the last change made. + */ + +/**/ +zlong +get_undo_current_change(UNUSED(Param pm)) +{ + return undo_changeno; +} + |