summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-07-11 19:12:04 +0200
committerBram Moolenaar <Bram@vim.org>2021-07-11 19:12:04 +0200
commitcc7eb2aa7a7f2e6ae41f1e7cf60965c083d8a9e9 (patch)
tree5d54a35c88c61f041e7cdd16ba3ad9aa40a084ef
parent5231224e11bf468f5366a7400414368908c40795 (diff)
patch 8.2.3149: some plugins have a problem with the error checkv8.2.3149
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.
-rw-r--r--src/message.c21
-rw-r--r--src/proto/message.pro1
-rw-r--r--src/testdir/test_usercommands.vim22
-rw-r--r--src/usercmd.c10
-rw-r--r--src/version.c2
5 files changed, 52 insertions, 4 deletions
diff --git a/src/message.c b/src/message.c
index cb713d7210..7fb7264bd8 100644
--- a/src/message.c
+++ b/src/message.c
@@ -3614,6 +3614,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)
return;
@@ -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;
diff --git a/src/proto/message.pro b/src/proto/message.pro
index 16c3354840..d3ec949030 100644
--- a/src/proto/message.pro
+++ b/src/proto/message.pro
@@ -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);
diff --git a/src/testdir/test_usercommands.vim b/src/testdir/test_usercommands.vim
index 93312f1ecf..f0f056f88c 100644
--- a/src/testdir/test_usercommands.vim
+++ b/src/testdir/test_usercommands.vim
@@ -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:')
diff --git a/src/usercmd.c b/src/usercmd.c
index 94ebb43af0..42b9014f38 100644
--- a/src/usercmd.c
+++ b/src/usercmd.c
@@ -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);
diff --git a/src/version.c b/src/version.c
index 10e01ac86b..1102e94fc4 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3149,
+/**/
3148,
/**/
3147,