diff options
author | Oliver Kiddle <opk@zsh.org> | 2015-08-11 13:44:32 +0200 |
---|---|---|
committer | Oliver Kiddle <opk@zsh.org> | 2015-08-11 13:44:32 +0200 |
commit | 5ee4cc8c09e346e118429d2981b9bbd57d7d956e (patch) | |
tree | 32b6944ab3ce5403c91868b98a96ec453d6d9c58 /Src/Zle | |
parent | 3183cbd98c6f980a1d0d15227b12cf1caeb54e33 (diff) | |
download | zsh-5ee4cc8c09e346e118429d2981b9bbd57d7d956e.tar.gz zsh-5ee4cc8c09e346e118429d2981b9bbd57d7d956e.tar.xz zsh-5ee4cc8c09e346e118429d2981b9bbd57d7d956e.zip |
36096: special . mark in vi mode
Diffstat (limited to 'Src/Zle')
-rw-r--r-- | Src/Zle/zle_move.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/Src/Zle/zle_move.c b/Src/Zle/zle_move.c index cf8f34595..f49df8647 100644 --- a/Src/Zle/zle_move.c +++ b/Src/Zle/zle_move.c @@ -883,24 +883,36 @@ int vigotomark(UNUSED(char **args)) { ZLE_INT_T ch; + int *markcs, *markhist = 0; int oldcs = zlecs; int oldline = histline; + int tmpcs, tmphist; ch = getfullchar(0); - if (ch == ZWC('\'') || ch == ZWC('`')) - ch = 26; - else { - if (ch < ZWC('a') || ch > ZWC('z')) - return 1; - ch -= ZWC('a'); - } - if (!vimarkline[ch]) - return 1; - if (curhist != vimarkline[ch] && !zle_goto_hist(vimarkline[ch], 0, 0)) { - vimarkline[ch] = 0; + if (ch == ZWC('\'') || ch == ZWC('`')) { + markhist = vimarkline + 26; + markcs = vimarkcs + 26; + } else if (ch == ZWC('.') && curchange->prev) { + /* position cursor where it was after the last change. not exactly + * what vim does but close enough */ + tmpcs = curchange->prev->new_cs; + tmphist = curchange->prev->hist; + markcs = &tmpcs; + markhist = &tmphist; + } else if (ch >= ZWC('a') && ch <= ZWC('z')) { + markhist = vimarkline + (ch - ZWC('a')); + markcs = vimarkcs + (ch - ZWC('a')); + } else return 1; + if (markhist) { + if (!*markhist) + return 1; + if (histline != *markhist && !zle_goto_hist(*markhist, 0, 0)) { + *markhist = 0; + return 1; + } } - zlecs = vimarkcs[ch]; + zlecs = *markcs; vimarkcs[26] = oldcs; vimarkline[26] = oldline; if (zlecs > zlell) |