]> granicus.if.org Git - vim/commitdiff
patch 8.2.4510: Vim9: shortening commands leads to confusing script v8.2.4510
authorBram Moolenaar <Bram@vim.org>
Sat, 5 Mar 2022 12:56:44 +0000 (12:56 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 5 Mar 2022 12:56:44 +0000 (12:56 +0000)
Problem:    Vim9: shortening commands leads to confusing script.
Solution:   In Vim9 script require at least ":cont" for ":continue", "const"
            instead of "cons", "break" instead of "brea", "catch" instead of
            "cat", "else" instead of "el" "elseif" instead of "elsei" "endfor"
            instead of "endfo" "endif" instead of "en" "endtry" instead of
            "endt", "finally" instead of "fina", "throw" instead of "th",
            "while" instead of "wh".

src/errors.h
src/evalvars.c
src/ex_cmds.h
src/ex_docmd.c
src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 82708d3bfa9af11fa15b34dbaa04f3774597869c..9a2c394bc5a1a929118b56d2eefb4bf08b91d5c9 100644 (file)
@@ -2761,9 +2761,9 @@ EXTERN char e_type_mismatch_for_v_variable[]
 #endif
 EXTERN char e_yank_register_changed_while_using_it[]
        INIT(= N_("E1064: Yank register changed while using it"));
+EXTERN char e_command_cannot_be_shortened[]
+       INIT(= N_("E1065: Command cannot be shortened: %s"));
 #ifdef FEAT_EVAL
-EXTERN char e_must_use_var_instead_of_va[]
-       INIT(= N_("E1065: Must use :var instead of :va"));
 EXTERN char e_cannot_declare_a_register_str[]
        INIT(= N_("E1066: Cannot declare a register: %s"));
 EXTERN char e_separator_mismatch_str[]
index 56ac3daa7e7abf66c61c4468b2c0d83e2a8f71d5..44882cae2f5335f4f08176e4d97d0f5caf22e700 100644 (file)
@@ -768,11 +768,6 @@ ex_var(exarg_T *eap)
        emsg(_(e_cannot_declare_variable_on_command_line));
        return;
     }
-    if (eap->arg > eap->cmd && !has_var)
-    {
-       emsg(_(e_must_use_var_instead_of_va));
-       return;
-    }
     ex_let(eap);
 }
 
index 3cdb656c990eeed471b1b64269fbbaa82b7d2ce8..40e5075701adbead91e484f2d5ac779a4f6050e7 100644 (file)
@@ -58,6 +58,7 @@
 #define EX_NONWHITE_OK 0x2000000  // command can be followed by non-white
 #define EX_KEEPSCRIPT  0x4000000  // keep sctx of where command was invoked
 #define EX_EXPR_ARG    0x8000000  // argument is an expression
+#define EX_WHOLE      0x10000000  // command name cannot be shortened in Vim9
 
 #define EX_FILES (EX_XFILE | EX_EXTRA) // multiple extra files allowed
 #define EX_FILE1 (EX_FILES | EX_NOSPC) // 1 file, defaults to current file
@@ -221,7 +222,7 @@ EXCMD(CMD_brewind,  "brewind",      ex_brewind,
        EX_BANG|EX_RANGE|EX_CMDARG|EX_TRLBAR,
        ADDR_OTHER),
 EXCMD(CMD_break,       "break",        ex_break,
-       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_breakadd,    "breakadd",     ex_breakadd,
        EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
@@ -281,7 +282,7 @@ EXCMD(CMD_call,             "call",         ex_call,
        EX_RANGE|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
        ADDR_LINES),
 EXCMD(CMD_catch,       "catch",        ex_catch,
-       EX_EXTRA|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_EXTRA|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_cbuffer,     "cbuffer",      ex_cbuffer,
        EX_BANG|EX_RANGE|EX_WORD1|EX_TRLBAR,
@@ -413,7 +414,7 @@ EXCMD(CMD_confirm,  "confirm",      ex_wrongmodifier,
        EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_CMDWIN|EX_LOCK_OK,
        ADDR_NONE),
 EXCMD(CMD_const,       "const",        ex_let,
-       EX_EXTRA|EX_BANG|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_EXTRA|EX_BANG|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_copen,       "copen",        ex_copen,
        EX_RANGE|EX_COUNT|EX_TRLBAR,
@@ -548,16 +549,16 @@ EXCMD(CMD_echon,  "echon",        ex_echo,
        EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
        ADDR_NONE),
 EXCMD(CMD_else,                "else",         ex_else,
-       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_elseif,      "elseif",       ex_else,
-       EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_emenu,       "emenu",        ex_emenu,
        EX_NEEDARG|EX_EXTRA|EX_TRLBAR|EX_NOTRLCOM|EX_RANGE|EX_CMDWIN|EX_LOCK_OK,
        ADDR_OTHER),
 EXCMD(CMD_endif,       "endif",        ex_endif,
-       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_endinterface,        "endinterface", ex_ni,
        EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
@@ -575,13 +576,13 @@ EXCMD(CMD_endfunction,    "endfunction",  ex_endfunction,
        EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
        ADDR_NONE),
 EXCMD(CMD_endfor,      "endfor",       ex_endwhile,
-       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_endtry,      "endtry",       ex_endtry,
-       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_endwhile,    "endwhile",     ex_endwhile,
-       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_enew,                "enew",         ex_edit,
        EX_BANG|EX_TRLBAR,
@@ -623,10 +624,10 @@ EXCMD(CMD_find,           "find",         ex_find,
        EX_RANGE|EX_BANG|EX_FILE1|EX_CMDARG|EX_ARGOPT|EX_TRLBAR|EX_NEEDARG,
        ADDR_OTHER),
 EXCMD(CMD_final,       "final",        ex_let,
-       EX_EXTRA|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_EXTRA|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_finally,     "finally",      ex_finally,
-       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_finish,      "finish",       ex_finish,
        EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
@@ -1601,7 +1602,7 @@ EXCMD(CMD_tfirst, "tfirst",       ex_tag,
        EX_RANGE|EX_BANG|EX_TRLBAR|EX_ZEROR,
        ADDR_OTHER),
 EXCMD(CMD_throw,       "throw",        ex_throw,
-       EX_EXTRA|EX_NEEDARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_EXTRA|EX_NEEDARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_tjump,       "tjump",        ex_tag,
        EX_BANG|EX_TRLBAR|EX_WORD1,
@@ -1694,7 +1695,7 @@ EXCMD(CMD_vglobal,        "vglobal",      ex_global,
        EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_DFLALL|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK,
        ADDR_LINES),
 EXCMD(CMD_var,         "var",          ex_var,
-       EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_version,     "version",      ex_version,
        EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
@@ -1763,7 +1764,7 @@ EXCMD(CMD_wall,           "wall",         do_wqall,
        EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
        ADDR_NONE),
 EXCMD(CMD_while,       "while",        ex_while,
-       EX_EXTRA|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_EXTRA|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_WHOLE,
        ADDR_NONE),
 EXCMD(CMD_winsize,     "winsize",      ex_winsize,
        EX_EXTRA|EX_NEEDARG|EX_TRLBAR,
index 287045bc5dfbbdc67482fbecf783ff6ea0417a75..6b2bdd4e5cf9e09cb93a181aa470f849ec398abc 100644 (file)
@@ -3745,16 +3745,27 @@ find_ex_command(
                                                            (size_t)len) == 0)
            {
 #ifdef FEAT_EVAL
-               if (full != NULL
-                          && cmdnames[(int)eap->cmdidx].cmd_name[len] == NUL)
+               if (full != NULL && cmdnames[eap->cmdidx].cmd_name[len] == NUL)
                    *full = TRUE;
 #endif
                break;
            }
 
-       // :Print and :mode are not supported in Vim9 script
-       if (vim9 && (eap->cmdidx == CMD_mode || eap->cmdidx == CMD_Print))
-           eap->cmdidx = CMD_SIZE;
+       // :Print and :mode are not supported in Vim9 script.
+       // Some commands cannot be shortened in Vim9 script.
+       // ":continue" needs at least ":cont", since ":con" looks weird.
+       if (vim9 && eap->cmdidx != CMD_SIZE)
+       {
+           if (eap->cmdidx == CMD_mode || eap->cmdidx == CMD_Print)
+               eap->cmdidx = CMD_SIZE;
+           else if (((cmdnames[eap->cmdidx].cmd_argt & EX_WHOLE)
+                         && len < (int)STRLEN(cmdnames[eap->cmdidx].cmd_name))
+                     || (eap->cmdidx == CMD_continue && len < 4))
+           {
+               semsg(_(e_command_cannot_be_shortened), eap->cmd);
+               eap->cmdidx = CMD_SIZE;
+           }
+       }
 
        // Do not recognize ":*" as the star command unless '*' is in
        // 'cpoptions'.
@@ -3775,8 +3786,8 @@ find_ex_command(
            eap->cmdidx = CMD_SIZE;
     }
 
-    // ":fina" means ":finally" for backwards compatibility.
-    if (eap->cmdidx == CMD_final && p - eap->cmd == 4)
+    // ":fina" means ":finally" in legacy script, for backwards compatibility.
+    if (eap->cmdidx == CMD_final && p - eap->cmd == 4 && !vim9)
        eap->cmdidx = CMD_finally;
 
 #ifdef FEAT_EVAL
index f60fb36bc3caf806dd11c90cf2249bd95cf448b2..a503d113ef2dc16d683f57c7b8ddf8d599e8818e 100644 (file)
@@ -460,7 +460,7 @@ def Test_try_catch_throw()
     endtry
   catch /wrong/
     add(l, 'caught')
-  fina
+  finally
     add(l, 'finally')
   endtry
   assert_equal(['1', 'caught', 'finally'], l)
@@ -1004,7 +1004,7 @@ enddef
 def s:ReturnFinally(): string
   try
     return 'intry'
-  finall
+  finally
     g:in_finally = 'finally'
   endtry
   return 'end'
@@ -3374,6 +3374,37 @@ def Run_test_reject_declaration()
   g:StopVimInTerminal(buf)
 enddef
 
+def Test_minimal_command_name_length()
+  var names = [
+       'cons',
+       'brea',
+       'cat',
+       'catc',
+       'con',
+       'el',
+       'els',
+       'elsei',
+       'endfo',
+       'en',
+       'end',
+       'endi',
+       'endw',
+       'endt',
+       'endtr',
+       'fina',
+       'finall',
+       'th',
+       'thr',
+       'thro',
+       'wh',
+       'whi',
+       'whil',
+      ]
+  for name in names
+    v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
+  endfor
+enddef
+
 def Test_unset_any_variable()
   var lines =<< trim END
     var name: any
index 999f8ac431b832f9f2134f813e31548dbde938b6..3766c1154aeeb46a8d8c0918ee629dd903a169d3 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4510,
 /**/
     4509,
 /**/
index 52c60fb9cace7f9d3e43b136274239ab3d830218..634f24e1ecc84494ecd88a34f55ac51e140fedee 100644 (file)
@@ -1883,13 +1883,6 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
     lhs_T      lhs;
     long       start_lnum = SOURCING_LNUM;
 
-    p = eap->cmd;
-    if (eap->cmdidx == CMD_var && arg > p && !checkforcmd_noparen(&p, "var", 3))
-    {
-       emsg(_(e_must_use_var_instead_of_va));
-       return NULL;
-    }
-
     // Skip over the "varname" or "[varname, varname]" to get to any "=".
     p = skip_var_list(arg, TRUE, &var_count, &semicolon, TRUE);
     if (p == NULL)