To: vim_dev@googlegroups.com
Subject: Patch 7.3.333
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.3.333
Problem:    Using "." to repeat a Visual delete counts the size in bytes, not
	    characters.  (Connor Lane Smith)
Solution:   Store the virtual column numbers instead of byte positions.
Files:	    src/normal.c


*** ../vim-7.3.332/src/normal.c	2011-07-15 17:51:30.000000000 +0200
--- src/normal.c	2011-10-04 19:47:14.000000000 +0200
***************
*** 20,26 ****
   */
  static int	resel_VIsual_mode = NUL;	/* 'v', 'V', or Ctrl-V */
  static linenr_T	resel_VIsual_line_count;	/* number of lines */
! static colnr_T	resel_VIsual_col;		/* nr of cols or end col */
  
  static int	restart_VIsual_select = 0;
  #endif
--- 20,26 ----
   */
  static int	resel_VIsual_mode = NUL;	/* 'v', 'V', or Ctrl-V */
  static linenr_T	resel_VIsual_line_count;	/* number of lines */
! static colnr_T	resel_VIsual_vcol;		/* nr of cols or end col */
  
  static int	restart_VIsual_select = 0;
  #endif
***************
*** 1436,1442 ****
      /* The visual area is remembered for redo */
      static int	    redo_VIsual_mode = NUL; /* 'v', 'V', or Ctrl-V */
      static linenr_T redo_VIsual_line_count; /* number of lines */
!     static colnr_T  redo_VIsual_col;	    /* number of cols or end column */
      static long	    redo_VIsual_count;	    /* count for Visual operator */
  # ifdef FEAT_VIRTUALEDIT
      int		    include_line_break = FALSE;
--- 1436,1442 ----
      /* The visual area is remembered for redo */
      static int	    redo_VIsual_mode = NUL; /* 'v', 'V', or Ctrl-V */
      static linenr_T redo_VIsual_line_count; /* number of lines */
!     static colnr_T  redo_VIsual_vcol;	    /* number of cols or end column */
      static long	    redo_VIsual_count;	    /* count for Visual operator */
  # ifdef FEAT_VIRTUALEDIT
      int		    include_line_break = FALSE;
***************
*** 1549,1570 ****
  #ifdef FEAT_VISUAL
  	if (redo_VIsual_busy)
  	{
  	    oap->start = curwin->w_cursor;
  	    curwin->w_cursor.lnum += redo_VIsual_line_count - 1;
  	    if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
  		curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
  	    VIsual_mode = redo_VIsual_mode;
! 	    if (VIsual_mode == 'v')
  	    {
! 		if (redo_VIsual_line_count <= 1)
! 		    curwin->w_cursor.col += redo_VIsual_col - 1;
  		else
! 		    curwin->w_cursor.col = redo_VIsual_col;
! 	    }
! 	    if (redo_VIsual_col == MAXCOL)
! 	    {
! 		curwin->w_curswant = MAXCOL;
! 		coladvance((colnr_T)MAXCOL);
  	    }
  	    cap->count0 = redo_VIsual_count;
  	    if (redo_VIsual_count != 0)
--- 1549,1579 ----
  #ifdef FEAT_VISUAL
  	if (redo_VIsual_busy)
  	{
+ 	    /* Redo of an operation on a Visual area. Use the same size from
+ 	     * redo_VIsual_line_count and redo_VIsual_vcol. */
  	    oap->start = curwin->w_cursor;
  	    curwin->w_cursor.lnum += redo_VIsual_line_count - 1;
  	    if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
  		curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
  	    VIsual_mode = redo_VIsual_mode;
! 	    if (redo_VIsual_vcol == MAXCOL || VIsual_mode == 'v')
  	    {
! 		if (VIsual_mode == 'v')
! 		{
! 		    if (redo_VIsual_line_count <= 1)
! 		    {
! 			validate_virtcol();
! 			curwin->w_curswant =
! 				     curwin->w_virtcol + redo_VIsual_vcol - 1;
! 		    }
! 		    else
! 			curwin->w_curswant = redo_VIsual_vcol;
! 		}
  		else
! 		{
! 		    curwin->w_curswant = MAXCOL;
! 		}
! 		coladvance(curwin->w_curswant);
  	    }
  	    cap->count0 = redo_VIsual_count;
  	    if (redo_VIsual_count != 0)
***************
*** 1710,1716 ****
  		    }
  		}
  		else if (redo_VIsual_busy)
! 		    oap->end_vcol = oap->start_vcol + redo_VIsual_col - 1;
  		/*
  		 * Correct oap->end.col and oap->start.col to be the
  		 * upper-left and lower-right corner of the block area.
--- 1719,1725 ----
  		    }
  		}
  		else if (redo_VIsual_busy)
! 		    oap->end_vcol = oap->start_vcol + redo_VIsual_vcol - 1;
  		/*
  		 * Correct oap->end.col and oap->start.col to be the
  		 * upper-left and lower-right corner of the block area.
***************
*** 1735,1747 ****
  		 */
  		resel_VIsual_mode = VIsual_mode;
  		if (curwin->w_curswant == MAXCOL)
! 		    resel_VIsual_col = MAXCOL;
! 		else if (VIsual_mode == Ctrl_V)
! 		    resel_VIsual_col = oap->end_vcol - oap->start_vcol + 1;
! 		else if (oap->line_count > 1)
! 		    resel_VIsual_col = oap->end.col;
  		else
! 		    resel_VIsual_col = oap->end.col - oap->start.col + 1;
  		resel_VIsual_line_count = oap->line_count;
  	    }
  
--- 1744,1765 ----
  		 */
  		resel_VIsual_mode = VIsual_mode;
  		if (curwin->w_curswant == MAXCOL)
! 		    resel_VIsual_vcol = MAXCOL;
  		else
! 		{
! 		    if (VIsual_mode != Ctrl_V)
! 			getvvcol(curwin, &(oap->end),
! 						  NULL, NULL, &oap->end_vcol);
! 		    if (VIsual_mode == Ctrl_V || oap->line_count <= 1)
! 		    {
! 			if (VIsual_mode != Ctrl_V)
! 			    getvvcol(curwin, &(oap->start),
! 						&oap->start_vcol, NULL, NULL);
! 			resel_VIsual_vcol = oap->end_vcol - oap->start_vcol + 1;
! 		    }
! 		    else
! 			resel_VIsual_vcol = oap->end_vcol;
! 		}
  		resel_VIsual_line_count = oap->line_count;
  	    }
  
***************
*** 1769,1775 ****
  		if (!redo_VIsual_busy)
  		{
  		    redo_VIsual_mode = resel_VIsual_mode;
! 		    redo_VIsual_col = resel_VIsual_col;
  		    redo_VIsual_line_count = resel_VIsual_line_count;
  		    redo_VIsual_count = cap->count0;
  		}
--- 1787,1793 ----
  		if (!redo_VIsual_busy)
  		{
  		    redo_VIsual_mode = resel_VIsual_mode;
! 		    redo_VIsual_vcol = resel_VIsual_vcol;
  		    redo_VIsual_line_count = resel_VIsual_line_count;
  		    redo_VIsual_count = cap->count0;
  		}
***************
*** 7631,7642 ****
  	    if (VIsual_mode == 'v')
  	    {
  		if (resel_VIsual_line_count <= 1)
! 		    curwin->w_cursor.col += resel_VIsual_col * cap->count0 - 1;
  		else
! 		    curwin->w_cursor.col = resel_VIsual_col;
! 		check_cursor_col();
  	    }
! 	    if (resel_VIsual_col == MAXCOL)
  	    {
  		curwin->w_curswant = MAXCOL;
  		coladvance((colnr_T)MAXCOL);
--- 7649,7664 ----
  	    if (VIsual_mode == 'v')
  	    {
  		if (resel_VIsual_line_count <= 1)
! 		{
! 		    validate_virtcol();
! 		    curwin->w_curswant = curwin->w_virtcol
! 					+ resel_VIsual_vcol * cap->count0 - 1;
! 		}
  		else
! 		    curwin->w_curswant = resel_VIsual_vcol;
! 		coladvance(curwin->w_curswant);
  	    }
! 	    if (resel_VIsual_vcol == MAXCOL)
  	    {
  		curwin->w_curswant = MAXCOL;
  		coladvance((colnr_T)MAXCOL);
***************
*** 7645,7651 ****
  	    {
  		validate_virtcol();
  		curwin->w_curswant = curwin->w_virtcol
! 					 + resel_VIsual_col * cap->count0 - 1;
  		coladvance(curwin->w_curswant);
  	    }
  	    else
--- 7667,7673 ----
  	    {
  		validate_virtcol();
  		curwin->w_curswant = curwin->w_virtcol
! 					+ resel_VIsual_vcol * cap->count0 - 1;
  		coladvance(curwin->w_curswant);
  	    }
  	    else
*** ../vim-7.3.332/src/version.c	2011-10-04 18:03:43.000000000 +0200
--- src/version.c	2011-10-04 21:05:44.000000000 +0200
***************
*** 711,712 ****
--- 711,714 ----
  {   /* Add new patch number below this line */
+ /**/
+     333,
  /**/

-- 
It was recently discovered that research causes cancer in rats.

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
