summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}