Blob Blame History Raw
To: vim_dev@googlegroups.com
Subject: Patch 7.4.754
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.754
Problem:    Using CTRL-A in Visual mode does not work well. (Gary Johnson)
Solution:   Make it increment all numbers in the Visual area. (Christian
            Brabandt)
Files:      runtime/doc/change.txt, src/normal.c, src/ops.c,
            src/proto/ops.pro, src/testdir/Make_amiga.mak,
            src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
            src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
            src/testdir/Makefile, src/testdir/test_increment.in,
            src/testdir/test_increment.ok


*** ../vim-7.4.753/runtime/doc/change.txt	2015-01-27 18:43:42.134535513 +0100
--- runtime/doc/change.txt	2015-06-25 13:55:43.686428819 +0200
***************
*** 156,161 ****
--- 156,164 ----
  The 'B' and 'M' flags in 'formatoptions' change the behavior for inserting
  spaces before and after a multi-byte character |fo-table|.
  
+ The '[ mark is set at the end of the first line that was joined, '] at the end
+ of the resulting line.
+ 
  
  ==============================================================================
  2. Delete and insert				*delete-insert* *replacing*
***************
*** 376,385 ****
--- 379,421 ----
  CTRL-A			Add [count] to the number or alphabetic character at
  			or after the cursor.  {not in Vi}
  
+ 							*v_CTRL-A*
+ {Visual}CTRL-A		Add [count] to the number or alphabetic character in
+ 			the highlighted text.  {not in Vi}
+ 
+ 							*v_g_CTRL-A*
+ {Visual}g CTRL-A	Add [count] to the number or alphabetic character in
+ 			the highlighted text. If several lines are
+ 		        highlighted, each one will be incremented by an
+ 			additional [count] (so effectively creating a
+ 			[count] incrementing sequence).  {not in Vi}
+ 			For Example, if you have this list of numbers:
+ 				1. ~
+ 				1. ~
+ 				1. ~
+ 				1. ~
+ 			Move to the second "1." and Visually select three
+ 			lines, pressing g CTRL-A results in:
+ 				1. ~
+ 				2. ~
+ 				3. ~
+ 				4. ~
+ 
  							*CTRL-X*
  CTRL-X			Subtract [count] from the number or alphabetic
  			character at or after the cursor.  {not in Vi}
  
+ 							*v_CTRL-X*
+ {Visual}CTRL-X		Subtract [count] from the number or alphabetic
+ 			character in the highlighted text.  {not in Vi}
+ 
+ 							*v_g_CTRL-X*
+ {Visual}g CTRL-X	Subtract [count] from the number or alphabetic
+ 			character in the highlighted text. If several lines
+ 			are highlighted, each value will be decremented by an
+ 			additional [count] (so effectively creating a [count]
+ 			decrementing sequence).  {not in Vi}
+ 
  The CTRL-A and CTRL-X commands work for (signed) decimal numbers, unsigned
  octal and hexadecimal numbers and alphabetic characters.  This depends on the
  'nrformats' option.
***************
*** 396,401 ****
--- 432,440 ----
    under or after the cursor.  This is useful to make lists with an alphabetic
    index.
  
+ For decimals a leading negative sign is considered for incrementing/
+ decrementing, for octal and hey values, it won't be considered.
+ 
  For numbers with leading zeros (including all octal and hexadecimal numbers),
  Vim preserves the number of characters in the number when possible.  CTRL-A on
  "0077" results in "0100", CTRL-X on "0x100" results in "0x0ff".
*** ../vim-7.4.753/src/normal.c	2015-06-25 13:30:41.206095684 +0200
--- src/normal.c	2015-06-25 13:42:06.342924954 +0200
***************
*** 4201,4209 ****
  nv_addsub(cap)
      cmdarg_T	*cap;
  {
!     if (!checkclearopq(cap->oap)
! 	    && do_addsub((int)cap->cmdchar, cap->count1) == OK)
  	prep_redo_cmd(cap);
  }
  
  /*
--- 4201,4217 ----
  nv_addsub(cap)
      cmdarg_T	*cap;
  {
!     int visual = VIsual_active;
!     if (cap->oap->op_type == OP_NOP
! 	    && do_addsub((int)cap->cmdchar, cap->count1, cap->arg) == OK)
  	prep_redo_cmd(cap);
+     else
+ 	clearopbeep(cap->oap);
+     if (visual)
+     {
+ 	VIsual_active = FALSE;
+ 	redraw_later(CLEAR);
+     }
  }
  
  /*
***************
*** 7841,7854 ****
  
      switch (cap->nchar)
      {
  #ifdef MEM_PROFILE
      /*
       * "g^A": dump log of used memory.
       */
!     case Ctrl_A:
! 	vim_mem_profile_dump();
! 	break;
  #endif
  
  #ifdef FEAT_VREPLACE
      /*
--- 7849,7876 ----
  
      switch (cap->nchar)
      {
+     case Ctrl_A:
+     case Ctrl_X:
  #ifdef MEM_PROFILE
      /*
       * "g^A": dump log of used memory.
       */
! 	if (!VIsual_active && cap->nchar == Ctrl_A)
! 	    vim_mem_profile_dump();
! 	else
  #endif
+     /*
+      * "g^A/g^X": sequentially increment visually selected region
+      */
+ 	     if (VIsual_active)
+ 	{
+ 	    cap->arg = TRUE;
+ 	    cap->cmdchar = cap->nchar;
+ 	    nv_addsub(cap);
+ 	}
+ 	else
+ 	    clearopbeep(oap);
+ 	break;
  
  #ifdef FEAT_VREPLACE
      /*
*** ../vim-7.4.753/src/ops.c	2015-06-19 15:17:49.891065610 +0200
--- src/ops.c	2015-06-25 13:44:44.285272132 +0200
***************
*** 5375,5383 ****
   * return FAIL for failure, OK otherwise
   */
      int
! do_addsub(command, Prenum1)
      int		command;
      linenr_T	Prenum1;
  {
      int		col;
      char_u	*buf1;
--- 5375,5384 ----
   * return FAIL for failure, OK otherwise
   */
      int
! do_addsub(command, Prenum1, g_cmd)
      int		command;
      linenr_T	Prenum1;
+     int		g_cmd;		    /* was g<c-a>/g<c-x> */
  {
      int		col;
      char_u	*buf1;
***************
*** 5385,5390 ****
--- 5386,5392 ----
      int		hex;		/* 'X' or 'x': hex; '0': octal */
      static int	hexupper = FALSE;	/* 0xABC */
      unsigned long n;
+     long	offset = 0;		/* line offset for Ctrl_V mode */
      long_u	oldn;
      char_u	*ptr;
      int		c;
***************
*** 5394,5640 ****
      int		dooct;
      int		doalp;
      int		firstdigit;
-     int		negative;
      int		subtract;
  
      dohex = (vim_strchr(curbuf->b_p_nf, 'x') != NULL);	/* "heX" */
      dooct = (vim_strchr(curbuf->b_p_nf, 'o') != NULL);	/* "Octal" */
      doalp = (vim_strchr(curbuf->b_p_nf, 'p') != NULL);	/* "alPha" */
  
-     ptr = ml_get_curline();
-     RLADDSUBFIX(ptr);
- 
      /*
       * First check if we are on a hexadecimal number, after the "0x".
       */
      col = curwin->w_cursor.col;
!     if (dohex)
! 	while (col > 0 && vim_isxdigit(ptr[col]))
! 	    --col;
!     if (       dohex
! 	    && col > 0
! 	    && (ptr[col] == 'X'
! 		|| ptr[col] == 'x')
! 	    && ptr[col - 1] == '0'
! 	    && vim_isxdigit(ptr[col + 1]))
      {
! 	/*
! 	 * Found hexadecimal number, move to its start.
! 	 */
! 	--col;
      }
      else
      {
! 	/*
! 	 * Search forward and then backward to find the start of number.
! 	 */
! 	col = curwin->w_cursor.col;
  
! 	while (ptr[col] != NUL
! 		&& !vim_isdigit(ptr[col])
! 		&& !(doalp && ASCII_ISALPHA(ptr[col])))
! 	    ++col;
! 
! 	while (col > 0
! 		&& vim_isdigit(ptr[col - 1])
! 		&& !(doalp && ASCII_ISALPHA(ptr[col])))
  	    --col;
      }
  
!     /*
!      * 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)
      {
! 	beep_flush();
! 	return FAIL;
!     }
  
!     /* get ptr again, because u_save() may have changed it */
!     ptr = ml_get_curline();
!     RLADDSUBFIX(ptr);
  
!     if (doalp && ASCII_ISALPHA(firstdigit))
!     {
! 	/* decrement or increment alphabetic character */
! 	if (command == Ctrl_X)
  	{
! 	    if (CharOrd(firstdigit) < Prenum1)
  	    {
! 		if (isupper(firstdigit))
! 		    firstdigit = 'A';
  		else
- 		    firstdigit = 'a';
- 	    }
- 	    else
  #ifdef EBCDIC
! 		firstdigit = EBCDIC_CHAR_ADD(firstdigit, -Prenum1);
  #else
! 		firstdigit -= Prenum1;
  #endif
- 	}
- 	else
- 	{
- 	    if (26 - CharOrd(firstdigit) - 1 < Prenum1)
- 	    {
- 		if (isupper(firstdigit))
- 		    firstdigit = 'Z';
- 		else
- 		    firstdigit = 'z';
  	    }
  	    else
  #ifdef EBCDIC
! 		firstdigit = EBCDIC_CHAR_ADD(firstdigit, Prenum1);
  #else
! 		firstdigit += Prenum1;
  #endif
  	}
! 	curwin->w_cursor.col = col;
! 	(void)del_char(FALSE);
! 	ins_char(firstdigit);
!     }
!     else
!     {
! 	negative = FALSE;
! 	if (col > 0 && ptr[col - 1] == '-')	    /* negative number */
  	{
! 	    --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)
! 	{
! 	    ++col;
! 	    --length;
! 	    negative = FALSE;
! 	}
  
! 	/* add or subtract */
! 	subtract = FALSE;
! 	if (command == Ctrl_X)
! 	    subtract ^= TRUE;
! 	if (negative)
! 	    subtract ^= TRUE;
! 
! 	oldn = n;
! 	if (subtract)
! 	    n -= (unsigned long)Prenum1;
! 	else
! 	    n += (unsigned long)Prenum1;
  
! 	/* handle wraparound for decimal numbers */
! 	if (!hex)
! 	{
  	    if (subtract)
  	    {
! 		if (n > oldn)
  		{
! 		    n = 1 + (n ^ (unsigned long)-1);
! 		    negative ^= TRUE;
  		}
  	    }
! 	    else /* add */
  	    {
! 		if (n < oldn)
  		{
! 		    n = (n ^ (unsigned long)-1);
! 		    negative ^= TRUE;
  		}
  	    }
- 	    if (n == 0)
- 		negative = FALSE;
- 	}
  
! 	/*
! 	 * Delete the old number.
! 	 */
! 	curwin->w_cursor.col = col;
! 	todel = length;
! 	c = gchar_cursor();
! 	/*
! 	 * Don't include the '-' in the length, only the length of the part
! 	 * after it is kept the same.
! 	 */
! 	if (c == '-')
! 	    --length;
! 	while (todel-- > 0)
! 	{
! 	    if (c < 0x100 && isalpha(c))
  	    {
! 		if (isupper(c))
! 		    hexupper = TRUE;
! 		else
! 		    hexupper = FALSE;
  	    }
- 	    /* del_char() will mark line needing displaying */
- 	    (void)del_char(FALSE);
- 	    c = gchar_cursor();
- 	}
  
! 	/*
! 	 * Prepare the leading characters in buf1[].
! 	 * When there are many leading zeros it could be very long.  Allocate
! 	 * a bit too much.
! 	 */
! 	buf1 = alloc((unsigned)length + NUMBUFLEN);
! 	if (buf1 == NULL)
! 	    return FAIL;
! 	ptr = buf1;
! 	if (negative)
! 	{
! 	    *ptr++ = '-';
! 	}
! 	if (hex)
! 	{
! 	    *ptr++ = '0';
! 	    --length;
! 	}
! 	if (hex == 'x' || hex == 'X')
! 	{
! 	    *ptr++ = hex;
! 	    --length;
! 	}
  
! 	/*
! 	 * Put the number characters in buf2[].
! 	 */
! 	if (hex == 0)
! 	    sprintf((char *)buf2, "%lu", n);
! 	else if (hex == '0')
! 	    sprintf((char *)buf2, "%lo", n);
! 	else if (hex && hexupper)
! 	    sprintf((char *)buf2, "%lX", n);
! 	else
! 	    sprintf((char *)buf2, "%lx", n);
! 	length -= (int)STRLEN(buf2);
  
! 	/*
! 	 * Adjust number of zeros to the new number of digits, so the
! 	 * total length of the number remains the same.
! 	 * Don't do this when
! 	 * the result may look like an octal number.
! 	 */
! 	if (firstdigit == '0' && !(dooct && hex == 0))
! 	    while (length-- > 0)
! 		*ptr++ = '0';
! 	*ptr = NUL;
! 	STRCAT(buf1, buf2);
! 	ins_str(buf1);		/* insert the new number */
! 	vim_free(buf1);
!     }
!     --curwin->w_cursor.col;
!     curwin->w_set_curswant = TRUE;
  #ifdef FEAT_RIGHTLEFT
!     ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum, TRUE);
!     RLADDSUBFIX(ptr);
  #endif
      return OK;
  }
  
--- 5396,5697 ----
      int		dooct;
      int		doalp;
      int		firstdigit;
      int		subtract;
+     int		negative = FALSE;
+     int		visual = VIsual_active;
+     int		i;
+     int		lnum = curwin->w_cursor.lnum;
+     int		lnume = curwin->w_cursor.lnum;
  
      dohex = (vim_strchr(curbuf->b_p_nf, 'x') != NULL);	/* "heX" */
      dooct = (vim_strchr(curbuf->b_p_nf, 'o') != NULL);	/* "Octal" */
      doalp = (vim_strchr(curbuf->b_p_nf, 'p') != NULL);	/* "alPha" */
  
      /*
       * First check if we are on a hexadecimal number, after the "0x".
       */
      col = curwin->w_cursor.col;
!     if (VIsual_active)
      {
! 	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;
! 
! 	col = VIsual.col;
! 	lnum = VIsual.lnum;
! 	lnume = curwin->w_cursor.lnum;
! 	if (ptr[col] == '-')
! 	{
! 	    negative = TRUE;
! 	    col++;
! 	}
      }
      else
      {
! 	ptr = ml_get_curline();
! 	RLADDSUBFIX(ptr);
  
! 	if (dohex)
! 	    while (col > 0 && vim_isxdigit(ptr[col]))
! 		--col;
! 	if (       dohex
! 		&& col > 0
! 		&& (ptr[col] == 'X'
! 		    || ptr[col] == 'x')
! 		&& ptr[col - 1] == '0'
! 		&& vim_isxdigit(ptr[col + 1]))
! 	{
! 	    /* Found hexadecimal number, move to its start. */
  	    --col;
+ 	}
+ 	else
+ 	{
+ 	    /*
+ 	     * Search forward and then backward to find the start of number.
+ 	     */
+ 	    col = curwin->w_cursor.col;
+ 
+ 	    while (ptr[col] != NUL
+ 		    && !vim_isdigit(ptr[col])
+ 		    && !(doalp && ASCII_ISALPHA(ptr[col])))
+ 		++col;
+ 
+ 	    while (col > 0
+ 		    && vim_isdigit(ptr[col - 1])
+ 		    && !(doalp && ASCII_ISALPHA(ptr[col])))
+ 		--col;
+ 	}
      }
  
!     for (i = lnum; i <= lnume; i++)
      {
! 	curwin->w_cursor.lnum = i;
! 	ptr = ml_get_curline();
! 	RLADDSUBFIX(ptr);
! 	if ((int)STRLEN(ptr) <= col)
! 	    col = 0;
! 	/*
! 	 * 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 */
! 	    if (command == Ctrl_X)
  	    {
! 		if (CharOrd(firstdigit) < Prenum1)
! 		{
! 		    if (isupper(firstdigit))
! 			firstdigit = 'A';
! 		    else
! 			firstdigit = 'a';
! 		}
  		else
  #ifdef EBCDIC
! 		    firstdigit = EBCDIC_CHAR_ADD(firstdigit, -Prenum1);
  #else
! 		    firstdigit -= Prenum1;
  #endif
  	    }
  	    else
+ 	    {
+ 		if (26 - CharOrd(firstdigit) - 1 < Prenum1)
+ 		{
+ 		    if (isupper(firstdigit))
+ 			firstdigit = 'Z';
+ 		    else
+ 			firstdigit = 'z';
+ 		}
+ 		else
  #ifdef EBCDIC
! 		    firstdigit = EBCDIC_CHAR_ADD(firstdigit, Prenum1);
  #else
! 		    firstdigit += Prenum1;
  #endif
+ 	    }
+ 	    curwin->w_cursor.col = col;
+ 	    (void)del_char(FALSE);
+ 	    ins_char(firstdigit);
  	}
! 	else
  	{
! 	    if (col > 0 && ptr[col - 1] == '-' && !visual)
! 	    {
! 		/* negative number */
! 		--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)
! 	    {
! 		++col;
! 		--length;
! 		negative = FALSE;
! 	    }
  
! 	    /* add or subtract */
! 	    subtract = FALSE;
! 	    if (command == Ctrl_X)
! 		subtract ^= TRUE;
! 	    if (negative)
! 		subtract ^= TRUE;
  
! 	    oldn = n;
  	    if (subtract)
+ 		n -= (unsigned long)Prenum1;
+ 	    else
+ 		n += (unsigned long)Prenum1;
+ 
+ 	    /* handle wraparound for decimal numbers */
+ 	    if (!hex)
  	    {
! 		if (subtract)
! 		{
! 		    if (n > oldn)
! 		    {
! 			n = 1 + (n ^ (unsigned long)-1);
! 			negative ^= TRUE;
! 		    }
! 		}
! 		else
  		{
! 		    /* add */
! 		    if (n < oldn)
! 		    {
! 			n = (n ^ (unsigned long)-1);
! 			negative ^= TRUE;
! 		    }
  		}
+ 		if (n == 0)
+ 		    negative = FALSE;
  	    }
! 
! 	    /*
! 	     * Delete the old number.
! 	     */
! 	    curwin->w_cursor.col = col;
! 	    todel = length;
! 	    c = gchar_cursor();
! 
! 	    /*
! 	     * Don't include the '-' in the length, only the length of the
! 	     * part after it is kept the same.
! 	     */
! 	    if (c == '-')
! 		--length;
! 	    while (todel-- > 0)
  	    {
! 		if (c < 0x100 && isalpha(c))
  		{
! 		    if (isupper(c))
! 			hexupper = TRUE;
! 		    else
! 			hexupper = FALSE;
  		}
+ 		/* del_char() will mark line needing displaying */
+ 		(void)del_char(FALSE);
+ 		c = gchar_cursor();
  	    }
  
! 	    /*
! 	     * Prepare the leading characters in buf1[].
! 	     * When there are many leading zeros it could be very long.
! 	     * Allocate a bit too much.
! 	     */
! 	    buf1 = alloc((unsigned)length + NUMBUFLEN);
! 	    if (buf1 == NULL)
! 		return FAIL;
! 	    ptr = buf1;
! 	    /* do not add leading '-' for visual mode */
! 	    if (negative && !visual)
  	    {
! 		*ptr++ = '-';
! 	    }
! 	    if (hex)
! 	    {
! 		*ptr++ = '0';
! 		--length;
! 	    }
! 	    if (hex == 'x' || hex == 'X')
! 	    {
! 		*ptr++ = hex;
! 		--length;
  	    }
  
! 	    /*
! 	     * Put the number characters in buf2[].
! 	     */
! 	    if (hex == 0)
! 		sprintf((char *)buf2, "%lu", n + offset);
! 	    else if (hex == '0')
! 		sprintf((char *)buf2, "%lo", n + offset);
! 	    else if (hex && hexupper)
! 		sprintf((char *)buf2, "%lX", n + offset);
! 	    else
! 		sprintf((char *)buf2, "%lx", n + offset);
! 	    length -= (int)STRLEN(buf2);
  
! 	    if (g_cmd)
! 	    {
! 		if (subtract)
! 		    offset -= (unsigned long)Prenum1;
! 		else
! 		    offset += (unsigned long)Prenum1;
! 	    }
  
! 	    /*
! 	     * Adjust number of zeros to the new number of digits, so the
! 	     * total length of the number remains the same.
! 	     * Don't do this when
! 	     * the result may look like an octal number.
! 	     */
! 	    if (firstdigit == '0' && !(dooct && hex == 0))
! 		while (length-- > 0)
! 		    *ptr++ = '0';
! 	    *ptr = NUL;
! 	    STRCAT(buf1, buf2);
! 	    ins_str(buf1);		/* insert the new number */
! 	    vim_free(buf1);
! 	}
! 	--curwin->w_cursor.col;
! 	curwin->w_set_curswant = TRUE;
  #ifdef FEAT_RIGHTLEFT
! 	ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum, TRUE);
! 	RLADDSUBFIX(ptr);
  #endif
+     }
      return OK;
  }
  
*** ../vim-7.4.753/src/proto/ops.pro	2014-12-17 14:36:10.363090985 +0100
--- src/proto/ops.pro	2015-06-25 13:38:28.429205490 +0200
***************
*** 43,49 ****
  int fex_format __ARGS((linenr_T lnum, long count, int c));
  void format_lines __ARGS((linenr_T line_count, int avoid_fex));
  int paragraph_start __ARGS((linenr_T lnum));
! int do_addsub __ARGS((int command, linenr_T Prenum1));
  int read_viminfo_register __ARGS((vir_T *virp, int force));
  void write_viminfo_registers __ARGS((FILE *fp));
  void x11_export_final_selection __ARGS((void));
--- 43,49 ----
  int fex_format __ARGS((linenr_T lnum, long count, int c));
  void format_lines __ARGS((linenr_T line_count, int avoid_fex));
  int paragraph_start __ARGS((linenr_T lnum));
! int do_addsub __ARGS((int command, linenr_T Prenum1, int g_cmd));
  int read_viminfo_register __ARGS((vir_T *virp, int force));
  void write_viminfo_registers __ARGS((FILE *fp));
  void x11_export_final_selection __ARGS((void));
*** ../vim-7.4.753/src/testdir/Make_amiga.mak	2015-06-19 15:45:13.005889121 +0200
--- src/testdir/Make_amiga.mak	2015-06-25 13:45:32.340769261 +0200
***************
*** 45,50 ****
--- 45,51 ----
  		test_command_count.out \
  		test_erasebackword.out \
  		test_eval.out \
+ 		test_increment.out \
  		test_insertcount.out \
  		test_listchars.out \
  		test_listlbr.out \
***************
*** 192,197 ****
--- 193,199 ----
  test_command_count.out: test_command_count.in
  test_erasebackword.out: test_erasebackword.in
  test_eval.out: test_eval.in
+ test_increment.out: test_increment.in
  test_insertcount.out: test_insertcount.in
  test_listchars.out: test_listchars.in
  test_listlbr.out: test_listlbr.in
*** ../vim-7.4.753/src/testdir/Make_dos.mak	2015-06-19 15:45:13.005889121 +0200
--- src/testdir/Make_dos.mak	2015-06-25 13:38:28.429205490 +0200
***************
*** 44,49 ****
--- 44,50 ----
  		test_command_count.out \
  		test_erasebackword.out \
  		test_eval.out \
+ 		test_increment.out \
  		test_insertcount.out \
  		test_listchars.out \
  		test_listlbr.out \
*** ../vim-7.4.753/src/testdir/Make_ming.mak	2015-06-19 15:45:13.005889121 +0200
--- src/testdir/Make_ming.mak	2015-06-25 13:38:28.429205490 +0200
***************
*** 66,71 ****
--- 66,72 ----
  		test_command_count.out \
  		test_erasebackword.out \
  		test_eval.out \
+ 		test_increment.out \
  		test_insertcount.out \
  		test_listchars.out \
  		test_listlbr.out \
*** ../vim-7.4.753/src/testdir/Make_os2.mak	2015-06-19 15:45:13.005889121 +0200
--- src/testdir/Make_os2.mak	2015-06-25 13:38:28.429205490 +0200
***************
*** 46,51 ****
--- 46,52 ----
  		test_command_count.out \
  		test_erasebackword.out \
  		test_eval.out \
+ 		test_increment.out \
  		test_insertcount.out \
  		test_listchars.out \
  		test_listlbr.out \
*** ../vim-7.4.753/src/testdir/Make_vms.mms	2015-06-19 15:45:13.005889121 +0200
--- src/testdir/Make_vms.mms	2015-06-25 13:38:28.429205490 +0200
***************
*** 105,110 ****
--- 105,111 ----
  	 test_command_count.out \
  	 test_erasebackword.out \
  	 test_eval.out \
+ 	 test_increment.out \
  	 test_insertcount.out \
  	 test_listchars.out \
  	 test_listlbr.out \
*** ../vim-7.4.753/src/testdir/Makefile	2015-06-19 15:45:13.005889121 +0200
--- src/testdir/Makefile	2015-06-25 13:38:28.429205490 +0200
***************
*** 42,47 ****
--- 42,48 ----
  		test_command_count.out \
  		test_erasebackword.out \
  		test_eval.out \
+ 		test_increment.out \
  		test_insertcount.out \
  		test_listchars.out \
  		test_listlbr.out \
*** ../vim-7.4.753/src/testdir/test_increment.in	2015-06-25 13:56:12.046135151 +0200
--- src/testdir/test_increment.in	2015-06-25 13:38:28.429205490 +0200
***************
*** 0 ****
--- 1,143 ----
+ Tests for using Ctrl-A/Ctrl-X on visual selections
+ 
+ Test cases
+ ==========
+ 
+ 1) Ctrl-A on visually selected number
+ Text:
+ foobar-10
+     1)    Ctrl-A on start of line:
+ 	foobar-9
+     2)    Ctrl-A on visually selected "-10":
+ 	foobar-9
+     3)    Ctrl-A on visually selected "10":
+ 	foobar-11
+     4)    Ctrl-X on visually selected "-10"
+ 	foobar-11
+     5)    Ctrl-X on visually selected "10"
+ 	foobar-9
+ 
+ 2) Ctrl-A on visually selected lines
+ Text:
+ 10
+ 20
+ 30
+ 40
+ 
+     1) Ctrl-A on visually selected lines:
+ 11
+ 21
+ 31
+ 41
+ 
+     2) Ctrl-X on visually selected lines:
+ 9
+ 19
+ 29
+ 39
+ 
+ 3) g Ctrl-A on visually selected lines, with non-numbers in between
+ Text:
+ 10
+ 
+ 20
+ 
+ 30
+ 
+ 40
+ 
+     1) 2 g Ctrl-A on visually selected lines:
+ 12
+ 
+ 24
+ 
+ 36
+ 
+ 48
+     2) 2 g Ctrl-X on visually selected lines
+ 8
+ 
+ 16
+ 
+ 24
+ 
+ 32
+ 
+ 4) Ctrl-A on non-number
+ Text:
+ foobar-10
+     1) visually select foobar:
+     foobar-10
+ 
+ STARTTEST
+ :so small.vim
+ 
+ :" Test 1
+ :/^S1=/+,/^E1=/-y a
+ :/^E1/+put a
+ :/^E1/+2put a
+ f-v$:/^E1/+3put a
+ f1v$:/^E1/+4put a
+ 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
+ :/^S4=/+,/^E4=/-y a
+ :/^E4=/+put a
+ vf-
+ 
+ :" Save the report
+ :/^# Test 1/,$w! test.out
+ :qa!
+ 
+ 
+ # Test 1
+ S1======
+ foobar-10
+ E1======
+ 
+ 
+ 
+ # Test 2
+ S2=====
+ 10
+ 20
+ 30
+ 40
+ E2=====
+ 
+ 
+ 
+ # Test 3
+ S3=====
+ 10
+ 
+ 20
+ 
+ 30
+ 
+ 40
+ E3=====
+ 
+ 
+ 
+ # Test 4
+ S4=====
+ foobar-10
+ E4=====
+ 
+ 
+ ENDTEST
+ 
*** ../vim-7.4.753/src/testdir/test_increment.ok	2015-06-25 13:56:12.050135109 +0200
--- src/testdir/test_increment.ok	2015-06-25 13:38:28.429205490 +0200
***************
*** 0 ****
--- 1,66 ----
+ # Test 1
+ S1======
+ foobar-10
+ E1======
+ 
+ foobar-9
+ foobar-9
+ foobar-11
+ foobar-11
+ foobar-9
+ 
+ 
+ # Test 2
+ S2=====
+ 10
+ 20
+ 30
+ 40
+ E2=====
+ 
+ 11
+ 21
+ 31
+ 41
+ 
+ 9
+ 19
+ 29
+ 39
+ 
+ # Test 3
+ S3=====
+ 10
+ 
+ 20
+ 
+ 30
+ 
+ 40
+ E3=====
+ 
+ 12
+ 
+ 24
+ 
+ 36
+ 
+ 48
+ 
+ 8
+ 
+ 16
+ 
+ 24
+ 
+ 32
+ 
+ # Test 4
+ S4=====
+ foobar-10
+ E4=====
+ 
+ foobar-10
+ 
+ ENDTEST
+ 
*** ../vim-7.4.753/src/version.c	2015-06-25 13:30:41.206095684 +0200
--- src/version.c	2015-06-25 13:38:07.853420831 +0200
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     754,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
144. You eagerly await the update of the "Cool Site of the Day."

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