mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-01 05:16:05 +01:00
users/16932: implement $UNDO_CHANGE_NO and argument to undo widget
This commit is contained in:
parent
8bb9818cd4
commit
13a45d74eb
6 changed files with 59 additions and 4 deletions
|
@ -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 $
|
||||
*****************************************************
|
||||
|
|
|
@ -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))(
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue