Skip to content

Commit 6e441ac

Browse files
committed
Merge branch 'vim'
2 parents 82d0ade + 320b379 commit 6e441ac

File tree

11 files changed

+231
-77
lines changed

11 files changed

+231
-77
lines changed

.hgtags

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2723,3 +2723,10 @@ ba37e955913e85700677b89a720c6e5fc8d23cc3 v7-4b-016
27232723
059c8a4b103f6971276435127c7ad970a81b0b2c v7-4b-021
27242724
d5d6b78cff090e87d52924179e44131b5ba7436d v7-4b-022
27252725
359743c1f59af353454dd80a26d9f8c20ae6ee8e v7-4
2726+
3e9107b86b68d83bfa94e43afffbf17623afe55e v7-4-001
2727+
e29f11399ccec9215cc8cfab1f9307dea0567d70 v7-4-002
2728+
560a6a2329503d483db019a88cacc3307e5c30b7 v7-4-003
2729+
f6247eaf4e1d556f782321890d725663f74babe6 v7-4-004
2730+
3640cf4c0d4b6e5687bb7a31678fab70c88ed94b v7-4-005
2731+
2374a05efe20287d55bd824689a41becc7662505 v7-4-006
2732+
4fe1dfc7014e57b4beb5a01c9e94357265d19a92 v7-4-007

src/buffer.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,10 @@ do_buffer(action, start, dir, count, forceit)
11901190
&& !(curwin->w_closing || curwin->w_buffer->b_closing)
11911191
# endif
11921192
&& (firstwin != lastwin || first_tabpage->tp_next != NULL))
1193-
win_close(curwin, FALSE);
1193+
{
1194+
if (win_close(curwin, FALSE) == FAIL)
1195+
break;
1196+
}
11941197
#endif
11951198

11961199
/*

src/eval.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14312,14 +14312,18 @@ f_mkdir(argvars, rettv)
1431214312
return;
1431314313

1431414314
dir = get_tv_string_buf(&argvars[0], buf);
14315+
if (*gettail(dir) == NUL)
14316+
/* remove trailing slashes */
14317+
*gettail_sep(dir) = NUL;
14318+
1431514319
if (argvars[1].v_type != VAR_UNKNOWN)
1431614320
{
1431714321
if (argvars[2].v_type != VAR_UNKNOWN)
1431814322
prot = get_tv_number_chk(&argvars[2], NULL);
1431914323
if (prot != -1 && STRCMP(get_tv_string(&argvars[1]), "p") == 0)
1432014324
mkdir_recurse(dir, prot);
1432114325
}
14322-
rettv->vval.v_number = prot != -1 ? vim_mkdir_emsg(dir, prot) : 0;
14326+
rettv->vval.v_number = prot == -1 ? FAIL : vim_mkdir_emsg(dir, prot);
1432314327
}
1432414328
#endif
1432514329

src/main.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2816,6 +2816,7 @@ edit_buffers(parmp)
28162816
int arg_idx; /* index in argument list */
28172817
int i;
28182818
int advance = TRUE;
2819+
win_T *win;
28192820

28202821
# ifdef FEAT_AUTOCMD
28212822
/*
@@ -2905,24 +2906,22 @@ edit_buffers(parmp)
29052906
# ifdef FEAT_AUTOCMD
29062907
--autocmd_no_enter;
29072908
# endif
2909+
2910+
/* make the first window the current window */
2911+
win = firstwin;
29082912
#if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2909-
/*
2910-
* Avoid making a preview window the current window.
2911-
*/
2912-
if (firstwin->w_p_pvw)
2913+
/* Avoid making a preview window the current window. */
2914+
while (win->w_p_pvw)
29132915
{
2914-
win_T *win;
2915-
2916-
for (win = firstwin; win != NULL; win = win->w_next)
2917-
if (!win->w_p_pvw)
2918-
{
2919-
firstwin = win;
2920-
break;
2921-
}
2916+
win = win->w_next;
2917+
if (win == NULL)
2918+
{
2919+
win = firstwin;
2920+
break;
2921+
}
29222922
}
29232923
#endif
2924-
/* make the first window the current window */
2925-
win_enter(firstwin, FALSE);
2924+
win_enter(win, FALSE);
29262925

29272926
# ifdef FEAT_AUTOCMD
29282927
--autocmd_no_leave;

src/proto/window.pro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ void win_move_after __ARGS((win_T *win1, win_T *win2));
99
void win_equal __ARGS((win_T *next_curwin, int current, int dir));
1010
void close_windows __ARGS((buf_T *buf, int keep_curwin));
1111
int one_window __ARGS((void));
12-
void win_close __ARGS((win_T *win, int free_buf));
12+
int win_close __ARGS((win_T *win, int free_buf));
1313
void win_close_othertab __ARGS((win_T *win, int free_buf, tabpage_T *tp));
1414
void win_free_all __ARGS((void));
1515
win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp));

src/regexp_nfa.c

Lines changed: 81 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
# define NFA_REGEXP_DEBUG_LOG "nfa_regexp_debug.log"
3030
#endif
3131

32+
/* Added to NFA_ANY - NFA_NUPPER_IC to include a NL. */
33+
#define NFA_ADD_NL 31
34+
3235
enum
3336
{
3437
NFA_SPLIT = -1024,
@@ -183,6 +186,13 @@ enum
183186
NFA_NLOWER, /* Match non-lowercase char */
184187
NFA_UPPER, /* Match uppercase char */
185188
NFA_NUPPER, /* Match non-uppercase char */
189+
NFA_LOWER_IC, /* Match [a-z] */
190+
NFA_NLOWER_IC, /* Match [^a-z] */
191+
NFA_UPPER_IC, /* Match [A-Z] */
192+
NFA_NUPPER_IC, /* Match [^A-Z] */
193+
194+
NFA_FIRST_NL = NFA_ANY + NFA_ADD_NL,
195+
NFA_LAST_NL = NFA_NUPPER_IC + NFA_ADD_NL,
186196

187197
NFA_CURSOR, /* Match cursor pos */
188198
NFA_LNUM, /* Match line number */
@@ -199,9 +209,6 @@ enum
199209
NFA_MARK_LT, /* Match < mark */
200210
NFA_VISUAL, /* Match Visual area */
201211

202-
NFA_FIRST_NL = NFA_ANY + ADD_NL,
203-
NFA_LAST_NL = NFA_NUPPER + ADD_NL,
204-
205212
/* Character classes [:alnum:] etc */
206213
NFA_CLASS_ALNUM,
207214
NFA_CLASS_ALPHA,
@@ -578,6 +585,8 @@ realloc_post_list()
578585
* On failure, return 0 (=FAIL)
579586
* Start points to the first char of the range, while end should point
580587
* to the closing brace.
588+
* Keep in mind that 'ignorecase' applies at execution time, thus [a-z] may
589+
* need to be interpreted as [a-zA-Z].
581590
*/
582591
static int
583592
nfa_recognize_char_class(start, end, extra_newl)
@@ -681,7 +690,7 @@ nfa_recognize_char_class(start, end, extra_newl)
681690
return FAIL;
682691

683692
if (newl == TRUE)
684-
extra_newl = ADD_NL;
693+
extra_newl = NFA_ADD_NL;
685694

686695
switch (config)
687696
{
@@ -710,13 +719,13 @@ nfa_recognize_char_class(start, end, extra_newl)
710719
case CLASS_not | CLASS_az | CLASS_AZ:
711720
return extra_newl + NFA_NALPHA;
712721
case CLASS_az:
713-
return extra_newl + NFA_LOWER;
722+
return extra_newl + NFA_LOWER_IC;
714723
case CLASS_not | CLASS_az:
715-
return extra_newl + NFA_NLOWER;
724+
return extra_newl + NFA_NLOWER_IC;
716725
case CLASS_AZ:
717-
return extra_newl + NFA_UPPER;
726+
return extra_newl + NFA_UPPER_IC;
718727
case CLASS_not | CLASS_AZ:
719-
return extra_newl + NFA_NUPPER;
728+
return extra_newl + NFA_NUPPER_IC;
720729
}
721730
return FAIL;
722731
}
@@ -914,7 +923,7 @@ nfa_regatom()
914923
break;
915924
}
916925

917-
extra = ADD_NL;
926+
extra = NFA_ADD_NL;
918927

919928
/* "\_[" is collection plus newline */
920929
if (c == '[')
@@ -970,7 +979,7 @@ nfa_regatom()
970979
}
971980
#endif
972981
EMIT(nfa_classcodes[p - classchars]);
973-
if (extra == ADD_NL)
982+
if (extra == NFA_ADD_NL)
974983
{
975984
EMIT(NFA_NEWL);
976985
EMIT(NFA_OR);
@@ -1240,21 +1249,21 @@ nfa_regatom()
12401249
{
12411250
/*
12421251
* Try to reverse engineer character classes. For example,
1243-
* recognize that [0-9] stands for \d and [A-Za-z_] with \h,
1252+
* recognize that [0-9] stands for \d and [A-Za-z_] for \h,
12441253
* and perform the necessary substitutions in the NFA.
12451254
*/
12461255
result = nfa_recognize_char_class(regparse, endp,
1247-
extra == ADD_NL);
1256+
extra == NFA_ADD_NL);
12481257
if (result != FAIL)
12491258
{
1250-
if (result >= NFA_DIGIT && result <= NFA_NUPPER)
1251-
EMIT(result);
1252-
else /* must be char class + newline */
1259+
if (result >= NFA_FIRST_NL && result <= NFA_LAST_NL)
12531260
{
1254-
EMIT(result - ADD_NL);
1261+
EMIT(result - NFA_ADD_NL);
12551262
EMIT(NFA_NEWL);
12561263
EMIT(NFA_OR);
12571264
}
1265+
else
1266+
EMIT(result);
12581267
regparse = endp;
12591268
mb_ptr_adv(regparse);
12601269
return OK;
@@ -1504,7 +1513,7 @@ nfa_regatom()
15041513
* collection, add an OR below. But not for negated
15051514
* range. */
15061515
if (!negated)
1507-
extra = ADD_NL;
1516+
extra = NFA_ADD_NL;
15081517
}
15091518
else
15101519
{
@@ -1537,7 +1546,7 @@ nfa_regatom()
15371546
EMIT(NFA_END_COLL);
15381547

15391548
/* \_[] also matches \n but it's not negated */
1540-
if (extra == ADD_NL)
1549+
if (extra == NFA_ADD_NL)
15411550
{
15421551
EMIT(reg_string ? NL : NFA_NEWL);
15431552
EMIT(NFA_OR);
@@ -2011,7 +2020,7 @@ nfa_set_code(c)
20112020
if (c >= NFA_FIRST_NL && c <= NFA_LAST_NL)
20122021
{
20132022
addnl = TRUE;
2014-
c -= ADD_NL;
2023+
c -= NFA_ADD_NL;
20152024
}
20162025

20172026
STRCPY(code, "");
@@ -2217,6 +2226,10 @@ nfa_set_code(c)
22172226
case NFA_NLOWER:STRCPY(code, "NFA_NLOWER"); break;
22182227
case NFA_UPPER: STRCPY(code, "NFA_UPPER"); break;
22192228
case NFA_NUPPER:STRCPY(code, "NFA_NUPPER"); break;
2229+
case NFA_LOWER_IC: STRCPY(code, "NFA_LOWER_IC"); break;
2230+
case NFA_NLOWER_IC: STRCPY(code, "NFA_NLOWER_IC"); break;
2231+
case NFA_UPPER_IC: STRCPY(code, "NFA_UPPER_IC"); break;
2232+
case NFA_NUPPER_IC: STRCPY(code, "NFA_NUPPER_IC"); break;
22202233

22212234
default:
22222235
STRCPY(code, "CHAR(x)");
@@ -2687,6 +2700,10 @@ nfa_max_width(startstate, depth)
26872700
case NFA_NLOWER:
26882701
case NFA_UPPER:
26892702
case NFA_NUPPER:
2703+
case NFA_LOWER_IC:
2704+
case NFA_NLOWER_IC:
2705+
case NFA_UPPER_IC:
2706+
case NFA_NUPPER_IC:
26902707
/* possibly non-ascii */
26912708
#ifdef FEAT_MBYTE
26922709
if (has_mbyte)
@@ -3765,6 +3782,9 @@ pim_equal(one, two)
37653782
if (two_unused)
37663783
/* one is used and two is not: not equal */
37673784
return FALSE;
3785+
/* compare the state id */
3786+
if (one->state->id != two->state->id)
3787+
return FALSE;
37683788
/* compare the position */
37693789
if (REG_MULTI)
37703790
return one->end.pos.lnum == two->end.pos.lnum
@@ -3841,6 +3861,10 @@ match_follows(startstate, depth)
38413861
case NFA_NLOWER:
38423862
case NFA_UPPER:
38433863
case NFA_NUPPER:
3864+
case NFA_LOWER_IC:
3865+
case NFA_NLOWER_IC:
3866+
case NFA_UPPER_IC:
3867+
case NFA_NUPPER_IC:
38443868
case NFA_START_COLL:
38453869
case NFA_START_NEG_COLL:
38463870
case NFA_NEWL:
@@ -4096,7 +4120,7 @@ addstate(l, state, subs_arg, pim, off)
40964120
sub = &subs->norm;
40974121
}
40984122
#ifdef FEAT_SYN_HL
4099-
else if (state->c >= NFA_ZOPEN)
4123+
else if (state->c >= NFA_ZOPEN && state->c <= NFA_ZOPEN9)
41004124
{
41014125
subidx = state->c - NFA_ZOPEN;
41024126
sub = &subs->synt;
@@ -4165,6 +4189,13 @@ addstate(l, state, subs_arg, pim, off)
41654189
}
41664190

41674191
subs = addstate(l, state->out, subs, pim, off);
4192+
/* "subs" may have changed, need to set "sub" again */
4193+
#ifdef FEAT_SYN_HL
4194+
if (state->c >= NFA_ZOPEN && state->c <= NFA_ZOPEN9)
4195+
sub = &subs->synt;
4196+
else
4197+
#endif
4198+
sub = &subs->norm;
41684199

41694200
if (save_in_use == -1)
41704201
{
@@ -4213,7 +4244,7 @@ addstate(l, state, subs_arg, pim, off)
42134244
sub = &subs->norm;
42144245
}
42154246
#ifdef FEAT_SYN_HL
4216-
else if (state->c >= NFA_ZCLOSE)
4247+
else if (state->c >= NFA_ZCLOSE && state->c <= NFA_ZCLOSE9)
42174248
{
42184249
subidx = state->c - NFA_ZCLOSE;
42194250
sub = &subs->synt;
@@ -4257,6 +4288,13 @@ addstate(l, state, subs_arg, pim, off)
42574288
}
42584289

42594290
subs = addstate(l, state->out, subs, pim, off);
4291+
/* "subs" may have changed, need to set "sub" again */
4292+
#ifdef FEAT_SYN_HL
4293+
if (state->c >= NFA_ZCLOSE && state->c <= NFA_ZCLOSE9)
4294+
sub = &subs->synt;
4295+
else
4296+
#endif
4297+
sub = &subs->norm;
42604298

42614299
if (REG_MULTI)
42624300
sub->list.multi[subidx].end = save_lpos;
@@ -5872,6 +5910,28 @@ nfa_regmatch(prog, start, submatch, m)
58725910
ADD_STATE_IF_MATCH(t->state);
58735911
break;
58745912

5913+
case NFA_LOWER_IC: /* [a-z] */
5914+
result = ri_lower(curc) || (ireg_ic && ri_upper(curc));
5915+
ADD_STATE_IF_MATCH(t->state);
5916+
break;
5917+
5918+
case NFA_NLOWER_IC: /* [^a-z] */
5919+
result = curc != NUL
5920+
&& !(ri_lower(curc) || (ireg_ic && ri_upper(curc)));
5921+
ADD_STATE_IF_MATCH(t->state);
5922+
break;
5923+
5924+
case NFA_UPPER_IC: /* [A-Z] */
5925+
result = ri_upper(curc) || (ireg_ic && ri_lower(curc));
5926+
ADD_STATE_IF_MATCH(t->state);
5927+
break;
5928+
5929+
case NFA_NUPPER_IC: /* ^[A-Z] */
5930+
result = curc != NUL
5931+
&& !(ri_upper(curc) || (ireg_ic && ri_lower(curc)));
5932+
ADD_STATE_IF_MATCH(t->state);
5933+
break;
5934+
58755935
case NFA_BACKREF1:
58765936
case NFA_BACKREF2:
58775937
case NFA_BACKREF3:

src/search.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,6 +1769,9 @@ findmatchlimit(oap, initc, flags, maxtravel)
17691769
#endif
17701770

17711771
pos = curwin->w_cursor;
1772+
#ifdef FEAT_VIRTUALEDIT
1773+
pos.coladd = 0;
1774+
#endif
17721775
linep = ml_get(pos.lnum);
17731776

17741777
cpo_match = (vim_strchr(p_cpo, CPO_MATCH) != NULL);

0 commit comments

Comments
 (0)