diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2008-04-21 17:30:34 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2008-04-21 17:30:34 +0000 |
commit | f9224e5a0493a5f41882988cf467c80a531e331f (patch) | |
tree | 0d7879e448c7da4d05934f93e5f5009f7f21d097 /Src/Zle/zle_vi.c | |
parent | 5a0c547e919bded1d4966213beb9a3ae89b08698 (diff) | |
download | zsh-f9224e5a0493a5f41882988cf467c80a531e331f.tar.gz zsh-f9224e5a0493a5f41882988cf467c80a531e331f.tar.xz zsh-f9224e5a0493a5f41882988cf467c80a531e331f.zip |
24859: combining chars: overwriting and vi replace and append
Diffstat (limited to 'Src/Zle/zle_vi.c')
-rw-r--r-- | Src/Zle/zle_vi.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c index b8215454f..16b741b75 100644 --- a/Src/Zle/zle_vi.c +++ b/Src/Zle/zle_vi.c @@ -498,18 +498,19 @@ int vireplacechars(UNUSED(char **args)) { ZLE_INT_T ch; - int n = zmult, origcs = zlecs, fail = 0; + int n = zmult, fail = 0, newchars = 0; if (n > 0) { + int pos = zlecs; while (n-- > 0) { - if (zlecs == zlell || zleline[zlell] == ZWC('\n')) { + if (pos == zlell || zleline[pos] == ZWC('\n')) { fail = 1; break; } - INCCS(); + newchars++; + INCPOS(pos); } - n = zlecs - origcs; - zlecs = origcs; + n = pos - zlecs; } startvichange(1); /* check argument range */ @@ -535,8 +536,16 @@ vireplacechars(UNUSED(char **args)) backkill(n - 1, CUT_RAW); zleline[zlecs++] = '\n'; } else { - /* HERE: we shouldn't replace combining chars, we should delete them */ - while (n--) + /* + * Make sure we delete displayed characters, including + * attach combining characters. n includes this as a raw + * buffer offset. + */ + if (n > newchars) + foredel(n - newchars, CUT_RAW); + else if (n < newchars) + spaceinline(newchars - n); + while (newchars--) zleline[zlecs++] = ch; zlecs--; } @@ -792,14 +801,14 @@ viputafter(UNUSED(char **args)) vifirstnonblank(zlenoargs); } else { if (zlecs != findeol()) - zlecs++; + INCCS(); while (n--) { spaceinline(buf->len); ZS_memcpy(zleline + zlecs, buf->buf, buf->len); zlecs += buf->len; } if (zlecs) - zlecs--; + DECCS(); } return 0; } |