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