summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmdexpand.c2
-rw-r--r--src/ex_docmd.c13
-rw-r--r--src/ex_getln.c10
-rw-r--r--src/proto/ex_docmd.pro2
-rw-r--r--src/testdir/test_vim9_cmd.vim11
-rw-r--r--src/userfunc.c2
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c4
8 files changed, 33 insertions, 13 deletions
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index 3ef3e1d8b..e7cf81998 100644
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -992,7 +992,7 @@ set_one_cmd_context(
}
// 3. Skip over the range to find the command.
- cmd = skip_range(cmd, &xp->xp_context);
+ cmd = skip_range(cmd, TRUE, &xp->xp_context);
xp->xp_pattern = cmd;
if (*cmd == NUL)
return NULL;
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 6495db6e8..ed52b464b 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1779,9 +1779,7 @@ do_one_cmd(
may_have_range = !vim9script || starts_with_colon;
if (may_have_range)
#endif
- ea.cmd = skip_range(ea.cmd, NULL);
- if (*ea.cmd == '*' && vim_strchr(p_cpo, CPO_STAR) == NULL)
- ea.cmd = skipwhite(ea.cmd + 1);
+ ea.cmd = skip_range(ea.cmd, TRUE, NULL);
#ifdef FEAT_EVAL
if (vim9script && !starts_with_colon)
@@ -2683,7 +2681,7 @@ parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only)
return FAIL;
}
- p = skip_range(eap->cmd, NULL);
+ p = skip_range(eap->cmd, TRUE, NULL);
switch (*p)
{
// When adding an entry, also modify cmd_exists().
@@ -3534,7 +3532,8 @@ excmd_get_argt(cmdidx_T idx)
char_u *
skip_range(
char_u *cmd,
- int *ctx) // pointer to xp_context or NULL
+ int skip_star, // skip "*" used for Visual range
+ int *ctx) // pointer to xp_context or NULL
{
unsigned delim;
@@ -3569,6 +3568,10 @@ skip_range(
while (*cmd == ':')
cmd = skipwhite(cmd + 1);
+ // Skip "*" used for Visual range.
+ if (skip_star && *cmd == '*' && vim_strchr(p_cpo, CPO_STAR) == NULL)
+ cmd = skipwhite(cmd + 1);
+
return cmd;
}
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 2c157ee52..b46748f7f 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -187,8 +187,12 @@ set_search_match(pos_T *t)
* May change the last search pattern.
*/
static int
-do_incsearch_highlighting(int firstc, int *search_delim, incsearch_state_T *is_state,
- int *skiplen, int *patlen)
+do_incsearch_highlighting(
+ int firstc,
+ int *search_delim,
+ incsearch_state_T *is_state,
+ int *skiplen,
+ int *patlen)
{
char_u *cmd;
cmdmod_T save_cmdmod = cmdmod;
@@ -230,7 +234,7 @@ do_incsearch_highlighting(int firstc, int *search_delim, incsearch_state_T *is_s
parse_command_modifiers(&ea, &dummy, TRUE);
cmdmod = save_cmdmod;
- cmd = skip_range(ea.cmd, NULL);
+ cmd = skip_range(ea.cmd, TRUE, NULL);
if (vim_strchr((char_u *)"sgvl", *cmd) == NULL)
goto theend;
diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro
index 3ed152316..7d46f15d5 100644
--- a/src/proto/ex_docmd.pro
+++ b/src/proto/ex_docmd.pro
@@ -16,7 +16,7 @@ int modifier_len(char_u *cmd);
int cmd_exists(char_u *name);
cmdidx_T excmd_get_cmdidx(char_u *cmd, int len);
long excmd_get_argt(cmdidx_T idx);
-char_u *skip_range(char_u *cmd, int *ctx);
+char_u *skip_range(char_u *cmd, int skip_star, int *ctx);
void ex_ni(exarg_T *eap);
int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp);
void separate_nextcmd(exarg_T *eap);
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index 4b4e58e94..6b9737278 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -330,6 +330,17 @@ def Test_put_command()
bwipe!
enddef
+def Test_command_star_range()
+ new
+ setline(1, ['xxx foo xxx', 'xxx bar xxx', 'xxx foo xx bar'])
+ setpos("'<", [0, 1, 0, 0])
+ setpos("'>", [0, 3, 0, 0])
+ :*s/\(foo\|bar\)/baz/g
+ getline(1, 3)->assert_equal(['xxx baz xxx', 'xxx baz xxx', 'xxx baz xx baz'])
+
+ bwipe!
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/userfunc.c b/src/userfunc.c
index d28125fdd..53514de1d 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -3150,7 +3150,7 @@ def_function(exarg_T *eap, char_u *name_arg)
}
// Check for ":append", ":change", ":insert". Not for :def.
- p = skip_range(p, NULL);
+ p = skip_range(p, FALSE, NULL);
if (eap->cmdidx != CMD_def
&& ((p[0] == 'a' && (!ASCII_ISALPHA(p[1]) || p[1] == 'p'))
|| (p[0] == 'c'
diff --git a/src/version.c b/src/version.c
index a59b82dd8..a04f93ca2 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1679,
+/**/
1678,
/**/
1677,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 4ef3fdccb..8a46b2f77 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -4276,7 +4276,7 @@ compile_return(char_u *arg, int set_return_type, cctx_T *cctx)
}
if (need_type(stack_type, cctx->ctx_ufunc->uf_ret_type, -1,
cctx, FALSE) == FAIL)
- return NULL;
+ return NULL;
}
}
else
@@ -6830,7 +6830,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
cmd = ea.cmd;
if (*cmd != '\'' || starts_with_colon)
{
- ea.cmd = skip_range(ea.cmd, NULL);
+ ea.cmd = skip_range(ea.cmd, TRUE, NULL);
if (ea.cmd > cmd)
{
if (!starts_with_colon)