diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | Doc/Zsh/zle.yo | 11 | ||||
-rw-r--r-- | Functions/Zle/replace-string | 9 | ||||
-rw-r--r-- | Src/Zle/zle.h | 1 | ||||
-rw-r--r-- | Src/Zle/zle_params.c | 4 | ||||
-rw-r--r-- | Src/Zle/zle_utils.c | 30 |
6 files changed, 59 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index 0e52b4621..9b33484b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-03-29 Peter Stephenson <p.w.stephenson@ntlworld.com> + + * users/16932: Doc/Zsh/zle.yo, Functions/Zle/replace-string: + Src/Zle/zle.h, Src/Zle/zle_params.c, Src/Zle/zle_utils.c: + implement $UNDO_CHANGE_NO and argument to undo widget. + 2012-03-25 Mikael Magnusson <mikachu@gmail.com> * Jesper Nygårds: 30378: Completion/Unix/Command/.distfiles, @@ -16125,5 +16131,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5615 $ +* $Revision: 1.5616 $ ***************************************************** diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo index d3624b1ce..8dc46ca28 100644 --- a/Doc/Zsh/zle.yo +++ b/Doc/Zsh/zle.yo @@ -877,6 +877,12 @@ any predisplay string should be highlighted in bold. Note that the effect of tt(region_highlight) is not saved and disappears as soon as the line is accepted. ) +vindex(UNDO_CHANGE_NO) +item(tt(UNDO_CHANGE_NO) (integer)) +A number representing the state of the undo history. The only use +of this is passing as an argument to the tt(undo) widget in order to +undo back to the recorded point. Read-only. +) vindex(WIDGET) item(tt(WIDGET) (scalar))( The name of the widget currently being executed; read-only. @@ -2164,7 +2170,10 @@ command is typed. By default it beeps. ) tindex(undo) item(tt(undo) (^_ ^Xu ^X^U) (unbound) (unbound))( -Incrementally undo the last text modification. +Incrementally undo the last text modification. When called from a +user-defined widget, takes an optional argument indicating a previous state +of the undo history as returned by the tt(UNDO_CHANGE_NO) variable; +modifications are undone until that state is reached. ) tindex(redo) item(tt(redo))( diff --git a/Functions/Zle/replace-string b/Functions/Zle/replace-string index a3416a403..68aac28d2 100644 --- a/Functions/Zle/replace-string +++ b/Functions/Zle/replace-string @@ -4,6 +4,9 @@ setopt extendedglob autoload -Uz read-from-minibuffer replace-string-again local p1 p2 +integer changeno=$UNDO_CHANGE_NO + +{ if [[ -n $_replace_string_src ]]; then p1="[$_replace_string_src -> $_replace_string_rep]"$'\n' @@ -30,4 +33,10 @@ if [[ -n $REPLY ]]; then typeset -g _replace_string_rep=$REPLY fi +} always { + # Undo back to the original line; we don't want the + # undo history of editing the strings left. + zle undo $changeno +} + replace-string-again $curwidget diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h index bedf28f17..cf44b47d2 100644 --- a/Src/Zle/zle.h +++ b/Src/Zle/zle.h @@ -269,6 +269,7 @@ struct change { ZLE_STRING_T ins; /* characters to insert */ int insl; /* no. of characters in ins */ int old_cs, new_cs; /* old and new cursor positions */ + zlong changeno; /* unique number of this change */ }; #define CH_NEXT (1<<0) /* next structure is also part of this change */ diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c index 3fdb5f8ed..1a39df862 100644 --- a/Src/Zle/zle_params.c +++ b/Src/Zle/zle_params.c @@ -93,6 +93,8 @@ static const struct gsu_integer pending_gsu = { get_pending, NULL, zleunsetfn }; static const struct gsu_integer region_active_gsu = { get_region_active, set_region_active, zleunsetfn }; +static const struct gsu_integer undo_change_no_gsu = +{ get_undo_current_change, NULL, zleunsetfn }; static const struct gsu_array killring_gsu = { get_killring, set_killring, unset_killring }; @@ -133,6 +135,8 @@ static struct zleparam { { "RBUFFER", PM_SCALAR, GSU(rbuffer_gsu), NULL }, { "REGION_ACTIVE", PM_INTEGER, GSU(region_active_gsu), NULL}, { "region_highlight", PM_ARRAY, GSU(region_highlight_gsu), NULL }, + { "UNDO_CHANGE_NO", PM_INTEGER | PM_READONLY, GSU(undo_change_no_gsu), + NULL }, { "WIDGET", PM_SCALAR | PM_READONLY, GSU(widget_gsu), NULL }, { "WIDGETFUNC", PM_SCALAR | PM_READONLY, GSU(widgetfunc_gsu), NULL }, { "WIDGETSTYLE", PM_SCALAR | PM_READONLY, GSU(widgetstyle_gsu), NULL }, 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; +} + |