about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Kiddle <okiddle@yahoo.co.uk>2014-02-05 21:55:18 +0100
committerOliver Kiddle <okiddle@yahoo.co.uk>2014-02-05 21:55:18 +0100
commite1bc9d0a44da9c27c5558767cdb75da1a3424a4b (patch)
tree8242fb1af26e2423082813deea64383fcd869544
parent2cd3b9ab74a961798362d27094a6d29d7723c171 (diff)
downloadzsh-e1bc9d0a44da9c27c5558767cdb75da1a3424a4b.tar.gz
zsh-e1bc9d0a44da9c27c5558767cdb75da1a3424a4b.tar.xz
zsh-e1bc9d0a44da9c27c5558767cdb75da1a3424a4b.zip
32342: fix overstrike for vi mode and use varying vi commands at line start
-rw-r--r--ChangeLog3
-rw-r--r--Src/Zle/zle_main.c16
-rw-r--r--Src/Zle/zle_vi.c6
3 files changed, 15 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index de6aa34db..b836b0e83 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2014-02-05  Oliver Kiddle <opk@zsh.org>
 
+	* 32342: Src/Zle/zle_main.c, Src/Zle/zle_vi.c: fix overstrike for vi
+	mode and use varying vi commands at line start
+
 	* 32334 (modified so KEEPSUFFIX is unchanged for vi-cmd-mode; based on
 	Jun T: 32324, 32330), 32347, Jun T: 32344, 32349: Src/Zle/iwidgets.list,
 	Src/Zle/zle_main.c, Src/Zle/zle_utils.c, Src/Zle/zle_vi.c
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index ed8577bcd..b0010fc33 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -1198,14 +1198,6 @@ zleread(char **lp, char **rp, int flags, int context, char *init, char *finish)
     statusline = NULL;
     selectkeymap("main", 1);
     initundo();
-    /*
-     * If main is linked to the viins keymap, we need to register
-     * explicitly that we're now in vi insert mode as there's
-     * no user operation to indicate this.
-     */
-    if (openkeymap("main") == openkeymap("viins"))
-	viinsert_init();
-    selectlocalmap(NULL);
     fixsuffix();
     if ((s = getlinknode(bufstack))) {
 	setline(s, ZSL_TOEND);
@@ -1222,6 +1214,14 @@ zleread(char **lp, char **rp, int flags, int context, char *init, char *finish)
 	    stackhist = -1;
 	}
     }
+    /*
+     * If main is linked to the viins keymap, we need to register
+     * explicitly that we're now in vi insert mode as there's
+     * no user operation to indicate this.
+     */
+    if (openkeymap("main") == openkeymap("viins"))
+	viinsert_init();
+    selectlocalmap(NULL);
     if (isset(PROMPTCR))
 	putc('\r', shout);
     if (tmout)
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index 79b8cb958..994b44fe3 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -79,8 +79,9 @@ static void
 startvichange(int im)
 {
     if (im != -1) {
-	insmode = im;
 	vichgflag = 1;
+	if (im > -1)
+	    insmode = im;
     }
     if (inrepeat && im != -2) {
 	zmod = lastmod;
@@ -92,7 +93,8 @@ startvichange(int im)
 	    free(vichgbuf);
 	vichgbuf = (char *)zalloc(vichgbufsz = 16);
 	if (im == -2) {
-	    vichgbuf[0] = 'a';
+	    vichgbuf[0] =
+		zlell ? (insmode ? (zlecs < zlell ? 'i' : 'a') : 'R') : 'o';
 	} else {
 	    vichgbuf[0] = lastchar;
 	}