Blob Blame History Raw
To: vim_dev@googlegroups.com
Subject: Patch 7.3.086
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.086
Problem:    When using a mapping with an expression and there was no count,
	    v:count has the value of the previous command. (ZyX)
Solution:   Also set v:count and v:count1 before getting the character that
	    could be a command or a count.
Files:	    src/normal.c


*** ../vim-7.3.085/src/normal.c	2010-10-13 18:06:42.000000000 +0200
--- src/normal.c	2010-12-17 18:46:56.000000000 +0100
***************
*** 25,30 ****
--- 25,33 ----
  static int	restart_VIsual_select = 0;
  #endif
  
+ #ifdef FEAT_EVAL
+ static void	set_vcount_ca __ARGS((cmdarg_T *cap, int *set_prevcount));
+ #endif
  static int
  # ifdef __BORLANDC__
  _RTLENTRYF
***************
*** 648,653 ****
--- 651,664 ----
      dont_scroll = FALSE;	/* allow scrolling here */
  #endif
  
+ #ifdef FEAT_EVAL
+     /* Set v:count here, when called from main() and not a stuffed
+      * command, so that v:count can be used in an expression mapping
+      * when there is no count. */
+     if (toplevel && stuff_empty())
+ 	set_vcount_ca(&ca, &set_prevcount);
+ #endif
+ 
      /*
       * Get the command character from the user.
       */
***************
*** 725,739 ****
  	     * command, so that v:count can be used in an expression mapping
  	     * right after the count. */
  	    if (toplevel && stuff_empty())
! 	    {
! 		long count = ca.count0;
! 
! 		/* multiply with ca.opcount the same way as below */
! 		if (ca.opcount != 0)
! 		    count = ca.opcount * (count == 0 ? 1 : count);
! 		set_vcount(count, count == 0 ? 1 : count, set_prevcount);
! 		set_prevcount = FALSE;  /* only set v:prevcount once */
! 	    }
  #endif
  	    if (ctrl_w)
  	    {
--- 736,742 ----
  	     * command, so that v:count can be used in an expression mapping
  	     * right after the count. */
  	    if (toplevel && stuff_empty())
! 		set_vcount_ca(&ca, &set_prevcount);
  #endif
  	    if (ctrl_w)
  	    {
***************
*** 1386,1391 ****
--- 1389,1414 ----
      opcount = ca.opcount;
  }
  
+ #ifdef FEAT_EVAL
+ /*
+  * Set v:count and v:count1 according to "cap".
+  * Set v:prevcount only when "set_prevcount" is TRUE.
+  */
+     static void
+ set_vcount_ca(cap, set_prevcount)
+     cmdarg_T	*cap;
+     int		*set_prevcount;
+ {
+     long count = cap->count0;
+ 
+     /* multiply with cap->opcount the same way as above */
+     if (cap->opcount != 0)
+ 	count = cap->opcount * (count == 0 ? 1 : count);
+     set_vcount(count, count == 0 ? 1 : count, *set_prevcount);
+     *set_prevcount = FALSE;  /* only set v:prevcount once */
+ }
+ #endif
+ 
  /*
   * Handle an operator after visual mode or when the movement is finished
   */
***************
*** 8529,8535 ****
      else
  	curwin->w_curswant = 0;
      /* keep curswant at the column where we wanted to go, not where
!        we ended; differs if line is too short */
      curwin->w_set_curswant = FALSE;
  }
  
--- 8552,8558 ----
      else
  	curwin->w_curswant = 0;
      /* keep curswant at the column where we wanted to go, not where
!      * we ended; differs if line is too short */
      curwin->w_set_curswant = FALSE;
  }
  
*** ../vim-7.3.085/src/version.c	2010-12-17 18:06:00.000000000 +0100
--- src/version.c	2010-12-17 18:51:20.000000000 +0100
***************
*** 716,717 ****
--- 716,719 ----
  {   /* Add new patch number below this line */
+ /**/
+     86,
  /**/

-- 
How To Keep A Healthy Level Of Insanity:
15. Five days in advance, tell your friends you can't attend their
    party because you're not in the mood.

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