summaryrefslogblamecommitdiffstats
path: root/patches/source/vim/patches/7.4.064
blob: 771320851e8ea5711686c2547f692cb895e92550 (plain) (tree)






























































































































































































                                                                                   
To: vim_dev@googlegroups.com
Subject: Patch 7.4.064
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 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)
Files:      src/normal.c, src/ops.c, src/testdir/test39.in,
            src/testdir/test39.ok


*** ../vim-7.4.063/src/normal.c	2013-09-25 18:54:20.000000000 +0200
--- src/normal.c	2013-11-04 01:14:53.000000000 +0100
***************
*** 7036,7041 ****
--- 7036,7048 ----
      {
  	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;
      }
*** ../vim-7.4.063/src/ops.c	2013-11-02 23:59:30.000000000 +0100
--- src/ops.c	2013-11-04 01:28:54.000000000 +0100
***************
*** 2074,2083 ****
--- 2074,2088 ----
      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,2188 ****
  	    /* 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)
  	    {
! 		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);
  	    }
  	    /* replace the line */
  	    ml_replace(curwin->w_cursor.lnum, newp, FALSE);
  	}
      }
      else
--- 2169,2211 ----
  	    /* insert pre-spaces */
  	    copy_spaces(newp + bd.textcol, (size_t)bd.startspaces);
  	    /* insert replacement chars CHECK FOR ALLOCATED SPACE */
! 	    /* -1/-2 is used for entering CR literally. */
! 	    if (had_ctrl_v_cr || (c != '\r' && c != '\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
  	    {
! 		/* 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
*** ../vim-7.4.063/src/testdir/test39.in	2013-03-07 18:30:38.000000000 +0100
--- src/testdir/test39.in	2013-11-04 01:36:34.000000000 +0100
***************
*** 32,37 ****
--- 32,41 ----
  doh dutVkUj
  :" Uppercase part of two lines
  ddppi333k0i222fyllvjfuUk
+ :" visual replace using Enter or NL
+ G3o1234567892k05l2jr
G3o987652k02l2jr
+ G3o1234567892k05l2jr
+ G3o987652k02l2jr
  :/^the/,$w >> test.out
  :qa!
  ENDTEST
*** ../vim-7.4.063/src/testdir/test39.ok	2013-03-07 18:28:51.000000000 +0100
--- src/testdir/test39.ok	2013-11-04 01:37:12.000000000 +0100
***************
*** 11,13 ****
--- 11,31 ----
  DOH DUT
  222the yoUTUSSEUU END
  333THE YOUTUßeuu end
+ 12345
+ 789
+ 12345
+ 789
+ 12345
+ 789
+ 98
65
+ 98
65
+ 98
65
+ 12345
+ 789
+ 12345
+ 789
+ 12345
+ 789
+ 98