patch 8.2.2511: Vim9: cannot use Vim9 script syntax in some places

Problem:    Vim9: cannot use Vim9 script syntax in some places.
Solution:   Add the :vim9cmd command modifier. Incompatible: Makes ":vim9"
            mean ":vim9cmd" instead of ":vim9script".
diff --git a/src/errors.h b/src/errors.h
index 927e1ff..05f90b1 100644
--- a/src/errors.h
+++ b/src/errors.h
@@ -363,3 +363,5 @@
 	INIT(= N_("E1162: Register name must be one character: %s"));
 EXTERN char e_variable_nr_type_mismatch_expected_str_but_got_str[]
 	INIT(= N_("E1163: Variable %d: type mismatch, expected %s but got %s"));
+EXTERN char e_vim9cmd_must_be_followed_by_command[]
+	INIT(= N_("E1164: vim9cmd must be followed by a command"));
diff --git a/src/ex_cmdidxs.h b/src/ex_cmdidxs.h
index 290e9fa..8afc445 100644
--- a/src/ex_cmdidxs.h
+++ b/src/ex_cmdidxs.h
@@ -27,10 +27,10 @@
   /* t */ 458,
   /* u */ 503,
   /* v */ 514,
-  /* w */ 534,
-  /* x */ 548,
-  /* y */ 558,
-  /* z */ 559
+  /* w */ 535,
+  /* x */ 549,
+  /* y */ 559,
+  /* z */ 560
 };
 
 /*
@@ -62,11 +62,11 @@
   /* s */ {  2,  6, 15,  0, 19, 23,  0, 25, 26,  0,  0, 29, 31, 35, 39, 41,  0, 50,  0, 51,  0, 63, 64,  0, 65,  0 },
   /* t */ {  2,  0, 19,  0, 24, 26,  0, 27,  0, 28,  0, 29, 33, 36, 38, 39,  0, 40, 42,  0, 43,  0,  0,  0,  0,  0 },
   /* u */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
-  /* v */ {  1,  0,  0,  0,  2,  0,  0,  0,  5,  0,  0,  0, 11, 14,  0,  0,  0,  0, 17,  0, 18,  0,  0,  0,  0,  0 },
+  /* v */ {  1,  0,  0,  0,  2,  0,  0,  0,  5,  0,  0,  0, 12, 15,  0,  0,  0,  0, 18,  0, 19,  0,  0,  0,  0,  0 },
   /* w */ {  2,  0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  0,  0,  8,  0,  9, 10,  0,  0,  0, 12, 13,  0,  0,  0,  0 },
   /* x */ {  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  5,  0,  0,  0,  7,  0,  0,  8,  0,  0,  0,  0,  0 },
   /* y */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
   /* z */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }
 };
 
-static const int command_count = 574;
+static const int command_count = 575;
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index 01c6156..e82e91b 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -1679,6 +1679,9 @@
 EXCMD(CMD_vimgrepadd,	"vimgrepadd",	ex_vimgrep,
 	EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE|EX_LOCK_OK,
 	ADDR_OTHER),
+EXCMD(CMD_vim9cmd,	"vim9cmd",	ex_wrongmodifier,
+	EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_CMDWIN|EX_LOCK_OK,
+	ADDR_NONE),
 EXCMD(CMD_vim9script,	"vim9script",	ex_vim9script,
 	EX_WORD1|EX_CMDWIN|EX_LOCK_OK,
 	ADDR_NONE),
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 9409d7c..0bb5142 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1737,7 +1737,7 @@
     int		starts_with_colon = FALSE;
 #ifdef FEAT_EVAL
     int		may_have_range;
-    int		vim9script = in_vim9script();
+    int		vim9script;
     int		did_set_expr_line = FALSE;
 #endif
     int		sourcing = flags & DOCMD_VERBOSE;
@@ -1785,7 +1785,7 @@
     if (parse_command_modifiers(&ea, &errormsg, &cmdmod, FALSE) == FAIL)
 	goto doend;
     apply_cmdmod(&cmdmod);
-
+    vim9script = in_vim9script();
     after_modifier = ea.cmd;
 
 #ifdef FEAT_EVAL
@@ -2933,6 +2933,17 @@
 			    cmod->cmod_split |= WSP_VERT;
 			    continue;
 			}
+			if (checkforcmd(&eap->cmd, "vim9cmd", 4))
+			{
+			    if (ends_excmd2(p, eap->cmd))
+			    {
+				*errormsg =
+				      _(e_vim9cmd_must_be_followed_by_command);
+				return FAIL;
+			    }
+			    cmod->cmod_flags |= CMOD_VIM9CMD;
+			    continue;
+			}
 			if (!checkforcmd(&p, "verbose", 4))
 			    break;
 			if (vim_isdigit(*eap->cmd))
diff --git a/src/structs.h b/src/structs.h
index 550e53a..7bcbc38 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -642,6 +642,7 @@
 #define CMOD_LOCKMARKS	    0x0800	// ":lockmarks"
 #define CMOD_KEEPPATTERNS   0x1000	// ":keeppatterns"
 #define CMOD_NOSWAPFILE	    0x2000	// ":noswapfile"
+#define CMOD_VIM9CMD	    0x4000	// ":vim9cmd"
 
     int		cmod_split;		// flags for win_split()
     int		cmod_tab;		// > 0 when ":tab" was used
diff --git a/src/testdir/dumps/Test_wildmenu_1.dump b/src/testdir/dumps/Test_wildmenu_1.dump
index a118969..76b930d 100644
--- a/src/testdir/dumps/Test_wildmenu_1.dump
+++ b/src/testdir/dumps/Test_wildmenu_1.dump
@@ -4,5 +4,5 @@
 |~| @73
 |~| @73
 |~| @73
-|v+0#0000001#ffff4012|i|m|9|s|c|r|i|p|t| +3#0000000#ffffff0@1|v|i|m|g|r|e|p| @1|v|i|m|g|r|e|p|a|d@1| @43
-|:+0&&|v|i|m|9|s|c|r|i|p|t> @63
+|v+0#0000001#ffff4012|i|m|9|c|m|d| +3#0000000#ffffff0@1|v|i|m|9|s|c|r|i|p|t| @1|v|i|m|g|r|e|p| @1|v|i|m|g|r|e|p|a|d@1| @34
+|:+0&&|v|i|m|9|c|m|d> @66
diff --git a/src/testdir/dumps/Test_wildmenu_2.dump b/src/testdir/dumps/Test_wildmenu_2.dump
index 46b41ae..17b6b02 100644
--- a/src/testdir/dumps/Test_wildmenu_2.dump
+++ b/src/testdir/dumps/Test_wildmenu_2.dump
@@ -4,5 +4,5 @@
 |~| @73
 |~| @73
 |~| @73
-|v+3#0000000&|i|m|9|s|c|r|i|p|t| @1|v+0#0000001#ffff4012|i|m|g|r|e|p| +3#0000000#ffffff0@1|v|i|m|g|r|e|p|a|d@1| @43
-|:+0&&|v|i|m|g|r|e|p> @66
+|v+3#0000000&|i|m|9|c|m|d| @1|v+0#0000001#ffff4012|i|m|9|s|c|r|i|p|t| +3#0000000#ffffff0@1|v|i|m|g|r|e|p| @1|v|i|m|g|r|e|p|a|d@1| @34
+|:+0&&|v|i|m|9|s|c|r|i|p|t> @63
diff --git a/src/testdir/dumps/Test_wildmenu_3.dump b/src/testdir/dumps/Test_wildmenu_3.dump
index 4474936..578c8f0 100644
--- a/src/testdir/dumps/Test_wildmenu_3.dump
+++ b/src/testdir/dumps/Test_wildmenu_3.dump
@@ -4,5 +4,5 @@
 |~| @73
 |~| @73
 |~| @73
-|v+3#0000000&|i|m|9|s|c|r|i|p|t| @1|v|i|m|g|r|e|p| @1|v+0#0000001#ffff4012|i|m|g|r|e|p|a|d@1| +3#0000000#ffffff0@43
-|:+0&&|v|i|m|g|r|e|p|a|d@1> @63
+|v+3#0000000&|i|m|9|c|m|d| @1|v|i|m|9|s|c|r|i|p|t| @1|v+0#0000001#ffff4012|i|m|g|r|e|p| +3#0000000#ffffff0@1|v|i|m|g|r|e|p|a|d@1| @34
+|:+0&&|v|i|m|g|r|e|p> @66
diff --git a/src/testdir/dumps/Test_wildmenu_4.dump b/src/testdir/dumps/Test_wildmenu_4.dump
index 3703fd5..4b16a37 100644
--- a/src/testdir/dumps/Test_wildmenu_4.dump
+++ b/src/testdir/dumps/Test_wildmenu_4.dump
@@ -4,5 +4,5 @@
 |~| @73
 |~| @73
 |~| @73
-|v+3#0000000&|i|m|9|s|c|r|i|p|t| @1|v|i|m|g|r|e|p| @1|v|i|m|g|r|e|p|a|d@1| @43
+|v+3#0000000&|i|m|9|c|m|d| @1|v|i|m|9|s|c|r|i|p|t| @1|v|i|m|g|r|e|p| @1|v|i|m|g|r|e|p|a|d@1| @34
 |:+0&&|v|i|m> @70
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 8faa25f..05d90f7 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -119,7 +119,7 @@
   call term_sendkeys(buf, "\<Tab>")
   call VerifyScreenDump(buf, 'Test_wildmenu_3', {})
 
-  call term_sendkeys(buf, "\<Tab>")
+  call term_sendkeys(buf, "\<Tab>\<Tab>")
   call VerifyScreenDump(buf, 'Test_wildmenu_4', {})
   call term_sendkeys(buf, "\<Esc>")
 
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 6826acf..6ade326 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -709,7 +709,7 @@
   var dir = 'Xruntime/after'
   &rtp ..= ',' .. dir
   mkdir(dir .. '/ftplugin', 'p')
-  writefile(['vim9'], dir .. '/ftplugin/qf.vim')
+  writefile(['vim9script'], dir .. '/ftplugin/qf.vim')
   filetype plugin on
   silent helpgrep grail
   cwindow
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index ef0a5fe..42c51b4 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -5,6 +5,16 @@
 source term_util.vim
 source view_util.vim
 
+def Test_vim9cmd()
+  var lines =<< trim END
+    vim9cmd var x = 123
+    let s:y = 'yes'
+    vim9c assert_equal(123, x)
+    vim9cm assert_equal('yes', y)
+  END
+  CheckScriptSuccess(lines)
+enddef
+
 def Test_edit_wildcards()
   var filename = 'Xtest'
   edit `=filename`
diff --git a/src/version.c b/src/version.c
index 264df9b..c911822 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2511,
+/**/
     2510,
 /**/
     2509,