]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.4633: Visual range does not work before command modifiers v8.2.4633
authorBram Moolenaar <Bram@vim.org>
Sun, 27 Mar 2022 12:36:50 +0000 (13:36 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 27 Mar 2022 12:36:50 +0000 (13:36 +0100)
Problem:    Visual range does not work before command modifiers.
Solution:   Move Visual range to after command modifiers.

src/ex_docmd.c
src/testdir/test_source.vim
src/version.c

index 5e7cb83649b1ee4402a346af5f0861159c59f4c8..9b3504f76e72c9d25aaccc81e69d4f83905e708c 100644 (file)
@@ -2782,13 +2782,25 @@ parse_command_modifiers(
        cmdmod_T    *cmod,
        int         skip_only)
 {
+    char_u  *cmd_start;
     char_u  *p;
     int            starts_with_colon = FALSE;
     int            vim9script = in_vim9script();
+    int            has_visual_range = FALSE;
 
     CLEAR_POINTER(cmod);
     cmod->cmod_flags = sticky_cmdmod_flags;
 
+    if (STRNCMP(eap->cmd, "'<,'>", 5) == 0)
+    {
+       // The automatically inserted Visual area range is skipped, so that
+       // typing ":cmdmod cmd" in Visual mode works without having to move the
+       // range to after the modififiers.
+       eap->cmd += 5;
+       cmd_start = eap->cmd;
+       has_visual_range = TRUE;
+    }
+
     // Repeat until no more command modifiers are found.
     for (;;)
     {
@@ -2849,12 +2861,11 @@ parse_command_modifiers(
        {
            char_u *s, *n;
 
-           for (s = p; ASCII_ISALPHA(*s); ++s)
+           for (s = eap->cmd; ASCII_ISALPHA(*s); ++s)
                ;
            n = skipwhite(s);
-           if (vim_strchr((char_u *)".=", *n) != NULL
-                   || *s == '['
-                   || (*n != NUL && n[1] == '='))
+           if (*n == '.' || *n == '=' || (*n != NUL && n[1] == '=')
+                   || *s == '[')
                break;
        }
 
@@ -3081,6 +3092,17 @@ parse_command_modifiers(
        break;
     }
 
+    if (has_visual_range && eap->cmd > cmd_start)
+    {
+       // Move the '<,'> range to after the modifiers and insert a colon.
+       // Since the modifiers have been parsed put the colon on top of the
+       // space: "'<,'>mod cmd" -> "mod:'<,'>cmd
+       // Put eap->cmd after the colon.
+       mch_memmove(cmd_start - 5, cmd_start, eap->cmd - cmd_start);
+       eap->cmd -= 5;
+       mch_memmove(eap->cmd - 1, ":'<,'>", 6);
+    }
+
     return OK;
 }
 
index 010401084cdf3752c4ff6c236b9d280d9ef6c37d..35d14537476dc712df6bd94e2d46f3660206cc70 100644 (file)
@@ -579,6 +579,13 @@ func Test_source_buffer_vim9()
   call assert_equal(#{pi: 3.12, e: 2.71828}, g:Math)
   call assert_equal(['vim', 'nano'], g:Editors)
 
+  " '<,'> range before the cmd modifier works
+  unlet g:Math
+  unlet g:Editors
+  exe "normal 6GV4j:vim9cmd source\<CR>"
+  call assert_equal(['vim', 'nano'], g:Editors)
+  unlet g:Editors
+
   " test for using try/catch
   %d _
   let lines =<< trim END
index 962fa0ba181c2e92335e0f1af02cc451046323c2..169468b0ec1ff96d0db8464af5bd2f3f13de1886 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4633,
 /**/
     4632,
 /**/