forked from aniani/vim
patch 8.2.4978: no error if engine selection atom is not at the start
Problem: No error if engine selection atom is not at the start. Solution: Give an error. (Christian Brabandt, closes #10439)
This commit is contained in:
parent
e2bd8600b8
commit
360da40b47
@ -379,7 +379,7 @@ Vim includes two regexp engines:
|
||||
1. An old, backtracking engine that supports everything.
|
||||
2. A new, NFA engine that works much faster on some patterns, possibly slower
|
||||
on some patterns.
|
||||
|
||||
*E1281*
|
||||
Vim will automatically select the right engine for you. However, if you run
|
||||
into a problem or want to specifically select one engine or the other, you can
|
||||
prepend one of the following to the pattern:
|
||||
|
@ -3277,3 +3277,5 @@ EXTERN char e_missing_close_curly_str[]
|
||||
EXTERN char e_illegal_character_in_word[]
|
||||
INIT(= N_("E1280: Illegal character in word"));
|
||||
#endif
|
||||
EXTERN char e_atom_engine_must_be_at_start_of_pattern[]
|
||||
INIT(= N_("E1281: Atom '\\%%#=%c' must be at the start of the pattern"));
|
||||
|
@ -1503,6 +1503,14 @@ regatom(int *flagp)
|
||||
break;
|
||||
|
||||
case '#':
|
||||
if (regparse[0] == '=' && regparse[1] >= 48
|
||||
&& regparse[1] <= 50)
|
||||
{
|
||||
// misplaced \%#=1
|
||||
semsg(_(e_atom_engine_must_be_at_start_of_pattern),
|
||||
regparse[1]);
|
||||
return FAIL;
|
||||
}
|
||||
ret = regnode(CURSOR);
|
||||
break;
|
||||
|
||||
|
@ -1592,6 +1592,14 @@ nfa_regatom(void)
|
||||
break;
|
||||
|
||||
case '#':
|
||||
if (regparse[0] == '=' && regparse[1] >= 48
|
||||
&& regparse[1] <= 50)
|
||||
{
|
||||
// misplaced \%#=1
|
||||
semsg(_(e_atom_engine_must_be_at_start_of_pattern),
|
||||
regparse[1]);
|
||||
return FAIL;
|
||||
}
|
||||
EMIT(NFA_CURSOR);
|
||||
break;
|
||||
|
||||
|
@ -1096,4 +1096,22 @@ func Test_using_invalid_visual_position()
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
func Test_using_two_engines_pattern()
|
||||
new
|
||||
call setline(1, ['foobar=0', 'foobar=1', 'foobar=2'])
|
||||
" \%#= at the end of the pattern
|
||||
for i in range(0, 2)
|
||||
call cursor( (i+1), 7)
|
||||
call assert_fails("%s/foobar\\%#=" .. i, 'E1281:')
|
||||
endfor
|
||||
|
||||
" \%#= at the start of the pattern
|
||||
for i in range(0, 2)
|
||||
call cursor( (i+1), 7)
|
||||
exe ":%s/\\%#=" .. i .. "foobar=" .. i .. "/xx"
|
||||
endfor
|
||||
call assert_equal(['xx', 'xx', 'xx'], getline(1, '$'))
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -746,6 +746,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
4978,
|
||||
/**/
|
||||
4977,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user