summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/eval.c9
-rw-r--r--src/normal.c20
-rw-r--r--src/proto/eval.pro2
-rw-r--r--src/version.c2
4 files changed, 27 insertions, 6 deletions
diff --git a/src/eval.c b/src/eval.c
index 98fc8edf..00190b09 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -18146,14 +18146,17 @@ get_vim_var_list(idx)
}
/*
- * Set v:count, v:count1 and v:prevcount.
+ * Set v:count to "count" and v:count1 to "count1".
+ * When "set_prevcount" is TRUE first set v:prevcount from v:count.
*/
void
-set_vcount(count, count1)
+set_vcount(count, count1, set_prevcount)
long count;
long count1;
+ int set_prevcount;
{
- vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
+ if (set_prevcount)
+ vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
vimvars[VV_COUNT].vv_nr = count;
vimvars[VV_COUNT1].vv_nr = count1;
}
diff --git a/src/normal.c b/src/normal.c
index b9071715..0557833b 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -580,6 +580,9 @@ normal_cmd(oap, toplevel)
static int old_mapped_len = 0;
#endif
int idx;
+#ifdef FEAT_EVAL
+ int set_prevcount = FALSE;
+#endif
vim_memset(&ca, 0, sizeof(ca)); /* also resets ca.retval */
ca.oap = oap;
@@ -615,7 +618,12 @@ normal_cmd(oap, toplevel)
/* When not finishing an operator and no register name typed, reset the
* count. */
if (!finish_op && !oap->regname)
+ {
ca.opcount = 0;
+#ifdef FEAT_EVAL
+ set_prevcount = TRUE;
+#endif
+ }
#ifdef FEAT_AUTOCMD
/* Restore counts from before receiving K_CURSORHOLD. This means after
@@ -719,7 +727,15 @@ getcount:
* command, so that v:count can be used in an expression mapping
* right after the count. */
if (toplevel && stuff_empty())
- set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0);
+ {
+ 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)
{
@@ -806,7 +822,7 @@ getcount:
* Only set v:count when called from main() and not a stuffed command.
*/
if (toplevel && stuff_empty())
- set_vcount(ca.count0, ca.count1);
+ set_vcount(ca.count0, ca.count1, set_prevcount);
#endif
/*
diff --git a/src/proto/eval.pro b/src/proto/eval.pro
index 7aabf0ba..362b9d90 100644
--- a/src/proto/eval.pro
+++ b/src/proto/eval.pro
@@ -61,7 +61,7 @@ void set_vim_var_nr __ARGS((int idx, long val));
long get_vim_var_nr __ARGS((int idx));
char_u *get_vim_var_str __ARGS((int idx));
list_T *get_vim_var_list __ARGS((int idx));
-void set_vcount __ARGS((long count, long count1));
+void set_vcount __ARGS((long count, long count1, int set_prevcount));
void set_vim_var_string __ARGS((int idx, char_u *val, int len));
void set_vim_var_list __ARGS((int idx, list_T *val));
void set_reg_var __ARGS((int c));
diff --git a/src/version.c b/src/version.c
index 8912575f..ee0240ef 100644
--- a/src/version.c
+++ b/src/version.c
@@ -677,6 +677,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 48,
+/**/
47,
/**/
46,