summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-12-04 11:57:00 +0000
committerBram Moolenaar <Bram@vim.org>2021-12-04 11:57:00 +0000
commitb579f6ebbfa826d228abec1e1b24c05894517c27 (patch)
tree97f9c2ade59a7794af2104b27ab87457410891e4
parentcd2f8f0e0007bb77fc2035e6ad6227bb6661c612 (diff)
downloadvim-git-b579f6ebbfa826d228abec1e1b24c05894517c27.tar.gz
patch 8.2.3733: Vim9: using "legacy" before range does not workv8.2.3733
Problem: Vim9: using "legacy" before range does not work. Solution: Skip over range before parsing command. (closes #9270)
-rw-r--r--src/testdir/test_vim9_cmd.vim5
-rw-r--r--src/usercmd.c1
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c11
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
@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3733,
+/**/
3732,
/**/
3731,
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;
}