To: vim_dev@googlegroups.com Subject: Patch 9.0.0473 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0473 Problem: fullcommand() only works for the current script version. Solution: Add an optional argument for the script version. Files: runtime/doc/builtin.txt, src/ex_docmd.c, src/testdir/test_cmdline.vim, src/testdir/test_vim9_builtin.vim *** ../vim-9.0.0472/runtime/doc/builtin.txt 2022-09-12 13:37:07.066693383 +0100 --- runtime/doc/builtin.txt 2022-09-15 21:36:01.305900040 +0100 *************** *** 195,201 **** foldtext() String line displayed for closed fold foldtextresult({lnum}) String text for closed fold at {lnum} foreground() Number bring the Vim window to the foreground ! fullcommand({name}) String get full command from {name} funcref({name} [, {arglist}] [, {dict}]) Funcref reference to function {name} function({name} [, {arglist}] [, {dict}]) --- 195,201 ---- foldtext() String line displayed for closed fold foldtextresult({lnum}) String text for closed fold at {lnum} foreground() Number bring the Vim window to the foreground ! fullcommand({name} [, {vim9}]) String get full command from {name} funcref({name} [, {arglist}] [, {dict}]) Funcref reference to function {name} function({name} [, {arglist}] [, {dict}]) *************** *** 2961,2974 **** {only in the Win32, Motif and GTK GUI versions and the Win32 console version} ! fullcommand({name}) *fullcommand()* Get the full command name from a short abbreviated command name; see |20.2| for details on command abbreviations. The string argument {name} may start with a `:` and can include a [range], these are skipped and not returned. ! Returns an empty string if a command doesn't exist or if it's ! ambiguous (for user-defined commands). For example `fullcommand('s')`, `fullcommand('sub')`, `fullcommand(':%substitute')` all return "substitute". --- 2967,2986 ---- {only in the Win32, Motif and GTK GUI versions and the Win32 console version} ! fullcommand({name} [, {vim9}]) *fullcommand()* Get the full command name from a short abbreviated command name; see |20.2| for details on command abbreviations. The string argument {name} may start with a `:` and can include a [range], these are skipped and not returned. ! Returns an empty string if a command doesn't exist, if it's ! ambiguous (for user-defined commands) or cannot be shortened ! this way. |vim9-no-shorten| ! ! Without the {vim9} argument uses the current script version. ! If {vim9} is present and FALSE then legacy script rules are ! used. When {vim9} is present and TRUE then Vim9 rules are ! used, e.g. "en" is not a short form of "endif". For example `fullcommand('s')`, `fullcommand('sub')`, `fullcommand(':%substitute')` all return "substitute". *** ../vim-9.0.0472/src/ex_docmd.c 2022-09-11 15:14:00.547020055 +0100 --- src/ex_docmd.c 2022-09-15 21:39:45.441817544 +0100 *************** *** 4048,4067 **** void f_fullcommand(typval_T *argvars, typval_T *rettv) { ! exarg_T ea; ! char_u *name; ! char_u *p; rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; ! if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL) return; name = argvars[0].vval.v_string; if (name == NULL) return; while (*name == ':') name++; name = skip_range(name, TRUE, NULL); --- 4048,4078 ---- void f_fullcommand(typval_T *argvars, typval_T *rettv) { ! exarg_T ea; ! char_u *name; ! char_u *p; ! int vim9script = in_vim9script(); ! int save_cmod_flags = cmdmod.cmod_flags; rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; ! if (in_vim9script() ! && (check_for_string_arg(argvars, 0) == FAIL ! || check_for_opt_bool_arg(argvars, 1) == FAIL)) return; name = argvars[0].vval.v_string; if (name == NULL) return; + if (argvars[1].v_type != VAR_UNKNOWN) + { + vim9script = tv_get_bool(&argvars[1]); + cmdmod.cmod_flags &= ~(CMOD_VIM9CMD | CMOD_LEGACY); + cmdmod.cmod_flags |= vim9script ? CMOD_VIM9CMD : CMOD_LEGACY; + } + while (*name == ':') name++; name = skip_range(name, TRUE, NULL); *************** *** 4069,4078 **** ea.cmd = (*name == '2' || *name == '3') ? name + 1 : name; ea.cmdidx = (cmdidx_T)0; ea.addr_count = 0; p = find_ex_command(&ea, NULL, NULL, NULL); if (p == NULL || ea.cmdidx == CMD_SIZE) ! return; ! if (in_vim9script()) { int res; --- 4080,4092 ---- ea.cmd = (*name == '2' || *name == '3') ? name + 1 : name; ea.cmdidx = (cmdidx_T)0; ea.addr_count = 0; + ++emsg_silent; // don't complain about using "en" in Vim9 script p = find_ex_command(&ea, NULL, NULL, NULL); + --emsg_silent; if (p == NULL || ea.cmdidx == CMD_SIZE) ! goto theend; ! ! if (vim9script) { int res; *************** *** 4081,4092 **** --emsg_silent; if (res == FAIL) ! return; } rettv->vval.v_string = vim_strsave(IS_USER_CMDIDX(ea.cmdidx) ? get_user_command_name(ea.useridx, ea.cmdidx) : cmdnames[ea.cmdidx].cmd_name); } #endif --- 4095,4108 ---- --emsg_silent; if (res == FAIL) ! goto theend; } rettv->vval.v_string = vim_strsave(IS_USER_CMDIDX(ea.cmdidx) ? get_user_command_name(ea.useridx, ea.cmdidx) : cmdnames[ea.cmdidx].cmd_name); + theend: + cmdmod.cmod_flags = save_cmod_flags; } #endif *** ../vim-9.0.0472/src/testdir/test_cmdline.vim 2022-09-14 12:51:43.397770087 +0100 --- src/testdir/test_cmdline.vim 2022-09-15 21:44:29.225604862 +0100 *************** *** 662,667 **** --- 662,670 ---- \ '3match': 'match', \ 'aboveleft': 'aboveleft', \ 'abo': 'aboveleft', + \ 'en': 'endif', + \ 'end': 'endif', + \ 'endi': 'endif', \ 's': 'substitute', \ '5s': 'substitute', \ ':5s': 'substitute', *** ../vim-9.0.0472/src/testdir/test_vim9_builtin.vim 2022-09-09 18:46:41.558660414 +0100 --- src/testdir/test_vim9_builtin.vim 2022-09-15 21:40:49.841777937 +0100 *************** *** 1530,1535 **** --- 1530,1542 ---- assert_equal('scriptnames', fullcommand('scr')) assert_equal('', fullcommand('scg')) fullcommand('')->assert_equal('') + + assert_equal('', fullcommand('en')) + legacy call assert_equal('endif', fullcommand('en')) + assert_equal('endif', fullcommand('en', 0)) + legacy call assert_equal('endif', fullcommand('en', 0)) + assert_equal('', fullcommand('en', 1)) + legacy call assert_equal('', fullcommand('en', 1)) enddef def Test_funcref() *** ../vim-9.0.0472/src/version.c 2022-09-15 19:43:48.908462529 +0100 --- src/version.c 2022-09-15 21:33:33.297996123 +0100 *************** *** 705,706 **** --- 705,708 ---- { /* Add new patch number below this line */ + /**/ + 473, /**/ -- From "know your smileys": :^[/ mean-smiley-with-cigarette /// Bram Moolenaar -- Bram@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 ///