about summary refs log tree commit diff
path: root/Src/Zle/zle_vi.c
diff options
context:
space:
mode:
authorOliver Kiddle <okiddle@yahoo.co.uk>2014-01-31 14:01:12 +0100
committerOliver Kiddle <okiddle@yahoo.co.uk>2014-01-31 14:03:47 +0100
commita8c4ed64ee684227c0dd3142e912f7faca8bd1fb (patch)
treedc5796a80d8476315a908c2556d5c6cd43fcba0b /Src/Zle/zle_vi.c
parent779ad93490f03e0759c065618a3267d2e6f07b84 (diff)
downloadzsh-a8c4ed64ee684227c0dd3142e912f7faca8bd1fb.tar.gz
zsh-a8c4ed64ee684227c0dd3142e912f7faca8bd1fb.tar.xz
zsh-a8c4ed64ee684227c0dd3142e912f7faca8bd1fb.zip
32314: merge undo events corresponding to vi change in the vi-cmd-mode widget so undo from insert mode is useful again
Diffstat (limited to 'Src/Zle/zle_vi.c')
-rw-r--r--Src/Zle/zle_vi.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index 31f293387..9e9cc2f34 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -107,7 +107,7 @@ startvitext(int im)
 {
     startvichange(im);
     selectkeymap("main", 1);
-    undoing = 0;
+    vistartchange = (curchange && curchange->prev) ? curchange->prev->changeno : 0;
     viinsbegin = zlecs;
 }
 
@@ -399,7 +399,7 @@ vichange(UNUSED(char **args))
 	forekill(c2 - zlecs, CUT_RAW);
 	selectkeymap("main", 1);
 	viinsbegin = zlecs;
-	undoing = 0;
+	vistartchange = curchange->prev->changeno;
     }
     return ret;
 }
@@ -584,7 +584,13 @@ vicmdmode(UNUSED(char **args))
 {
     if (invicmdmode() || selectkeymap("vicmd", 0))
 	return 1;
-    undoing = 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;
+    }
     vichgflag = 0;
     if (zlecs != findbol())
 	DECCS();