]> granicus.if.org Git - vim/commitdiff
patch 8.2.4416: Vim9: using a script-local function requires using "s:" v8.2.4416
authorBram Moolenaar <Bram@vim.org>
Fri, 18 Feb 2022 17:50:47 +0000 (17:50 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 18 Feb 2022 17:50:47 +0000 (17:50 +0000)
Problem:    Vim9: using a script-local function requires using "s:" when
            setting 'completefunc'.
Solution:   Do not require "s:" in Vim9 script. (closes #9796)

runtime/doc/options.txt
src/testdir/test_ins_complete.vim
src/userfunc.c
src/version.c

index 1d3f76864b2f70a714c549c3333ee803d31d914e..8fcbc99c4004e4d1f46198613b593d91b626c6df 100644 (file)
@@ -383,12 +383,22 @@ lambda it will be converted to the name, e.g. "<lambda>123".  Examples:
        set opfunc=function('MyOpFunc')
        set opfunc=funcref('MyOpFunc')
        set opfunc={a\ ->\ MyOpFunc(a)}
-       " set using a funcref variable
+
+Set to a script-local function: >
+       set opfunc=s:MyLocalFunc
+       set opfunc=<SID>MyLocalFunc
+In |Vim9| script the "s:" and "<SID>" 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
+
+Set using a lambda expression: >
        let &tagfunc = {t -> MyTagFunc(t)}
-       " set using a variable with lambda expression
+
+Set using a variable with lambda expression: >
        let L = {a, b, c -> MyTagFunc(a, b , c)}
        let &tagfunc = L
 
index 7e3fd296e2f1ab8c8b994b397c0ac3a2cc8c2675..cb643769ea894310775df7b6cdad807d31292c66 100644 (file)
@@ -1455,6 +1455,23 @@ func Test_completefunc_callback()
   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\<C-X>\<C-U>\<Esc>", 'x')
+      assert_equal([[1, ''], [0, 'script1']], CompleteFunc4Args)
+      bw!
+  END
+  call v9.CheckScriptSuccess(lines)
+
   " invalid return value
   let &completefunc = {a -> 'abc'}
   call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
index 10a529e03f9bb0c4a531f0e7d22200283311e537..696320c3e91dc5e6c743546b1dc2ffc2886cf663 100644 (file)
@@ -4024,16 +4024,29 @@ untrans_function_name(char_u *name)
 get_scriptlocal_funcname(char_u *funcname)
 {
     char       sid_buf[25];
-    int                off;
+    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, "<SID>", 5) != 0)
-       // The function name is not a script-local function name
-       return NULL;
+    {
+       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,12 +4056,11 @@ get_scriptlocal_funcname(char_u *funcname)
     // Expand s: prefix into <SNR>nr_<name>
     vim_snprintf(sid_buf, sizeof(sid_buf), "<SNR>%ld_",
            (long)current_sctx.sc_sid);
-    off = *funcname == 's' ? 2 : 5;
-    newname = alloc(STRLEN(sid_buf) + STRLEN(funcname + off) + 1);
+    newname = alloc(STRLEN(sid_buf) + STRLEN(p + off) + 1);
     if (newname == NULL)
        return NULL;
     STRCPY(newname, sid_buf);
-    STRCAT(newname, funcname + off);
+    STRCAT(newname, p + off);
 
     return newname;
 }
index f313448c2d7a739d04b758f1ddceefa551f4095c..c9968125b8cdd7840db59ed4b073ed71f2aab987 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4416,
 /**/
     4415,
 /**/