Patch 8.2.4510

7 views
Skip to first unread message

Bram Moolenaar

unread,
Mar 5, 2022, 7:57:17 AM3/5/22
to vim...@googlegroups.com

Patch 8.2.4510
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".
Files: src/ex_cmds.h, src/ex_docmd.c, src/errors.h, src/evalvars.c,
src/vim9compile.c, src/testdir/test_vim9_script.vim


*** ../vim-8.2.4509/src/ex_cmds.h 2021-12-24 20:27:58.033861527 +0000
--- src/ex_cmds.h 2022-03-05 12:39:59.162017223 +0000
***************
*** 58,63 ****
--- 58,64 ----
#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,227 ****
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,
ADDR_NONE),
EXCMD(CMD_breakadd, "breakadd", ex_breakadd,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
--- 222,228 ----
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_WHOLE,
ADDR_NONE),
EXCMD(CMD_breakadd, "breakadd", ex_breakadd,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
***************
*** 281,287 ****
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,
ADDR_NONE),
EXCMD(CMD_cbuffer, "cbuffer", ex_cbuffer,
EX_BANG|EX_RANGE|EX_WORD1|EX_TRLBAR,
--- 282,288 ----
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_WHOLE,
ADDR_NONE),
EXCMD(CMD_cbuffer, "cbuffer", ex_cbuffer,
EX_BANG|EX_RANGE|EX_WORD1|EX_TRLBAR,
***************
*** 413,419 ****
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,
ADDR_NONE),
EXCMD(CMD_copen, "copen", ex_copen,
EX_RANGE|EX_COUNT|EX_TRLBAR,
--- 414,420 ----
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_WHOLE,
ADDR_NONE),
EXCMD(CMD_copen, "copen", ex_copen,
EX_RANGE|EX_COUNT|EX_TRLBAR,
***************
*** 548,563 ****
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,
ADDR_NONE),
EXCMD(CMD_elseif, "elseif", ex_else,
! EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
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,
ADDR_NONE),
EXCMD(CMD_endinterface, "endinterface", ex_ni,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
--- 549,564 ----
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_WHOLE,
ADDR_NONE),
EXCMD(CMD_elseif, "elseif", ex_else,
! 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_WHOLE,
ADDR_NONE),
EXCMD(CMD_endinterface, "endinterface", ex_ni,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
***************
*** 575,587 ****
EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_endfor, "endfor", ex_endwhile,
! EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_endtry, "endtry", ex_endtry,
! EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_endwhile, "endwhile", ex_endwhile,
! EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_enew, "enew", ex_edit,
EX_BANG|EX_TRLBAR,
--- 576,588 ----
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_WHOLE,
ADDR_NONE),
EXCMD(CMD_endtry, "endtry", ex_endtry,
! 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_WHOLE,
ADDR_NONE),
EXCMD(CMD_enew, "enew", ex_edit,
EX_BANG|EX_TRLBAR,
***************
*** 623,632 ****
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,
ADDR_NONE),
EXCMD(CMD_finally, "finally", ex_finally,
! EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_finish, "finish", ex_finish,
EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
--- 624,633 ----
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_WHOLE,
ADDR_NONE),
EXCMD(CMD_finally, "finally", ex_finally,
! 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,1607 ****
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,
ADDR_NONE),
EXCMD(CMD_tjump, "tjump", ex_tag,
EX_BANG|EX_TRLBAR|EX_WORD1,
--- 1602,1608 ----
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_WHOLE,
ADDR_NONE),
EXCMD(CMD_tjump, "tjump", ex_tag,
EX_BANG|EX_TRLBAR|EX_WORD1,
***************
*** 1694,1700 ****
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,
ADDR_NONE),
EXCMD(CMD_version, "version", ex_version,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
--- 1695,1701 ----
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_WHOLE,
ADDR_NONE),
EXCMD(CMD_version, "version", ex_version,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
***************
*** 1763,1769 ****
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,
ADDR_NONE),
EXCMD(CMD_winsize, "winsize", ex_winsize,
EX_EXTRA|EX_NEEDARG|EX_TRLBAR,
--- 1764,1770 ----
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_WHOLE,
ADDR_NONE),
EXCMD(CMD_winsize, "winsize", ex_winsize,
EX_EXTRA|EX_NEEDARG|EX_TRLBAR,
*** ../vim-8.2.4509/src/ex_docmd.c 2022-03-04 17:10:15.955626539 +0000
--- src/ex_docmd.c 2022-03-05 12:46:39.067566975 +0000
***************
*** 3745,3760 ****
(size_t)len) == 0)
{
#ifdef FEAT_EVAL
! if (full != NULL
! && cmdnames[(int)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;

// Do not recognize ":*" as the star command unless '*' is in
// 'cpoptions'.
--- 3745,3771 ----
(size_t)len) == 0)
{
#ifdef FEAT_EVAL
! if (full != NULL && cmdnames[eap->cmdidx].cmd_name[len] == NUL)
*full = TRUE;
#endif
break;
}

! // :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,3782 ****
eap->cmdidx = CMD_SIZE;
}

! // ":fina" means ":finally" for backwards compatibility.
! if (eap->cmdidx == CMD_final && p - eap->cmd == 4)
eap->cmdidx = CMD_finally;

#ifdef FEAT_EVAL
--- 3786,3793 ----
eap->cmdidx = CMD_SIZE;
}

! // ":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
*** ../vim-8.2.4509/src/errors.h 2022-03-05 11:37:43.048924316 +0000
--- src/errors.h 2022-03-05 12:50:38.884057805 +0000
***************
*** 2761,2769 ****
#endif
EXTERN char e_yank_register_changed_while_using_it[]
INIT(= N_("E1064: Yank register changed while using it"));
#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[]
--- 2761,2769 ----
#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_cannot_declare_a_register_str[]
INIT(= N_("E1066: Cannot declare a register: %s"));
EXTERN char e_separator_mismatch_str[]
*** ../vim-8.2.4509/src/evalvars.c 2022-03-05 11:37:43.048924316 +0000
--- src/evalvars.c 2022-03-05 12:50:02.587997364 +0000
***************
*** 768,778 ****
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);
}

--- 768,773 ----
*** ../vim-8.2.4509/src/vim9compile.c 2022-03-05 11:37:43.048924316 +0000
--- src/vim9compile.c 2022-03-05 12:52:45.072237739 +0000
***************
*** 1883,1895 ****
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)
--- 1883,1888 ----
*** ../vim-8.2.4509/src/testdir/test_vim9_script.vim 2022-03-05 11:05:32.290905138 +0000
--- src/testdir/test_vim9_script.vim 2022-03-05 12:51:00.684092107 +0000
***************
*** 460,466 ****
endtry
catch /wrong/
add(l, 'caught')
! fina
add(l, 'finally')
endtry
assert_equal(['1', 'caught', 'finally'], l)
--- 460,466 ----
endtry
catch /wrong/
add(l, 'caught')
! finally
add(l, 'finally')
endtry
assert_equal(['1', 'caught', 'finally'], l)
***************
*** 1004,1010 ****
def s:ReturnFinally(): string
try
return 'intry'
! finall
g:in_finally = 'finally'
endtry
return 'end'
--- 1004,1010 ----
def s:ReturnFinally(): string
try
return 'intry'
! finally
g:in_finally = 'finally'
endtry
return 'end'
***************
*** 3374,3379 ****
--- 3374,3410 ----
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
*** ../vim-8.2.4509/src/version.c 2022-03-05 11:37:43.048924316 +0000
--- src/version.c 2022-03-05 12:55:54.536437542 +0000
***************
*** 756,757 ****
--- 756,759 ----
{ /* Add new patch number below this line */
+ /**/
+ 4510,
/**/

--
In Joseph Heller's novel "Catch-22", the main character tries to get out of a
war by proving he is crazy. But the mere fact he wants to get out of the war
only shows he isn't crazy -- creating the original "Catch-22".

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

Bram Moolenaar

unread,
Mar 5, 2022, 8:41:24 AM3/5/22
to vim...@googlegroups.com, Bram Moolenaar

I wrote:

> Patch 8.2.4510
> 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".
> Files: src/ex_cmds.h, src/ex_docmd.c, src/errors.h, src/evalvars.c,
> src/vim9compile.c, src/testdir/test_vim9_script.vim

After requiring to use ":var" and disallow ":va", to make Vim9 scripts
more readable, I was wondering if we should do this for more commands.
Especially using "en" instead of "endif" makes a script harder to
understand. So why not do it for all the flow commands?

Let me know if you think this restriction is too much.

--
hundred-and-one symptoms of being an internet addict:
169. You hire a housekeeper for your home page.

Manuel Ortega

unread,
Mar 5, 2022, 2:39:23 PM3/5/22
to vim_dev
After requiring to use ":var" and disallow ":va", to make Vim9 scripts
more readable, I was wondering if we should do this for more commands.
Especially using "en" instead of "endif" makes a script harder to
understand. So why not do it for all the flow commands?

Let me know if you think this restriction is too much.

I think this is too much.

Besides enforcing a mere stylistic preference, it would eliminate objectively useful things.  E.g.,  "en" for "endif" is really handy in command line mode when putting together quick things.

-Manny
Reply all
Reply to author
Forward
0 new messages