]> granicus.if.org Git - vim/commitdiff
patch 8.2.1679: Vim9: ":*" is not recognized as a range v8.2.1679
authorBram Moolenaar <Bram@vim.org>
Mon, 14 Sep 2020 14:37:34 +0000 (16:37 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 14 Sep 2020 14:37:34 +0000 (16:37 +0200)
Problem:    Vim9: ":*" is not recognized as a range.
Solution:   Move recognizing "*" into skip_range(). (closes #6838)

src/cmdexpand.c
src/ex_docmd.c
src/ex_getln.c
src/proto/ex_docmd.pro
src/testdir/test_vim9_cmd.vim
src/userfunc.c
src/version.c
src/vim9compile.c

index 3ef3e1d8bd84a60fd2030e769c7dbe8f2eb8e20a..e7cf819981bc66998aa0439758e15f0d6dddc094 100644 (file)
@@ -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;
index 6495db6e833e8cc8f55321bb9e4038a67aeb03de..ed52b464bee7f2b8e970f633ba3ff212b4e47f14 100644 (file)
@@ -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;
 }
 
index 2c157ee52f3d95508f512592f3080fcc3209341c..b46748f7f75ad693b358eb435ae95c01d5feee68 100644 (file)
@@ -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;
 
index 3ed152316b7e666fed81456a8a7c73d8d64199f3..7d46f15d51bcc2a1a3ade38f8ff1a0f9d54ff168 100644 (file)
@@ -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);
index 4b4e58e9434aaf93a582d958c49581ee390fc0e3..6b97372786a9ec66841f6d8e1dc78538bf3b5077 100644 (file)
@@ -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
index d28125fdd205e331651e8511e238c879d42e3cef..53514de1d1efdfa58d932a3a07a9edab9aab7b06 100644 (file)
@@ -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'
index a59b82dd85ba7ac7489c9ea586389f7a674c1669..a04f93ca263603f6aef1302901a0c8e9a2cd74a7 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1679,
 /**/
     1678,
 /**/
index 4ef3fdccb2f4cf0606f82725546240190d102fb5..8a46b2f77737e2cac325b0e035636ed9711f9ad5 100644 (file)
@@ -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)