From b579f6ebbfa826d228abec1e1b24c05894517c27 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 4 Dec 2021 11:57:00 +0000 Subject: [PATCH] patch 8.2.3733: Vim9: using "legacy" before range does not work Problem: Vim9: using "legacy" before range does not work. Solution: Skip over range before parsing command. (closes #9270) --- src/testdir/test_vim9_cmd.vim | 5 +++++ src/usercmd.c | 1 + src/version.c | 2 ++ src/vim9compile.c | 11 ++++------- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index 22b1896a1..ffb2bb813 100644 --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -1019,6 +1019,11 @@ def Test_range_after_command_modifier() CheckScriptSuccess(['vim9script', 'silent keepjump :1d _']) assert_equal('', getline(1)) bwipe! + + var lines =<< trim END + legacy /pat/ + END + CheckDefExecAndScriptFailure(lines, 'E486: Pattern not found: pat') enddef def Test_silent_pattern() diff --git a/src/usercmd.c b/src/usercmd.c index 332f99536..16fbb0db3 100644 --- a/src/usercmd.c +++ b/src/usercmd.c @@ -1394,6 +1394,7 @@ produce_cmdmods(char_u *buf, cmdmod_T *cmod, int quote) #ifdef HAVE_SANDBOX {CMOD_SANDBOX, "sandbox"}, #endif + {CMOD_LEGACY, "legacy"}, {0, NULL} }; diff --git a/src/version.c b/src/version.c index 6fb7e78be..cdc01a3a7 100644 --- a/src/version.c +++ b/src/version.c @@ -753,6 +753,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3733, /**/ 3732, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 70cf0b4e9..52e5ac8cc 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -9903,15 +9903,15 @@ compile_def_function( * in "$ENV->func()" the "$" is not a range */ cmd = ea.cmd; - if (!(local_cmdmod.cmod_flags & CMOD_LEGACY) - && (*cmd != '$' || starts_with_colon) + if ((*cmd != '$' || starts_with_colon) && (starts_with_colon || !(*cmd == '\'' || (cmd[0] == cmd[1] && (*cmd == '+' || *cmd == '-'))))) { ea.cmd = skip_range(ea.cmd, TRUE, NULL); if (ea.cmd > cmd) { - if (!starts_with_colon) + if (!starts_with_colon + && !(local_cmdmod.cmod_flags & CMOD_LEGACY)) { semsg(_(e_colon_required_before_range_str), cmd); goto erret; @@ -9920,11 +9920,8 @@ compile_def_function( if (ends_excmd2(line, ea.cmd)) { // A range without a command: jump to the line. - line = skipwhite(line); - while (*line == ':') - ++line; generate_EXEC(&cctx, ISN_EXECRANGE, - vim_strnsave(line, ea.cmd - line)); + vim_strnsave(cmd, ea.cmd - cmd)); line = ea.cmd; goto nextline; } -- 2.40.0