]> granicus.if.org Git - vim/commitdiff
patch 8.2.3149: some plugins have a problem with the error check v8.2.3149
authorBram Moolenaar <Bram@vim.org>
Sun, 11 Jul 2021 17:12:04 +0000 (19:12 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 11 Jul 2021 17:12:04 +0000 (19:12 +0200)
Problem:    Some plugins have a problem with the error check for using
            :command with -complete but without -nargs.
Solution:   In legacy script only give a warning message.

src/message.c
src/proto/message.pro
src/testdir/test_usercommands.vim
src/usercmd.c
src/version.c

index cb713d7210940d4fd597521f4b94c6a1f215bb16..7fb7264bd8ec9552a93a7f67a8ab883468dc4a7c 100644 (file)
@@ -3613,6 +3613,12 @@ verbose_open(void)
  */
     void
 give_warning(char_u *message, int hl)
+{
+    give_warning_with_source(message, hl, FALSE);
+}
+
+    void
+give_warning_with_source(char_u *message, int hl, int with_source)
 {
     // Don't do this for ":silent".
     if (msg_silent != 0)
@@ -3629,8 +3635,21 @@ give_warning(char_u *message, int hl)
        keep_msg_attr = HL_ATTR(HLF_W);
     else
        keep_msg_attr = 0;
-    if (msg_attr((char *)message, keep_msg_attr) && msg_scrolled == 0)
+
+    if (with_source)
+    {
+       // Do what msg() does, but with a column offset if the warning should
+       // be after the mode message.
+       msg_start();
+       msg_source(HL_ATTR(HLF_W));
+       msg_puts(" ");
+       msg_puts_attr((char *)message, HL_ATTR(HLF_W) | MSG_HIST);
+       msg_clr_eos();
+       (void)msg_end();
+    }
+    else if (msg_attr((char *)message, keep_msg_attr) && msg_scrolled == 0)
        set_keep_msg(message, keep_msg_attr);
+
     msg_didout = FALSE;            // overwrite this message
     msg_nowait = TRUE;     // don't wait for this message
     msg_col = 0;
index 16c33548406133f88f4d45100c04b014b5147fdc..d3ec9490308f45b15158745c004a0bff4936abb8 100644 (file)
@@ -69,6 +69,7 @@ void verbose_leave_scroll(void);
 void verbose_stop(void);
 int verbose_open(void);
 void give_warning(char_u *message, int hl);
+void give_warning_with_source(char_u *message, int hl, int with_source);
 void give_warning2(char_u *message, char_u *a1, int hl);
 void msg_advance(int col);
 int do_dialog(int type, char_u *title, char_u *message, char_u *buttons, int dfltbutton, char_u *textfield, int ex_cmd);
index 93312f1ecf4db51f904e8f598e926290cb46be39..f0f056f88ce2e4e66733b3223bad9bddb1d2fd45 100644 (file)
@@ -1,5 +1,7 @@
 " Tests for user defined commands
 
+source vim9.vim
+
 " Test for <mods> in user defined commands
 function Test_cmdmods()
   let g:mods = ''
@@ -270,13 +272,29 @@ func Test_CmdErrors()
   call assert_fails('com! -complete=custom DoCmd :', 'E467:')
   call assert_fails('com! -complete=customlist DoCmd :', 'E467:')
   call assert_fails('com! -complete=behave,CustomComplete DoCmd :', 'E468:')
-  call assert_fails('com! -complete=file DoCmd :', 'E1208:')
-  call assert_fails('com! -nargs=0 -complete=file DoCmd :', 'E1208:')
   call assert_fails('com! -nargs=x DoCmd :', 'E176:')
   call assert_fails('com! -count=1 -count=2 DoCmd :', 'E177:')
   call assert_fails('com! -count=x DoCmd :', 'E178:')
   call assert_fails('com! -range=x DoCmd :', 'E178:')
 
+  com! -complete=file DoCmd :
+  call assert_match('E1208:', v:warningmsg)
+  let v:warningmsg = ''
+  com! -nargs=0 -complete=file DoCmd :
+  call assert_match('E1208:', v:warningmsg)
+
+  let lines =<< trim END
+      vim9script
+      com! -complete=file DoCmd :
+  END
+  call CheckScriptFailure(lines, 'E1208', 2)
+
+  let lines =<< trim END
+      vim9script
+      com! -nargs=0 -complete=file DoCmd :
+  END
+  call CheckScriptFailure(lines, 'E1208', 2)
+
   com! -nargs=0 DoCmd :
   call assert_fails('DoCmd x', 'E488:')
 
index 94ebb43af09f89264598aa142284f099b6dd09a2..42b9014f38e2605757e5add0f51323934f469058 100644 (file)
@@ -1027,7 +1027,15 @@ ex_command(exarg_T *eap)
                  && STRNCMP(name, "Next", name_len > 4 ? 4 : name_len) == 0))
        emsg(_("E841: Reserved name, cannot be used for user defined command"));
     else if (compl > 0 && (argt & EX_EXTRA) == 0)
-       emsg(_(e_complete_used_without_nargs));
+    {
+       // Some plugins rely on silently ignoring the mistake, only make this
+       // an error in Vim9 script.
+       if (in_vim9script())
+           emsg(_(e_complete_used_without_nargs));
+       else
+           give_warning_with_source(
+                      (char_u *)_(e_complete_used_without_nargs), TRUE, TRUE);
+    }
     else
        uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg,
                                                  addr_type_arg, eap->forceit);
index 10e01ac86b42f4dd9c4ea8bf21e4067353869171..1102e94fc48c0e1f29d9150d6d5b2170ea4fa091 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3149,
 /**/
     3148,
 /**/