mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
patch 8.2.4030: a script local funcref is not found from a mapping
Problem: A script local funcref is not found from a mapping. Solution: When looking for a function, also find a script-local funcref. (closes #9485)
This commit is contained in:
@@ -2690,7 +2690,7 @@ eval_variable(
|
|||||||
{
|
{
|
||||||
if ((flags & EVAL_VAR_IMPORT) == 0)
|
if ((flags & EVAL_VAR_IMPORT) == 0)
|
||||||
{
|
{
|
||||||
if (sid != 0 && SCRIPT_ID_VALID(sid))
|
if (SCRIPT_ID_VALID(sid))
|
||||||
{
|
{
|
||||||
ht = &SCRIPT_VARS(sid);
|
ht = &SCRIPT_VARS(sid);
|
||||||
if (ht != NULL)
|
if (ht != NULL)
|
||||||
@@ -2877,6 +2877,35 @@ find_var(char_u *name, hashtab_T **htp, int no_autoload)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Like find_var() but if the name starts with <SNR>99_ then look in the
|
||||||
|
* referenced script (used for a funcref).
|
||||||
|
*/
|
||||||
|
dictitem_T *
|
||||||
|
find_var_also_in_script(char_u *name, hashtab_T **htp, int no_autoload)
|
||||||
|
{
|
||||||
|
if (STRNCMP(name, "<SNR>", 5) == 0 && isdigit(name[5]))
|
||||||
|
{
|
||||||
|
char_u *p = name + 5;
|
||||||
|
int sid = getdigits(&p);
|
||||||
|
|
||||||
|
if (SCRIPT_ID_VALID(sid) && *p == '_')
|
||||||
|
{
|
||||||
|
hashtab_T *ht = &SCRIPT_VARS(sid);
|
||||||
|
|
||||||
|
if (ht != NULL)
|
||||||
|
{
|
||||||
|
dictitem_T *di = find_var_in_ht(ht, 0, p + 1, no_autoload);
|
||||||
|
|
||||||
|
if (di != NULL)
|
||||||
|
return di;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return find_var(name, htp, no_autoload);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find variable "varname" in hashtab "ht" with name "htname".
|
* Find variable "varname" in hashtab "ht" with name "htname".
|
||||||
* When "varname" is empty returns curwin/curtab/etc vars dictionary.
|
* When "varname" is empty returns curwin/curtab/etc vars dictionary.
|
||||||
|
@@ -60,6 +60,7 @@ char_u *set_cmdarg(exarg_T *eap, char_u *oldarg);
|
|||||||
int eval_variable(char_u *name, int len, scid_T sid, typval_T *rettv, dictitem_T **dip, int flags);
|
int eval_variable(char_u *name, int len, scid_T sid, typval_T *rettv, dictitem_T **dip, int flags);
|
||||||
void check_vars(char_u *name, int len);
|
void check_vars(char_u *name, int len);
|
||||||
dictitem_T *find_var(char_u *name, hashtab_T **htp, int no_autoload);
|
dictitem_T *find_var(char_u *name, hashtab_T **htp, int no_autoload);
|
||||||
|
dictitem_T *find_var_also_in_script(char_u *name, hashtab_T **htp, int no_autoload);
|
||||||
dictitem_T *find_var_in_ht(hashtab_T *ht, int htname, char_u *varname, int no_autoload);
|
dictitem_T *find_var_in_ht(hashtab_T *ht, int htname, char_u *varname, int no_autoload);
|
||||||
hashtab_T *get_script_local_ht(void);
|
hashtab_T *get_script_local_ht(void);
|
||||||
int lookup_scriptitem(char_u *name, size_t len, int cmd, cctx_T *dummy);
|
int lookup_scriptitem(char_u *name, size_t len, int cmd, cctx_T *dummy);
|
||||||
|
@@ -1662,32 +1662,31 @@ def Test_import_in_filetype()
|
|||||||
&rtp = save_rtp
|
&rtp = save_rtp
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
" FIXME
|
def Test_use_import_in_mapping()
|
||||||
"def Test_use_import_in_mapping()
|
var lines =<< trim END
|
||||||
" var lines =<< trim END
|
vim9script
|
||||||
" vim9script
|
export def Funcx()
|
||||||
" export def Funcx()
|
g:result = 42
|
||||||
" g:result = 42
|
enddef
|
||||||
" enddef
|
END
|
||||||
" END
|
writefile(lines, 'XsomeExport.vim')
|
||||||
" writefile(lines, 'XsomeExport.vim')
|
lines =<< trim END
|
||||||
" lines =<< trim END
|
vim9script
|
||||||
" vim9script
|
import './XsomeExport.vim' as some
|
||||||
" import './XsomeExport.vim' as some
|
var Funcy = some.Funcx
|
||||||
" var Funcy = some.Funcx
|
nnoremap <F3> :call <sid>Funcy()<cr>
|
||||||
" nnoremap <F3> :call <sid>Funcy()<cr>
|
END
|
||||||
" END
|
writefile(lines, 'Xmapscript.vim')
|
||||||
" writefile(lines, 'Xmapscript.vim')
|
|
||||||
"
|
source Xmapscript.vim
|
||||||
" source Xmapscript.vim
|
feedkeys("\<F3>", "xt")
|
||||||
" feedkeys("\<F3>", "xt")
|
assert_equal(42, g:result)
|
||||||
" assert_equal(42, g:result)
|
|
||||||
"
|
unlet g:result
|
||||||
" unlet g:result
|
delete('XsomeExport.vim')
|
||||||
" delete('XsomeExport.vim')
|
delete('Xmapscript.vim')
|
||||||
" delete('Xmapscript.vim')
|
nunmap <F3>
|
||||||
" nunmap <F3>
|
enddef
|
||||||
"enddef
|
|
||||||
|
|
||||||
def Test_vim9script_mix()
|
def Test_vim9script_mix()
|
||||||
var lines =<< trim END
|
var lines =<< trim END
|
||||||
|
@@ -1589,7 +1589,7 @@ deref_func_name(
|
|||||||
cc = name[*lenp];
|
cc = name[*lenp];
|
||||||
name[*lenp] = NUL;
|
name[*lenp] = NUL;
|
||||||
|
|
||||||
v = find_var(name, &ht, no_autoload);
|
v = find_var_also_in_script(name, &ht, no_autoload);
|
||||||
name[*lenp] = cc;
|
name[*lenp] = cc;
|
||||||
if (v != NULL)
|
if (v != NULL)
|
||||||
{
|
{
|
||||||
|
@@ -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 */
|
||||||
|
/**/
|
||||||
|
4030,
|
||||||
/**/
|
/**/
|
||||||
4029,
|
4029,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user