From d9820538bd6c83c51d24e3481cadf79ccaa9549e Mon Sep 17 00:00:00 2001 From: Bram Moolenaar <Bram@vim.org> Date: Mon, 4 Nov 2013 01:41:17 +0100 Subject: [PATCH] updated for version 7.4.064 Problem: When replacing a character in Visual block mode, entering a CR does not cause a repeated line break. Solution: Recognize the situation and repeat the line break. (Christian Brabandt) --- src/normal.c | 7 +++++++ src/ops.c | 47 +++++++++++++++++++++++++++++++----------- src/testdir/test39.in | 4 ++++ src/testdir/test39.ok | Bin 244 -> 340 bytes src/version.c | 2 ++ 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/normal.c b/src/normal.c index 87e979d1df..9349be2bb4 100644 --- a/src/normal.c +++ b/src/normal.c @@ -7036,6 +7036,13 @@ nv_replace(cap) { if (got_int) reset_VIsual(); + if (had_ctrl_v) + { + if (cap->nchar == '\r') + cap->nchar = -1; + else if (cap->nchar == '\n') + cap->nchar = -2; + } nv_operator(cap); return; } diff --git a/src/ops.c b/src/ops.c index 4a198487cc..1f2e97eea1 100644 --- a/src/ops.c +++ b/src/ops.c @@ -2074,10 +2074,15 @@ op_replace(oap, c) char_u *newp, *oldp; size_t oldlen; struct block_def bd; + char_u *after_p = NULL; + int had_ctrl_v_cr = (c == -1 || c == -2); if ((curbuf->b_ml.ml_flags & ML_EMPTY ) || oap->empty) return OK; /* nothing to do */ + if (had_ctrl_v_cr) + c = (c == -1 ? '\r' : '\n'); + #ifdef FEAT_MBYTE if (has_mbyte) mb_adjust_opend(oap); @@ -2164,25 +2169,43 @@ op_replace(oap, c) /* insert pre-spaces */ copy_spaces(newp + bd.textcol, (size_t)bd.startspaces); /* insert replacement chars CHECK FOR ALLOCATED SPACE */ -#ifdef FEAT_MBYTE - if (has_mbyte) + /* -1/-2 is used for entering CR literally. */ + if (had_ctrl_v_cr || (c != '\r' && c != '\n')) { - n = (int)STRLEN(newp); - while (--num_chars >= 0) - n += (*mb_char2bytes)(c, newp + n); +#ifdef FEAT_MBYTE + if (has_mbyte) + { + n = (int)STRLEN(newp); + while (--num_chars >= 0) + n += (*mb_char2bytes)(c, newp + n); + } + else +#endif + copy_chars(newp + STRLEN(newp), (size_t)numc, c); + if (!bd.is_short) + { + /* insert post-spaces */ + copy_spaces(newp + STRLEN(newp), (size_t)bd.endspaces); + /* copy the part after the changed part */ + STRMOVE(newp + STRLEN(newp), oldp); + } } else -#endif - copy_chars(newp + STRLEN(newp), (size_t)numc, c); - if (!bd.is_short) { - /* insert post-spaces */ - copy_spaces(newp + STRLEN(newp), (size_t)bd.endspaces); - /* copy the part after the changed part */ - STRMOVE(newp + STRLEN(newp), oldp); + /* Replacing with \r or \n means splitting the line. */ + after_p = alloc_check((unsigned)oldlen + 1 + n - STRLEN(newp)); + if (after_p != NULL) + STRMOVE(after_p, oldp); } /* replace the line */ ml_replace(curwin->w_cursor.lnum, newp, FALSE); + if (after_p != NULL) + { + ml_append(curwin->w_cursor.lnum++, after_p, 0, FALSE); + appended_lines_mark(curwin->w_cursor.lnum, 1L); + oap->end.lnum++; + vim_free(after_p); + } } } else diff --git a/src/testdir/test39.in b/src/testdir/test39.in index d39ba82d9e..96995e0896 100644 --- a/src/testdir/test39.in +++ b/src/testdir/test39.in @@ -32,6 +32,10 @@ Oblah di doh dutVkUj :" Uppercase part of two lines ddppi333k0i222fyllvjfuUk +:" visual replace using Enter or NL +G3o1234567892k05l2jr G3o987652k02l2jr +G3o1234567892k05l2jr +G3o987652k02l2jr :/^the/,$w >> test.out :qa! ENDTEST diff --git a/src/testdir/test39.ok b/src/testdir/test39.ok index 38a5bc3a683b375df61b0a24ff4f78a98522fb66..4ebecf6cde60bfb4f90cf2960c4ffec2011efbda 100644 GIT binary patch delta 103 tcmeyuc!g=gmjpv2V-r&@a|=r@Y%EI)UNciJWD=VygqWoT16VzR1OSO=6P*A6 delta 6 Ncmcb@^o4Q47XS+H15f|} diff --git a/src/version.c b/src/version.c index b46d791b45..6610be7bb0 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 64, /**/ 63, /**/ -- GitLab