forked from aniani/vim
patch 8.2.4416: Vim9: using a script-local function requires using "s:"
Problem: Vim9: using a script-local function requires using "s:" when setting 'completefunc'. Solution: Do not require "s:" in Vim9 script. (closes #9796)
This commit is contained in:
parent
b8fb5bb68d
commit
1fca5f3e86
@ -383,12 +383,22 @@ lambda it will be converted to the name, e.g. "<lambda>123". Examples:
|
|||||||
set opfunc=function('MyOpFunc')
|
set opfunc=function('MyOpFunc')
|
||||||
set opfunc=funcref('MyOpFunc')
|
set opfunc=funcref('MyOpFunc')
|
||||||
set opfunc={a\ ->\ MyOpFunc(a)}
|
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 Fn = function('MyTagFunc')
|
||||||
let &tagfunc = Fn
|
let &tagfunc = Fn
|
||||||
" set using a lambda expression
|
|
||||||
|
Set using a lambda expression: >
|
||||||
let &tagfunc = {t -> MyTagFunc(t)}
|
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 L = {a, b, c -> MyTagFunc(a, b , c)}
|
||||||
let &tagfunc = L
|
let &tagfunc = L
|
||||||
|
|
||||||
|
@ -1455,6 +1455,23 @@ func Test_completefunc_callback()
|
|||||||
bw!
|
bw!
|
||||||
delfunc s:CompleteFunc3
|
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
|
" invalid return value
|
||||||
let &completefunc = {a -> 'abc'}
|
let &completefunc = {a -> 'abc'}
|
||||||
call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
|
call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
|
||||||
|
@ -4024,16 +4024,29 @@ untrans_function_name(char_u *name)
|
|||||||
get_scriptlocal_funcname(char_u *funcname)
|
get_scriptlocal_funcname(char_u *funcname)
|
||||||
{
|
{
|
||||||
char sid_buf[25];
|
char sid_buf[25];
|
||||||
int off;
|
int off = *funcname == 's' ? 2 : 5;
|
||||||
char_u *newname;
|
char_u *newname;
|
||||||
|
char_u *p = funcname;
|
||||||
|
|
||||||
if (funcname == NULL)
|
if (funcname == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (STRNCMP(funcname, "s:", 2) != 0
|
if (STRNCMP(funcname, "s:", 2) != 0
|
||||||
&& STRNCMP(funcname, "<SID>", 5) != 0)
|
&& STRNCMP(funcname, "<SID>", 5) != 0)
|
||||||
// The function name is not a script-local function name
|
{
|
||||||
|
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;
|
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))
|
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>
|
// Expand s: prefix into <SNR>nr_<name>
|
||||||
vim_snprintf(sid_buf, sizeof(sid_buf), "<SNR>%ld_",
|
vim_snprintf(sid_buf, sizeof(sid_buf), "<SNR>%ld_",
|
||||||
(long)current_sctx.sc_sid);
|
(long)current_sctx.sc_sid);
|
||||||
off = *funcname == 's' ? 2 : 5;
|
newname = alloc(STRLEN(sid_buf) + STRLEN(p + off) + 1);
|
||||||
newname = alloc(STRLEN(sid_buf) + STRLEN(funcname + off) + 1);
|
|
||||||
if (newname == NULL)
|
if (newname == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
STRCPY(newname, sid_buf);
|
STRCPY(newname, sid_buf);
|
||||||
STRCAT(newname, funcname + off);
|
STRCAT(newname, p + off);
|
||||||
|
|
||||||
return newname;
|
return newname;
|
||||||
}
|
}
|
||||||
|
@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
4416,
|
||||||
/**/
|
/**/
|
||||||
4415,
|
4415,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user