Blob Blame History Raw
To: vim_dev@googlegroups.com
Subject: Patch 7.4.782
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.782
Problem:    Still a few problems with CTRL-A and CTRL-X in Visual mode.
Solution:   Fix the reported problems. (Christian Brabandt)
Files:      src/charset.c, src/eval.c, src/ex_cmds.c, src/ex_getln.c,
            src/misc2.c, src/normal.c, src/ops.c, src/option.c,
            src/proto/charset.pro, src/testdir/test_increment.in,
            src/testdir/test_increment.ok


*** ../vim-7.4.781/src/charset.c	2015-01-14 19:35:10.963756142 +0100
--- src/charset.c	2015-07-17 12:48:43.296898014 +0200
***************
*** 1835,1843 ****
   * octal number.
   * If "dohex" is non-zero recognize hex numbers, when > 1 always assume
   * hex number.
   */
      void
! vim_str2nr(start, hexp, len, dooct, dohex, nptr, unptr)
      char_u		*start;
      int			*hexp;	    /* return: type of number 0 = decimal, 'x'
  				       or 'X' is hex, '0' = octal */
--- 1835,1844 ----
   * octal number.
   * If "dohex" is non-zero recognize hex numbers, when > 1 always assume
   * hex number.
+  * If maxlen > 0, check at a maximum maxlen chars
   */
      void
! vim_str2nr(start, hexp, len, dooct, dohex, nptr, unptr, maxlen)
      char_u		*start;
      int			*hexp;	    /* return: type of number 0 = decimal, 'x'
  				       or 'X' is hex, '0' = octal */
***************
*** 1846,1851 ****
--- 1847,1853 ----
      int			dohex;	    /* recognize hex number */
      long		*nptr;	    /* return: signed result */
      unsigned long	*unptr;	    /* return: unsigned result */
+     int			maxlen;     /* max length of string to check */
  {
      char_u	    *ptr = start;
      int		    hex = 0;		/* default is decimal */
***************
*** 1860,1869 ****
      }
  
      /* Recognize hex and octal. */
!     if (ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9')
      {
  	hex = ptr[1];
! 	if (dohex && (hex == 'X' || hex == 'x') && vim_isxdigit(ptr[2]))
  	    ptr += 2;			/* hexadecimal */
  	else
  	{
--- 1862,1873 ----
      }
  
      /* Recognize hex and octal. */
!     if (ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9'
! 					       && (maxlen == 0 || maxlen > 1))
      {
  	hex = ptr[1];
! 	if (dohex && (hex == 'X' || hex == 'x') && vim_isxdigit(ptr[2])
! 					       && (maxlen == 0 || maxlen > 2))
  	    ptr += 2;			/* hexadecimal */
  	else
  	{
***************
*** 1880,1885 ****
--- 1884,1891 ----
  		    }
  		    if (ptr[n] >= '0')
  			hex = '0';	/* assume octal */
+ 		    if (n == maxlen)
+ 			break;
  		}
  	    }
  	}
***************
*** 1888,1893 ****
--- 1894,1900 ----
      /*
       * Do the string-to-numeric conversion "manually" to avoid sscanf quirks.
       */
+     n = 1;
      if (hex == '0' || dooct > 1)
      {
  	/* octal */
***************
*** 1895,1900 ****
--- 1902,1909 ----
  	{
  	    un = 8 * un + (unsigned long)(*ptr - '0');
  	    ++ptr;
+ 	    if (n++ == maxlen)
+ 		break;
  	}
      }
      else if (hex != 0 || dohex > 1)
***************
*** 1904,1909 ****
--- 1913,1920 ----
  	{
  	    un = 16 * un + (unsigned long)hex2nr(*ptr);
  	    ++ptr;
+ 	    if (n++ == maxlen)
+ 		break;
  	}
      }
      else
***************
*** 1913,1918 ****
--- 1924,1931 ----
  	{
  	    un = 10 * un + (unsigned long)(*ptr - '0');
  	    ++ptr;
+ 	    if (n++ == maxlen)
+ 		break;
  	}
      }
  
*** ../vim-7.4.781/src/eval.c	2015-07-10 17:56:18.219777154 +0200
--- src/eval.c	2015-07-17 12:45:16.778860576 +0200
***************
*** 1615,1621 ****
  	    len = 0;
  	else
  	    /* Recognize a number argument, the others must be strings. */
! 	    vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, &n, NULL);
  	if (len != 0 && len == (int)STRLEN(argv[i]))
  	{
  	    argvars[i].v_type = VAR_NUMBER;
--- 1615,1621 ----
  	    len = 0;
  	else
  	    /* Recognize a number argument, the others must be strings. */
! 	    vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, &n, NULL, 0);
  	if (len != 0 && len == (int)STRLEN(argv[i]))
  	{
  	    argvars[i].v_type = VAR_NUMBER;
***************
*** 5128,5134 ****
  		else
  #endif
  		{
! 		    vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL);
  		    *arg += len;
  		    if (evaluate)
  		    {
--- 5128,5134 ----
  		else
  #endif
  		{
! 		    vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL, 0);
  		    *arg += len;
  		    if (evaluate)
  		    {
***************
*** 18233,18239 ****
      p = skipwhite(get_tv_string(&argvars[0]));
      if (*p == '+')
  	p = skipwhite(p + 1);
!     vim_str2nr(p, NULL, NULL, base == 8 ? 2 : 0, base == 16 ? 2 : 0, &n, NULL);
      rettv->vval.v_number = n;
  }
  
--- 18233,18239 ----
      p = skipwhite(get_tv_string(&argvars[0]));
      if (*p == '+')
  	p = skipwhite(p + 1);
!     vim_str2nr(p, NULL, NULL, base == 8 ? 2 : 0, base == 16 ? 2 : 0, &n, NULL, 0);
      rettv->vval.v_number = n;
  }
  
***************
*** 21039,21045 ****
  	case VAR_STRING:
  	    if (varp->vval.v_string != NULL)
  		vim_str2nr(varp->vval.v_string, NULL, NULL,
! 							TRUE, TRUE, &n, NULL);
  	    return n;
  	case VAR_LIST:
  	    EMSG(_("E745: Using a List as a Number"));
--- 21039,21045 ----
  	case VAR_STRING:
  	    if (varp->vval.v_string != NULL)
  		vim_str2nr(varp->vval.v_string, NULL, NULL,
! 						    TRUE, TRUE, &n, NULL, 0);
  	    return n;
  	case VAR_LIST:
  	    EMSG(_("E745: Using a List as a Number"));
*** ../vim-7.4.781/src/ex_cmds.c	2015-05-04 10:45:57.288481610 +0200
--- src/ex_cmds.c	2015-07-17 12:45:16.782860538 +0200
***************
*** 500,506 ****
  		nrs[lnum - eap->line1].start_col_nr = -MAXLNUM;
  	    else
  		vim_str2nr(s, NULL, NULL, sort_oct, sort_hex,
! 				  &nrs[lnum - eap->line1].start_col_nr, NULL);
  	    *s2 = c;
  	}
  	else
--- 500,506 ----
  		nrs[lnum - eap->line1].start_col_nr = -MAXLNUM;
  	    else
  		vim_str2nr(s, NULL, NULL, sort_oct, sort_hex,
! 				  &nrs[lnum - eap->line1].start_col_nr, NULL, 0);
  	    *s2 = c;
  	}
  	else
*** ../vim-7.4.781/src/ex_getln.c	2015-06-25 18:20:30.437271806 +0200
--- src/ex_getln.c	2015-07-17 12:45:16.782860538 +0200
***************
*** 5917,5923 ****
      *str = skipwhite(*str);
      if (**str == '-' || vim_isdigit(**str))  /* parse "from" part of range */
      {
! 	vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL);
  	*str += len;
  	*num1 = (int)num;
  	first = TRUE;
--- 5917,5923 ----
      *str = skipwhite(*str);
      if (**str == '-' || vim_isdigit(**str))  /* parse "from" part of range */
      {
! 	vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL, 0);
  	*str += len;
  	*num1 = (int)num;
  	first = TRUE;
***************
*** 5926,5932 ****
      if (**str == ',')			/* parse "to" part of range */
      {
  	*str = skipwhite(*str + 1);
! 	vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL);
  	if (len > 0)
  	{
  	    *num2 = (int)num;
--- 5926,5932 ----
      if (**str == ',')			/* parse "to" part of range */
      {
  	*str = skipwhite(*str + 1);
! 	vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL, 0);
  	if (len > 0)
  	{
  	    *num2 = (int)num;
*** ../vim-7.4.781/src/misc2.c	2015-04-21 14:02:28.489694393 +0200
--- src/misc2.c	2015-07-17 12:45:16.782860538 +0200
***************
*** 2813,2819 ****
  	    bp += 3;	/* skip t_xx, xx may be '-' or '>' */
  	else if (STRNICMP(bp, "char-", 5) == 0)
  	{
! 	    vim_str2nr(bp + 5, NULL, &l, TRUE, TRUE, NULL, NULL);
  	    bp += l + 5;
  	    break;
  	}
--- 2813,2819 ----
  	    bp += 3;	/* skip t_xx, xx may be '-' or '>' */
  	else if (STRNICMP(bp, "char-", 5) == 0)
  	{
! 	    vim_str2nr(bp + 5, NULL, &l, TRUE, TRUE, NULL, NULL, 0);
  	    bp += l + 5;
  	    break;
  	}
***************
*** 2845,2851 ****
  						 && VIM_ISDIGIT(last_dash[6]))
  	    {
  		/* <Char-123> or <Char-033> or <Char-0x33> */
! 		vim_str2nr(last_dash + 6, NULL, NULL, TRUE, TRUE, NULL, &n);
  		key = (int)n;
  	    }
  	    else
--- 2845,2851 ----
  						 && VIM_ISDIGIT(last_dash[6]))
  	    {
  		/* <Char-123> or <Char-033> or <Char-0x33> */
! 		vim_str2nr(last_dash + 6, NULL, NULL, TRUE, TRUE, NULL, &n, 0);
  		key = (int)n;
  	    }
  	    else
*** ../vim-7.4.781/src/normal.c	2015-07-03 12:44:01.735748596 +0200
--- src/normal.c	2015-07-17 12:49:38.748371068 +0200
***************
*** 40,45 ****
--- 40,46 ----
  static void	find_end_of_word __ARGS((pos_T *));
  static int	get_mouse_class __ARGS((char_u *p));
  #endif
+ static void	prep_redo_visual __ARGS((cmdarg_T *cap));
  static void	prep_redo_cmd __ARGS((cmdarg_T *cap));
  static void	prep_redo __ARGS((int regname, long, int, int, int, int, int));
  static int	checkclearop __ARGS((oparg_T *oap));
***************
*** 3613,3618 ****
--- 3614,3656 ----
  }
  
  /*
+  * Add commands to reselect Visual mode into the redo buffer.
+  */
+     static void
+ prep_redo_visual(cap)
+     cmdarg_T *cap;
+ {
+     ResetRedobuff();
+     AppendCharToRedobuff(VIsual_mode);
+     if (VIsual_mode == 'V' && curbuf->b_visual.vi_end.lnum
+ 					    != curbuf->b_visual.vi_start.lnum)
+     {
+ 	AppendNumberToRedobuff(curbuf->b_visual.vi_end.lnum
+ 					    - curbuf->b_visual.vi_start.lnum);
+ 	AppendCharToRedobuff('j');
+     }
+     else if (VIsual_mode == 'v' || VIsual_mode == Ctrl_V)
+     {
+ 	/* block visual mode or char visual mmode*/
+ 	if (curbuf->b_visual.vi_end.lnum != curbuf->b_visual.vi_start.lnum)
+ 	{
+ 	    AppendNumberToRedobuff(curbuf->b_visual.vi_end.lnum -
+ 		    curbuf->b_visual.vi_start.lnum);
+ 	    AppendCharToRedobuff('j');
+ 	}
+ 	if (curbuf->b_visual.vi_curswant == MAXCOL)
+ 	    AppendCharToRedobuff('$');
+ 	else if (curbuf->b_visual.vi_end.col > curbuf->b_visual.vi_start.col)
+ 	{
+ 	    AppendNumberToRedobuff(curbuf->b_visual.vi_end.col
+ 					 - curbuf->b_visual.vi_start.col - 1);
+ 	    AppendCharToRedobuff(' ');
+ 	}
+     }
+     AppendNumberToRedobuff(cap->count1);
+ }
+ 
+ /*
   * Prepare for redo of a normal command.
   */
      static void
***************
*** 4207,4222 ****
      {
  	if (visual)
  	{
! 	    ResetRedobuff();
! 	    AppendCharToRedobuff(VIsual_mode);
! 	    if (VIsual_mode == 'V')
! 	    {
! 		AppendNumberToRedobuff(cap->oap->line_count);
! 		AppendCharToRedobuff('j');
! 	    }
! 	    AppendNumberToRedobuff(cap->count1);
! 	    if (cap->nchar != NUL)
! 		AppendCharToRedobuff(cap->nchar);
  	    AppendCharToRedobuff(cap->cmdchar);
  	}
  	else
--- 4245,4253 ----
      {
  	if (visual)
  	{
! 	    prep_redo_visual(cap);
! 	    if (cap->arg)
! 		AppendCharToRedobuff('g');
  	    AppendCharToRedobuff(cap->cmdchar);
  	}
  	else
***************
*** 4227,4233 ****
      if (visual)
      {
  	VIsual_active = FALSE;
! 	redraw_later(CLEAR);
      }
  }
  
--- 4258,4265 ----
      if (visual)
      {
  	VIsual_active = FALSE;
! 	redo_VIsual_busy = FALSE;
! 	redraw_later(INVERTED);
      }
  }
  
*** ../vim-7.4.781/src/ops.c	2015-07-12 16:21:17.791908408 +0200
--- src/ops.c	2015-07-17 12:58:11.083502711 +0200
***************
*** 5405,5410 ****
--- 5405,5412 ----
      int		lnume = curwin->w_cursor.lnum;
      int		startcol = 0;
      int		did_change = FALSE;
+     pos_T	t = curwin->w_cursor;
+     int		maxlen = 0;
  
      dohex = (vim_strchr(curbuf->b_p_nf, 'x') != NULL);	/* "heX" */
      dooct = (vim_strchr(curbuf->b_p_nf, 'o') != NULL);	/* "Octal" */
***************
*** 5418,5438 ****
      {
  	if (lt(curwin->w_cursor, VIsual))
  	{
- 	    pos_T t;
- 	    t = curwin->w_cursor;
  	    curwin->w_cursor = VIsual;
  	    VIsual = t;
  	}
- 	if (VIsual_mode == 'V')
- 	    VIsual.col = 0;
  
  	ptr = ml_get(VIsual.lnum);
  	RLADDSUBFIX(ptr);
  
  	/* store visual area for 'gv' */
  	curbuf->b_visual.vi_start = VIsual;
  	curbuf->b_visual.vi_end = curwin->w_cursor;
  	curbuf->b_visual.vi_mode = VIsual_mode;
  
  	if (VIsual_mode != 'v')
  	    startcol = VIsual.col < curwin->w_cursor.col ? VIsual.col
--- 5420,5449 ----
      {
  	if (lt(curwin->w_cursor, VIsual))
  	{
  	    curwin->w_cursor = VIsual;
  	    VIsual = t;
  	}
  
  	ptr = ml_get(VIsual.lnum);
  	RLADDSUBFIX(ptr);
+ 	if (VIsual_mode == 'V')
+ 	{
+ 	    VIsual.col = 0;
+ 	    curwin->w_cursor.col = STRLEN(ptr);
+ 	}
+ 	else if (VIsual_mode == Ctrl_V &&
+ 		VIsual.col > curwin->w_cursor.col)
+ 	{
+ 	    t = VIsual;
+ 	    VIsual.col = curwin->w_cursor.col;
+ 	    curwin->w_cursor.col = t.col;
+ 	}
  
  	/* store visual area for 'gv' */
  	curbuf->b_visual.vi_start = VIsual;
  	curbuf->b_visual.vi_end = curwin->w_cursor;
  	curbuf->b_visual.vi_mode = VIsual_mode;
+ 	curbuf->b_visual.vi_curswant = curwin->w_curswant;
  
  	if (VIsual_mode != 'v')
  	    startcol = VIsual.col < curwin->w_cursor.col ? VIsual.col
***************
*** 5482,5517 ****
  
      for (i = lnum; i <= lnume; i++)
      {
  	curwin->w_cursor.lnum = i;
  	ptr = ml_get_curline();
  	if ((int)STRLEN(ptr) <= col)
  	    /* try again on next line */
  	    continue;
  	if (visual && ptr[col] == '-')
  	{
  	    negative = TRUE;
  	    was_positive = FALSE;
  	    col++;
  	}
- 	RLADDSUBFIX(ptr);
  	/*
  	 * If a number was found, and saving for undo works, replace the number.
  	 */
  	firstdigit = ptr[col];
- 	RLADDSUBFIX(ptr);
  	if ((!VIM_ISDIGIT(firstdigit) && !(doalp && ASCII_ISALPHA(firstdigit)))
  		|| u_save_cursor() != OK)
  	{
  	    if (lnum < lnume)
  		/* Try again on next line */
  		continue;
  	    beep_flush();
  	    return FAIL;
  	}
  
- 	ptr = ml_get_curline();
- 	RLADDSUBFIX(ptr);
- 
  	if (doalp && ASCII_ISALPHA(firstdigit))
  	{
  	    /* decrement or increment alphabetic character */
--- 5493,5552 ----
  
      for (i = lnum; i <= lnume; i++)
      {
+ 	t = curwin->w_cursor;
  	curwin->w_cursor.lnum = i;
  	ptr = ml_get_curline();
+ 	RLADDSUBFIX(ptr);
  	if ((int)STRLEN(ptr) <= col)
  	    /* try again on next line */
  	    continue;
+ 	if (visual)
+ 	{
+ 	    if (doalp) /* search for ascii chars */
+ 	    {
+ 		while (!ASCII_ISALPHA(ptr[col]) && ptr[col])
+ 		    col++;
+ 	    }
+ 	    /* skip to first digit, but allow for leading '-' */
+ 	    else if (dohex)
+ 	    {
+ 		while (!(vim_isxdigit(ptr[col]) || (ptr[col] == '-'
+ 				    && vim_isxdigit(ptr[col+1]))) && ptr[col])
+ 		    col++;
+ 	    }
+ 	    else /* decimal */
+ 	    {
+ 		while (!(vim_isdigit(ptr[col]) || (ptr[col] == '-'
+ 				     && vim_isdigit(ptr[col+1]))) && ptr[col])
+ 		    col++;
+ 	    }
+ 	}
  	if (visual && ptr[col] == '-')
  	{
  	    negative = TRUE;
  	    was_positive = FALSE;
  	    col++;
  	}
  	/*
  	 * If a number was found, and saving for undo works, replace the number.
  	 */
  	firstdigit = ptr[col];
  	if ((!VIM_ISDIGIT(firstdigit) && !(doalp && ASCII_ISALPHA(firstdigit)))
  		|| u_save_cursor() != OK)
  	{
  	    if (lnum < lnume)
+ 	    {
+ 		if (visual && VIsual_mode != Ctrl_V)
+ 		    col = 0;
+ 		else
+ 		    col = startcol;
  		/* Try again on next line */
  		continue;
+ 	    }
  	    beep_flush();
  	    return FAIL;
  	}
  
  	if (doalp && ASCII_ISALPHA(firstdigit))
  	{
  	    /* decrement or increment alphabetic character */
***************
*** 5560,5568 ****
  		--col;
  		negative = TRUE;
  	    }
- 
  	    /* get the number value (unsigned) */
! 	    vim_str2nr(ptr + col, &hex, &length, dooct, dohex, NULL, &n);
  
  	    /* ignore leading '-' for hex and octal numbers */
  	    if (hex && negative)
--- 5595,5621 ----
  		--col;
  		negative = TRUE;
  	    }
  	    /* get the number value (unsigned) */
! 	    if (visual && VIsual_mode != 'V')
! 	    {
! 		if (VIsual_mode == 'v')
! 		{
! 		    if (i == lnum)
! 			maxlen = (lnum == lnume
! 					    ? curwin->w_cursor.col - col + 1
! 					    : (int)STRLEN(ptr) - col);
! 		    else
! 			maxlen = (i == lnume ? curwin->w_cursor.col - col  + 1
! 					     : (int)STRLEN(ptr) - col);
! 		}
! 		else if (VIsual_mode == Ctrl_V)
! 		    maxlen = (curbuf->b_visual.vi_curswant == MAXCOL
! 					?  (int)STRLEN(ptr) - col
! 					: curwin->w_cursor.col - col + 1);
! 	    }
! 
! 	    vim_str2nr(ptr + col, &hex, &length, dooct, dohex, NULL, &n,
! 								      maxlen);
  
  	    /* ignore leading '-' for hex and octal numbers */
  	    if (hex && negative)
***************
*** 5609,5615 ****
  		    negative = FALSE;
  	    }
  
! 	    if (visual && !was_positive && !negative)
  	    {
  		/* need to remove the '-' */
  		col--;
--- 5662,5668 ----
  		    negative = FALSE;
  	    }
  
! 	    if (visual && !was_positive && !negative && col > 0)
  	    {
  		/* need to remove the '-' */
  		col--;
***************
*** 5695,5700 ****
--- 5748,5757 ----
  	    STRCAT(buf1, buf2);
  	    ins_str(buf1);		/* insert the new number */
  	    vim_free(buf1);
+ 	    if (lnum < lnume)
+ 		curwin->w_cursor.col = t.col;
+ 	    else if (did_change && curwin->w_cursor.col)
+ 		--curwin->w_cursor.col;
  	}
  
  	if (g_cmd)
***************
*** 5705,5710 ****
--- 5762,5768 ----
  	/* reset */
  	subtract = FALSE;
  	negative = FALSE;
+ 	was_positive = TRUE;
  	if (visual && VIsual_mode == Ctrl_V)
  	    col = startcol;
  	else
***************
*** 5716,5723 ****
  	RLADDSUBFIX(ptr);
  #endif
      }
!     if (did_change && curwin->w_cursor.col > 0)
! 	--curwin->w_cursor.col;
      return OK;
  }
  
--- 5774,5782 ----
  	RLADDSUBFIX(ptr);
  #endif
      }
!     if (visual)
! 	/* cursor at the top of the selection */
! 	curwin->w_cursor = VIsual;
      return OK;
  }
  
*** ../vim-7.4.781/src/option.c	2015-07-10 18:18:35.579206260 +0200
--- src/option.c	2015-07-17 12:45:16.786860499 +0200
***************
*** 4561,4567 ****
  			{
  			    /* Allow negative (for 'undolevels'), octal and
  			     * hex numbers. */
! 			    vim_str2nr(arg, NULL, &i, TRUE, TRUE, &value, NULL);
  			    if (arg[i] != NUL && !vim_iswhite(arg[i]))
  			    {
  				errmsg = e_invarg;
--- 4561,4567 ----
  			{
  			    /* Allow negative (for 'undolevels'), octal and
  			     * hex numbers. */
! 			    vim_str2nr(arg, NULL, &i, TRUE, TRUE, &value, NULL, 0);
  			    if (arg[i] != NUL && !vim_iswhite(arg[i]))
  			    {
  				errmsg = e_invarg;
*** ../vim-7.4.781/src/proto/charset.pro	2014-06-25 14:39:35.110348584 +0200
--- src/proto/charset.pro	2015-07-17 12:45:22.098810018 +0200
***************
*** 49,55 ****
  char_u *skiptowhite_esc __ARGS((char_u *p));
  long getdigits __ARGS((char_u **pp));
  int vim_isblankline __ARGS((char_u *lbuf));
! void vim_str2nr __ARGS((char_u *start, int *hexp, int *len, int dooct, int dohex, long *nptr, unsigned long *unptr));
  int hex2nr __ARGS((int c));
  int hexhex2nr __ARGS((char_u *p));
  int rem_backslash __ARGS((char_u *str));
--- 49,55 ----
  char_u *skiptowhite_esc __ARGS((char_u *p));
  long getdigits __ARGS((char_u **pp));
  int vim_isblankline __ARGS((char_u *lbuf));
! void vim_str2nr __ARGS((char_u *start, int *hexp, int *len, int dooct, int dohex, long *nptr, unsigned long *unptr, int strlen));
  int hex2nr __ARGS((int c));
  int hexhex2nr __ARGS((char_u *p));
  int rem_backslash __ARGS((char_u *str));
*** ../vim-7.4.781/src/testdir/test_increment.in	2015-07-03 12:44:01.735748596 +0200
--- src/testdir/test_increment.in	2015-07-17 12:45:27.426759384 +0200
***************
*** 185,190 ****
--- 185,267 ----
      1 0
      1 0
  
+ 13) visually selected part of columns
+ Text:
+ max: 100px
+ max: 200px
+ max: 300px
+ max: 400px
+     Expected:
+     1) 'v' on first two numbers Ctrl-A
+     max: 110px
+     max: 220px
+     max: 330px
+     max: 400px
+     2) 'v' on first two numbers Ctrl-X
+     max: 90px
+     max: 190px
+     max: 290px
+     max: 400px
+ 
+ 14) redo in block mode
+ Text:
+ 1 1
+ 1 1
+     Expected:
+     1) Ctrl-a on first column, redo on second column
+     2 2
+     2 2
+ 
+ 15) block select single numbers
+ Text:
+ 101
+     Expected:
+     1) Ctrl-a on visually selected zero
+     111
+ 
+ 16) increment right aligned numbers
+ Text:
+    1
+   19
+  119
+     Expected:
+     1) Ctrl-a on line selected region
+        2
+       20
+      120
+ 
+ 17) block-wise increment and redo
+ Text:
+   100
+   1
+ 
+   100
+   1
+ 
+   Expected:
+   1) Ctrl-V j $ on first block, afterwards '.' on second
+   101
+   2
+ 
+   101
+   2
+ 
+ 18) repeat of g<Ctrl-a>
+ Text:
+   0
+   0
+   0
+   0
+ 
+   Expected:
+   1) V 4j g<ctrl-a>, repeat twice afterwards with .
+   3
+   6
+   9
+   12
+   
+ 
+ 
  STARTTEST
  :so small.vim
  :"
***************
*** 200,215 ****
  f-v$:/^E1=/+5put a
  f1v$
  
! :" Test 22
  :/^S2=/+,/^E2=/-y a
  :/^E2=/+put a
! V3k$:.+put a
  V3k$
  
  :" Test 3
  :/^S3=/+,/^E3=/-y a
  :/^E3=/+put a
! V6k2g:.+put a
  V6k2g
  
  :" Test 4
--- 277,292 ----
  f-v$:/^E1=/+5put a
  f1v$
  
! :" Test 2
  :/^S2=/+,/^E2=/-y a
  :/^E2=/+put a
! V3k$3j:.+put a
  V3k$
  
  :" Test 3
  :/^S3=/+,/^E3=/-y a
  :/^E3=/+put a
! V6k2g6j:.+put a
  V6k2g
  
  :" Test 4
***************
*** 229,249 ****
  v3kg
  
  :" Test 7
  :/^S7=/+,/^E7=/-y a
  :/^E7=/+put a
! V4k:.+put a
  V4k
  
  :" Test 8
  :/^S8=/+,/^E8=/-y a
  :/^E8=/+put a
! kj$:.+put a
  k$+
  
  :" Test 9
  :/^S9=/+,/^E9=/-y a
  :/^E9=/+put a
! 5kVj22j.
  
  :" Test 10
  :/^S10=/+,/^E10=/-y a
--- 306,327 ----
  v3kg
  
  :" Test 7
+ :set nrformats&vim
  :/^S7=/+,/^E7=/-y a
  :/^E7=/+put a
! V4k4j:.+put a
  V4k
  
  :" Test 8
  :/^S8=/+,/^E8=/-y a
  :/^E8=/+put a
! kj$j:.+put a
  k$+
  
  :" Test 9
  :/^S9=/+,/^E9=/-y a
  :/^E9=/+put a
! 5kVj23j.
  
  :" Test 10
  :/^S10=/+,/^E10=/-y a
***************
*** 260,265 ****
--- 338,374 ----
  :/^E12=/+put a
  2k$v++
  
+ :" Test 13
+ :/^S13=/+,/^E13=/-y a
+ :/^E13=/+put a
+ 3kf1l2j3j:.+put a
+ 3kf1l2j
+ 
+ :" Test 14
+ :/^S14=/+,/^E14=/-y a
+ :/^E14=/+put a
+ kw.
+ 
+ :" Test 15
+ :/^S15=/+,/^E15=/-y a
+ :/^E15=/+put a
+ lv
+ 
+ :" Test 16
+ :/^S16=/+,/^E16=/-y a
+ :/^E16=/+put a
+ V3k
+ 
+ :" Test 17
+ :/^S17=/+,/^E17=/-y a
+ :/^E17=/+put a
+ 4kj$2j.
+ 
+ :" Test 18
+ :/^S18=/+,/^E18=/-y a
+ :/^E18=/+put a
+ V3kg..
+ 
  :" Save the report
  :/^# Test 1/,$w! test.out
  :qa!
***************
*** 384,389 ****
--- 493,549 ----
  
  
  
+ # Test 13
+ S13====
+ max: 100px
+ max: 200px
+ max: 300px
+ max: 400px
+ E13====
+ 
+ 
+ 
+ # Test 14
+ S14====
+ 1 1
+ 1 1
+ E14====
+ 
+ 
+ 
+ # Test 15
+ S15====
+ 101
+ E15====
+ 
+ 
+ 
+ # Test 16
+ S16====
+    1
+   19
+  119
+ E16====
+ 
+ 
+ 
+ # Test 17
+ S17====
+  100
+  1
+ 
+  100
+  1
+ E17====
+ 
+ 
+ # Test 18
+ S18====
+ 0
+ 0
+ 0
+ 0
+ E18====
  
  
  
*** ../vim-7.4.781/src/testdir/test_increment.ok	2015-07-03 12:44:01.739748554 +0200
--- src/testdir/test_increment.ok	2015-07-17 12:45:34.094696017 +0200
***************
*** 184,190 ****
  1 0
  
  
! 
  
  
  
--- 184,264 ----
  1 0
  
  
! # Test 13
! S13====
! max: 100px
! max: 200px
! max: 300px
! max: 400px
! E13====
! 
! max: 110px
! max: 210px
! max: 310px
! max: 400px
! 
! max: 90px
! max: 190px
! max: 290px
! max: 400px
! 
! # Test 14
! S14====
! 1 1
! 1 1
! E14====
! 
! 2 2
! 2 2
! 
! 
! # Test 15
! S15====
! 101
! E15====
! 
! 111
! 
! 
! # Test 16
! S16====
!    1
!   19
!  119
! E16====
! 
!    2
!   20
!  120
! 
! 
! # Test 17
! S17====
!  100
!  1
! 
!  100
!  1
! E17====
! 
!  101
!  2
! 
!  101
!  1
! 
! # Test 18
! S18====
! 0
! 0
! 0
! 0
! E18====
! 
! 3
! 6
! 9
! 12
  
  
  
*** ../vim-7.4.781/src/version.c	2015-07-12 17:52:50.728095726 +0200
--- src/version.c	2015-07-17 12:46:37.590092608 +0200
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     782,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
226. You sit down at the computer right after dinner and your spouse
     says "See you in the morning."

 /// 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    ///