1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
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 ///
|