From 2cd3b9ab74a961798362d27094a6d29d7723c171 Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Wed, 5 Feb 2014 21:45:19 +0100 Subject: 32334 (modified so KEEPSUFFIX is unchanged for vi-cmd-mode; based on Jun T: 32324, 32330), 32347, Jun T: 32344, 32349: add split-undo zle widget for configurable breaks in undo sequence --- Src/Zle/iwidgets.list | 1 + Src/Zle/zle_main.c | 2 +- Src/Zle/zle_utils.c | 26 ++++++++++++++++++++++++++ Src/Zle/zle_vi.c | 8 +------- 4 files changed, 29 insertions(+), 8 deletions(-) (limited to 'Src/Zle') diff --git a/Src/Zle/iwidgets.list b/Src/Zle/iwidgets.list index 4372fe36e..e3ffe3e8c 100644 --- a/Src/Zle/iwidgets.list +++ b/Src/Zle/iwidgets.list @@ -102,6 +102,7 @@ "self-insert-unmeta", selfinsertunmeta, ZLE_MENUCMP | ZLE_KEEPSUFFIX "send-break", sendbreak, 0 "set-mark-command", setmarkcommand, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL +"split-undo", splitundo, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_NOTCOMMAND "spell-word", spellword, 0 "set-local-history", setlocalhistory, 0 "transpose-chars", transposechars, 0 diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index f5aec8403..ed8577bcd 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -1189,7 +1189,7 @@ zleread(char **lp, char **rp, int flags, int context, char *init, char *finish) zlereadflags = flags; zlecontext = context; histline = curhist; - vistartchange = 0; + vistartchange = -1; zleline = (ZLE_STRING_T)zalloc(((linesz = 256) + 2) * ZLE_CHAR_SIZE); *zleline = ZWC('\0'); virangeflag = lastcmd = done = zlecs = zlell = mark = 0; diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c index 61ae85c0b..9cfa8813d 100644 --- a/Src/Zle/zle_utils.c +++ b/Src/Zle/zle_utils.c @@ -1632,6 +1632,32 @@ viundochange(char **args) return undo(args); } +/**/ +int +splitundo(char **args) +{ + if (vistartchange >= 0) { + mergeundo(); + vistartchange = (curchange && curchange->prev) ? + curchange->prev->changeno : 0; + } + handleundo(); + return 0; +} + +/**/ +void +mergeundo(void) +{ + struct change *current; + for (current = curchange->prev; + current && current->prev && current->changeno > vistartchange+1; + current = current->prev) { + current->flags |= CH_PREV; + current->prev->flags |= CH_NEXT; + } +} + /* * Call a ZLE hook: a user-defined widget called at a specific point * within the line editor. diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c index 9e9cc2f34..79b8cb958 100644 --- a/Src/Zle/zle_vi.c +++ b/Src/Zle/zle_vi.c @@ -584,13 +584,7 @@ vicmdmode(UNUSED(char **args)) { if (invicmdmode() || selectkeymap("vicmd", 0)) return 1; - struct change *current = curchange->prev; - while (current && current->changeno > vistartchange+1) { - current->flags |= CH_PREV; - current = current->prev; - if (!current) break; - current->flags |= CH_NEXT; - } + mergeundo(); vichgflag = 0; if (zlecs != findbol()) DECCS(); -- cgit 1.4.1