To: vim_dev@googlegroups.com Subject: Patch 8.2.4416 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4416 Problem: Vim9: using a script-local function requires using "s:" when setting 'completefunc'. Solution: Do not require "s:" in Vim9 script. (closes #9796) Files: runtime/doc/options.txt, src/userfunc.c, src/testdir/test_ins_complete.vim *** ../vim-8.2.4415/runtime/doc/options.txt 2022-02-08 12:07:41.831496906 +0000 --- runtime/doc/options.txt 2022-02-18 17:49:07.241531428 +0000 *************** *** 383,394 **** set opfunc=function('MyOpFunc') set opfunc=funcref('MyOpFunc') set opfunc={a\ ->\ MyOpFunc(a)} ! " set using a funcref variable let Fn = function('MyTagFunc') ! let &tagfunc = string(Fn) ! " set using a lambda expression let &tagfunc = {t -> MyTagFunc(t)} ! " set using a variable with lambda expression let L = {a, b, c -> MyTagFunc(a, b , c)} let &tagfunc = L --- 383,404 ---- set opfunc=function('MyOpFunc') set opfunc=funcref('MyOpFunc') set opfunc={a\ ->\ MyOpFunc(a)} ! ! Set to a script-local function: > ! set opfunc=s:MyLocalFunc ! set opfunc=MyLocalFunc ! In |Vim9| script the "s:" and "" can be omitted if the function exists in ! the script: > ! set opfunc=MyLocalFunc ! ! Set using a funcref variable: > let Fn = function('MyTagFunc') ! let &tagfunc = Fn ! ! Set using a lambda expression: > let &tagfunc = {t -> MyTagFunc(t)} ! ! Set using a variable with lambda expression: > let L = {a, b, c -> MyTagFunc(a, b , c)} let &tagfunc = L *** ../vim-8.2.4415/src/userfunc.c 2022-02-13 21:51:02.392484124 +0000 --- src/userfunc.c 2022-02-18 17:35:13.430400788 +0000 *************** *** 4024,4039 **** get_scriptlocal_funcname(char_u *funcname) { char sid_buf[25]; ! int off; char_u *newname; if (funcname == NULL) return NULL; if (STRNCMP(funcname, "s:", 2) != 0 && STRNCMP(funcname, "", 5) != 0) ! // The function name is not a script-local function name ! return NULL; if (!SCRIPT_ID_VALID(current_sctx.sc_sid)) { --- 4024,4052 ---- get_scriptlocal_funcname(char_u *funcname) { char sid_buf[25]; ! int off = *funcname == 's' ? 2 : 5; char_u *newname; + char_u *p = funcname; if (funcname == NULL) return NULL; if (STRNCMP(funcname, "s:", 2) != 0 && STRNCMP(funcname, "", 5) != 0) ! { ! ufunc_T *ufunc; ! ! // The function name does not have a script-local prefix. Try finding ! // it when in a Vim9 script and there is no "g:" prefix. ! if (!in_vim9script() || STRNCMP(funcname, "g:", 2) == 0) ! return NULL; ! ufunc = find_func(funcname, FALSE); ! if (ufunc == NULL || func_is_global(ufunc) ! || (p = vim_strchr(ufunc->uf_name, '_')) == NULL) ! return NULL; ! ++p; ! off = 0; ! } if (!SCRIPT_ID_VALID(current_sctx.sc_sid)) { *************** *** 4043,4054 **** // Expand s: prefix into nr_ vim_snprintf(sid_buf, sizeof(sid_buf), "%ld_", (long)current_sctx.sc_sid); ! off = *funcname == 's' ? 2 : 5; ! newname = alloc(STRLEN(sid_buf) + STRLEN(funcname + off) + 1); if (newname == NULL) return NULL; STRCPY(newname, sid_buf); ! STRCAT(newname, funcname + off); return newname; } --- 4056,4066 ---- // Expand s: prefix into nr_ vim_snprintf(sid_buf, sizeof(sid_buf), "%ld_", (long)current_sctx.sc_sid); ! newname = alloc(STRLEN(sid_buf) + STRLEN(p + off) + 1); if (newname == NULL) return NULL; STRCPY(newname, sid_buf); ! STRCAT(newname, p + off); return newname; } *** ../vim-8.2.4415/src/testdir/test_ins_complete.vim 2022-02-12 20:34:47.084825186 +0000 --- src/testdir/test_ins_complete.vim 2022-02-18 17:43:44.913927662 +0000 *************** *** 1455,1460 **** --- 1455,1477 ---- bw! delfunc s:CompleteFunc3 + " In Vim9 script s: can be omitted + let lines =<< trim END + vim9script + var CompleteFunc4Args = [] + def CompleteFunc4(findstart: bool, base: string): any + add(CompleteFunc4Args, [findstart, base]) + return findstart ? 0 : [] + enddef + set completefunc=CompleteFunc4 + new + setline(1, 'script1') + feedkeys("A\\\", 'x') + assert_equal([[1, ''], [0, 'script1']], CompleteFunc4Args) + bw! + END + call v9.CheckScriptSuccess(lines) + " invalid return value let &completefunc = {a -> 'abc'} call feedkeys("A\\\", 'x') *** ../vim-8.2.4415/src/version.c 2022-02-18 13:56:34.630118479 +0000 --- src/version.c 2022-02-18 17:23:37.446348394 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4416, /**/ -- hundred-and-one symptoms of being an internet addict: 72. Somebody at IRC just mentioned a way to obtain full motion video without a PC using a wireless protocol called NTSC, you wonder how you never heard about it /// 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 ///