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 -- [email protected] -- 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    ///

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui