From d2505f108e4144cde656a3568571fd0c195cdd1f Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Sun, 30 Nov 2014 23:37:01 +0100 Subject: 33823: overwrite mode shouldn't replace newlines --- ChangeLog | 3 +++ Src/Zle/zle_misc.c | 21 ++++++++++----------- Test/X02zlevi.ztst | 13 +++++++++++++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 365abc7b2..567fcc08c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2014-11-30 Oliver Kiddle + * 33823: Src/Zle/zle_misc.c, Test/X02zlevi.ztst: overwrite mode + shouldn't replace newlines + * 33820: configure.ac, Src/hist.c: detect support for realpath() with a NULL argument and fixes to the use of it diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c index a220a6bc8..a1dc3fa5c 100644 --- a/Src/Zle/zle_misc.c +++ b/Src/Zle/zle_misc.c @@ -47,13 +47,13 @@ doinsert(ZLE_STRING_T zstr, int len) iremovesuffix(c1, 0); invalidatelist(); - if (insmode) + /* In overwrite mode, don't replace newlines. */ + if (insmode || zleline[zlecs] == ZWC('\n')) spaceinline(m * len); else -#ifdef MULTIBYTE_SUPPORT { int pos = zlecs, diff, i; - +#ifdef MULTIBYTE_SUPPORT /* * Calculate the number of character positions we are * going to be using. The algorithm is that @@ -68,15 +68,18 @@ doinsert(ZLE_STRING_T zstr, int len) * useful there anyway and this doesn't cause any * particular harm. */ - for (i = 0, count = 0; i < len; i++) { + for (i = 0, count = 0; i < len * m; i++) { if (!IS_COMBINING(zstr[i])) count++; } +#else + count = len * m; +#endif /* - * Ensure we replace a complete combining character - * for each character we overwrite. + * Ensure we replace a complete combining characterfor each + * character we overwrite. Switch to inserting at first newline. */ - for (i = count; pos < zlell && i--; ) { + for (i = count; pos < zlell && zleline[pos] != ZWC('\n') && i--; ) { INCPOS(pos); } /* @@ -96,10 +99,6 @@ doinsert(ZLE_STRING_T zstr, int len) shiftchars(zlecs, diff); } } -#else - if (zlecs + m * len > zlell) - spaceinline(zlecs + m * len - zlell); -#endif while (m--) for (s = zstr, count = len; count; s++, count--) zleline[zlecs++] = *s; diff --git a/Test/X02zlevi.ztst b/Test/X02zlevi.ztst index 1185a083d..8f9390250 100644 --- a/Test/X02zlevi.ztst +++ b/Test/X02zlevi.ztst @@ -43,6 +43,19 @@ > >CURSOR: 2 + zletest $'\eOword\eO\eraok\ejrxj.rae' +0:replace character when at end of buffer or newline +>BUFFER: ok +>wxrd +>e +>CURSOR: 9 + + zletest $'two\eOone\ehRreplace' +0:replace acts like insert at newline +>BUFFER: oreplace +>two +>CURSOR: 8 + zletest $' four\eO\C-v\tthree\eO two\eOone\e3J' 0:join lines with line count >BUFFER: one two three -- cgit 1.4.1