0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.4510: Vim9: shortening commands leads to confusing script

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".
This commit is contained in:
Bram Moolenaar 2022-03-05 12:56:44 +00:00
parent e1d1211799
commit 204852ae2a
7 changed files with 70 additions and 37 deletions

View File

@ -2761,9 +2761,9 @@ EXTERN char e_type_mismatch_for_v_variable[]
#endif #endif
EXTERN char e_yank_register_changed_while_using_it[] EXTERN char e_yank_register_changed_while_using_it[]
INIT(= N_("E1064: 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 #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[] EXTERN char e_cannot_declare_a_register_str[]
INIT(= N_("E1066: Cannot declare a register: %s")); INIT(= N_("E1066: Cannot declare a register: %s"));
EXTERN char e_separator_mismatch_str[] EXTERN char e_separator_mismatch_str[]

View File

@ -768,11 +768,6 @@ ex_var(exarg_T *eap)
emsg(_(e_cannot_declare_variable_on_command_line)); emsg(_(e_cannot_declare_variable_on_command_line));
return; return;
} }
if (eap->arg > eap->cmd && !has_var)
{
emsg(_(e_must_use_var_instead_of_va));
return;
}
ex_let(eap); ex_let(eap);
} }

View File

@ -58,6 +58,7 @@
#define EX_NONWHITE_OK 0x2000000 // command can be followed by non-white #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_KEEPSCRIPT 0x4000000 // keep sctx of where command was invoked
#define EX_EXPR_ARG 0x8000000 // argument is an expression #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_FILES (EX_XFILE | EX_EXTRA) // multiple extra files allowed
#define EX_FILE1 (EX_FILES | EX_NOSPC) // 1 file, defaults to current file #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, EX_BANG|EX_RANGE|EX_CMDARG|EX_TRLBAR,
ADDR_OTHER), ADDR_OTHER),
EXCMD(CMD_break, "break", ex_break, 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), ADDR_NONE),
EXCMD(CMD_breakadd, "breakadd", ex_breakadd, EXCMD(CMD_breakadd, "breakadd", ex_breakadd,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, 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, EX_RANGE|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
ADDR_LINES), ADDR_LINES),
EXCMD(CMD_catch, "catch", ex_catch, 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), ADDR_NONE),
EXCMD(CMD_cbuffer, "cbuffer", ex_cbuffer, EXCMD(CMD_cbuffer, "cbuffer", ex_cbuffer,
EX_BANG|EX_RANGE|EX_WORD1|EX_TRLBAR, 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, EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),
EXCMD(CMD_const, "const", ex_let, 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), ADDR_NONE),
EXCMD(CMD_copen, "copen", ex_copen, EXCMD(CMD_copen, "copen", ex_copen,
EX_RANGE|EX_COUNT|EX_TRLBAR, 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, EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),
EXCMD(CMD_else, "else", ex_else, 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), ADDR_NONE),
EXCMD(CMD_elseif, "elseif", ex_else, 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), ADDR_NONE),
EXCMD(CMD_emenu, "emenu", ex_emenu, EXCMD(CMD_emenu, "emenu", ex_emenu,
EX_NEEDARG|EX_EXTRA|EX_TRLBAR|EX_NOTRLCOM|EX_RANGE|EX_CMDWIN|EX_LOCK_OK, EX_NEEDARG|EX_EXTRA|EX_TRLBAR|EX_NOTRLCOM|EX_RANGE|EX_CMDWIN|EX_LOCK_OK,
ADDR_OTHER), ADDR_OTHER),
EXCMD(CMD_endif, "endif", ex_endif, 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), ADDR_NONE),
EXCMD(CMD_endinterface, "endinterface", ex_ni, EXCMD(CMD_endinterface, "endinterface", ex_ni,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, 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, EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),
EXCMD(CMD_endfor, "endfor", ex_endwhile, 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), ADDR_NONE),
EXCMD(CMD_endtry, "endtry", ex_endtry, 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), ADDR_NONE),
EXCMD(CMD_endwhile, "endwhile", ex_endwhile, 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), ADDR_NONE),
EXCMD(CMD_enew, "enew", ex_edit, EXCMD(CMD_enew, "enew", ex_edit,
EX_BANG|EX_TRLBAR, 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, EX_RANGE|EX_BANG|EX_FILE1|EX_CMDARG|EX_ARGOPT|EX_TRLBAR|EX_NEEDARG,
ADDR_OTHER), ADDR_OTHER),
EXCMD(CMD_final, "final", ex_let, 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), ADDR_NONE),
EXCMD(CMD_finally, "finally", ex_finally, 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), ADDR_NONE),
EXCMD(CMD_finish, "finish", ex_finish, EXCMD(CMD_finish, "finish", ex_finish,
EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK, 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, EX_RANGE|EX_BANG|EX_TRLBAR|EX_ZEROR,
ADDR_OTHER), ADDR_OTHER),
EXCMD(CMD_throw, "throw", ex_throw, 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), ADDR_NONE),
EXCMD(CMD_tjump, "tjump", ex_tag, EXCMD(CMD_tjump, "tjump", ex_tag,
EX_BANG|EX_TRLBAR|EX_WORD1, 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, EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_DFLALL|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK,
ADDR_LINES), ADDR_LINES),
EXCMD(CMD_var, "var", ex_var, 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), ADDR_NONE),
EXCMD(CMD_version, "version", ex_version, EXCMD(CMD_version, "version", ex_version,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, 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, EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),
EXCMD(CMD_while, "while", ex_while, 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), ADDR_NONE),
EXCMD(CMD_winsize, "winsize", ex_winsize, EXCMD(CMD_winsize, "winsize", ex_winsize,
EX_EXTRA|EX_NEEDARG|EX_TRLBAR, EX_EXTRA|EX_NEEDARG|EX_TRLBAR,

View File

@ -3745,16 +3745,27 @@ find_ex_command(
(size_t)len) == 0) (size_t)len) == 0)
{ {
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
if (full != NULL if (full != NULL && cmdnames[eap->cmdidx].cmd_name[len] == NUL)
&& cmdnames[(int)eap->cmdidx].cmd_name[len] == NUL)
*full = TRUE; *full = TRUE;
#endif #endif
break; break;
} }
// :Print and :mode are not supported in Vim9 script // :Print and :mode are not supported in Vim9 script.
if (vim9 && (eap->cmdidx == CMD_mode || eap->cmdidx == CMD_Print)) // 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; 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 // Do not recognize ":*" as the star command unless '*' is in
// 'cpoptions'. // 'cpoptions'.
@ -3775,8 +3786,8 @@ find_ex_command(
eap->cmdidx = CMD_SIZE; eap->cmdidx = CMD_SIZE;
} }
// ":fina" means ":finally" for backwards compatibility. // ":fina" means ":finally" in legacy script, for backwards compatibility.
if (eap->cmdidx == CMD_final && p - eap->cmd == 4) if (eap->cmdidx == CMD_final && p - eap->cmd == 4 && !vim9)
eap->cmdidx = CMD_finally; eap->cmdidx = CMD_finally;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL

View File

@ -460,7 +460,7 @@ def Test_try_catch_throw()
endtry endtry
catch /wrong/ catch /wrong/
add(l, 'caught') add(l, 'caught')
fina finally
add(l, 'finally') add(l, 'finally')
endtry endtry
assert_equal(['1', 'caught', 'finally'], l) assert_equal(['1', 'caught', 'finally'], l)
@ -1004,7 +1004,7 @@ enddef
def s:ReturnFinally(): string def s:ReturnFinally(): string
try try
return 'intry' return 'intry'
finall finally
g:in_finally = 'finally' g:in_finally = 'finally'
endtry endtry
return 'end' return 'end'
@ -3374,6 +3374,37 @@ def Run_test_reject_declaration()
g:StopVimInTerminal(buf) g:StopVimInTerminal(buf)
enddef 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() def Test_unset_any_variable()
var lines =<< trim END var lines =<< trim END
var name: any var name: any

View File

@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4510,
/**/ /**/
4509, 4509,
/**/ /**/

View File

@ -1883,13 +1883,6 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
lhs_T lhs; lhs_T lhs;
long start_lnum = SOURCING_LNUM; 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 "=". // Skip over the "varname" or "[varname, varname]" to get to any "=".
p = skip_var_list(arg, TRUE, &var_count, &semicolon, TRUE); p = skip_var_list(arg, TRUE, &var_count, &semicolon, TRUE);
if (p == NULL) if (p == NULL)