diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Zle/zle.h | 1 | ||||
-rw-r--r-- | Src/Zle/zle_tricky.c | 3 | ||||
-rw-r--r-- | Src/Zle/zle_utils.c | 8 |
3 files changed, 11 insertions, 1 deletions
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h index 2dfeb6950..2b23811d7 100644 --- a/Src/Zle/zle.h +++ b/Src/Zle/zle.h @@ -107,6 +107,7 @@ struct change { int off; /* offset of the text changes */ char *del; /* characters to delete (metafied) */ char *ins; /* characters to insert (metafied) */ + int old_cs, new_cs; /* old and new cursor positions */ }; #define CH_NEXT (1<<0) /* next structure is also part of this change */ diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index 04b841411..b85084355 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -512,6 +512,9 @@ docomplete(int lst) char *s, *ol; int olst = lst, chl = 0, ne = noerrs, ocs, ret = 0; + if (undoing) + setlastline(); + if (runhookdef(BEFORECOMPLETEHOOK, (void *) &lst)) return 0; diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c index bd2f39a06..2cd985124 100644 --- a/Src/Zle/zle_utils.c +++ b/Src/Zle/zle_utils.c @@ -53,7 +53,7 @@ struct cutbuffer vibuf[35]; /**/ char *lastline; /**/ -int lastlinesz, lastll; +int lastlinesz, lastll, lastcs; /* size of line buffer */ @@ -438,6 +438,7 @@ initundo(void) curchange->del = curchange->ins = NULL; lastline = zalloc(lastlinesz = linesz); memcpy(lastline, line, lastll = ll); + lastcs = cs; } /**/ @@ -511,6 +512,8 @@ mkundoent(void) ch->next = NULL; ch->hist = histline; ch->off = pre; + ch->old_cs = lastcs; + ch->new_cs = cs; if(suf + pre == lastll) ch->del = NULL; else @@ -541,6 +544,7 @@ setlastline(void) if(lastlinesz != linesz) lastline = realloc(lastline, lastlinesz = linesz); memcpy(lastline, line, lastll = ll); + lastcs = cs; } /* move backwards through the change list */ @@ -578,6 +582,7 @@ unapplychange(struct change *ch) else line[cs++] = STOUC(*c); } + cs = ch->old_cs; } /* move forwards through the change list */ @@ -616,6 +621,7 @@ applychange(struct change *ch) else line[cs++] = STOUC(*c); } + cs = ch->new_cs; } /* vi undo: toggle between the end of the undo list and the preceding point */ |