aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-11-05 15:59:17 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-11-05 16:09:22 +0800
commitb84666d2a0dc4a7585ef6aa5a8f9060046ff9082 (patch)
tree5b4486c9e051e62b7b52cc016624e7e9526c8e6e
parent77e25e56d8ccc0c174305f9fe64ad06f0223ab2d (diff)
downloadrneovim-b84666d2a0dc4a7585ef6aa5a8f9060046ff9082.tar.gz
rneovim-b84666d2a0dc4a7585ef6aa5a8f9060046ff9082.tar.bz2
rneovim-b84666d2a0dc4a7585ef6aa5a8f9060046ff9082.zip
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 vim/vim#10439) https://github.com/vim/vim/commit/360da40b47a84ee8586c3b5d062f8c64a2ac9cc6 Co-authored-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--runtime/doc/pattern.txt2
-rw-r--r--src/nvim/regexp.c2
-rw-r--r--src/nvim/regexp_bt.c5
-rw-r--r--src/nvim/regexp_nfa.c6
-rw-r--r--src/nvim/testdir/test_regexp_latin.vim18
5 files changed, 32 insertions, 1 deletions
diff --git a/runtime/doc/pattern.txt b/runtime/doc/pattern.txt
index 371a210847..5357aaa3f1 100644
--- a/runtime/doc/pattern.txt
+++ b/runtime/doc/pattern.txt
@@ -372,7 +372,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:
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index 3e8724c1ef..7a96889f22 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -112,6 +112,8 @@ static char e_regexp_number_after_dot_pos_search_chr[]
= N_("E1204: No Number allowed after .: '\\%%%c'");
static char e_nfa_regexp_missing_value_in_chr[]
= N_("E1273: (NFA regexp) missing value in '\\%%%c'");
+static char e_atom_engine_must_be_at_start_of_pattern[]
+ = N_("E1281: Atom '\\%%#=%c' must be at the start of the pattern");
static char e_substitute_nesting_too_deep[] = N_("E1290: substitute nesting too deep");
#define NOT_MULTI 0
diff --git a/src/nvim/regexp_bt.c b/src/nvim/regexp_bt.c
index f0efd06cc0..6f63b38a90 100644
--- a/src/nvim/regexp_bt.c
+++ b/src/nvim/regexp_bt.c
@@ -1971,6 +1971,11 @@ static char_u *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;
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c
index c93164ed7e..2f4b1b98c1 100644
--- a/src/nvim/regexp_nfa.c
+++ b/src/nvim/regexp_nfa.c
@@ -2094,6 +2094,12 @@ static int 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;
diff --git a/src/nvim/testdir/test_regexp_latin.vim b/src/nvim/testdir/test_regexp_latin.vim
index 5312c6f26a..3a4a7ad910 100644
--- a/src/nvim/testdir/test_regexp_latin.vim
+++ b/src/nvim/testdir/test_regexp_latin.vim
@@ -1058,6 +1058,24 @@ 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
+
func Test_recursive_substitute_expr()
new
func Repl()