0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 9.0.0269: getscriptinfo() does not include the version

Problem:    getscriptinfo() does not include the version.  Cannot select
            entries by script name.
Solution:   Add the "version" item and the "name" argument. (Yegappan
            Lakshmanan, closes #10962)
This commit is contained in:
Yegappan Lakshmanan
2022-08-25 17:40:40 +01:00
committed by Bram Moolenaar
parent 0166e398d1
commit 520f6ef60a
7 changed files with 76 additions and 10 deletions

View File

@@ -253,7 +253,7 @@ getreg([{regname} [, 1 [, {list}]]])
String or List contents of a register String or List contents of a register
getreginfo([{regname}]) Dict information about a register getreginfo([{regname}]) Dict information about a register
getregtype([{regname}]) String type of a register getregtype([{regname}]) String type of a register
getscriptinfo() List list of sourced scripts getscriptinfo([{opts}]) List list of sourced scripts
gettabinfo([{expr}]) List list of tab pages gettabinfo([{expr}]) List list of tab pages
gettabvar({nr}, {varname} [, {def}]) gettabvar({nr}, {varname} [, {def}])
any variable {varname} in tab {nr} or {def} any variable {varname} in tab {nr} or {def}
@@ -4089,7 +4089,7 @@ getregtype([{regname}]) *getregtype()*
Can also be used as a |method|: > Can also be used as a |method|: >
GetRegname()->getregtype() GetRegname()->getregtype()
getscriptinfo() *getscriptinfo()* getscriptinfo([{opts}) *getscriptinfo()*
Returns a |List| with information about all the sourced Vim Returns a |List| with information about all the sourced Vim
scripts in the order they were sourced, like what scripts in the order they were sourced, like what
`:scriptnames` shows. `:scriptnames` shows.
@@ -4104,6 +4104,13 @@ getscriptinfo() *getscriptinfo()*
sourced script ID of the actually sourced script that sourced script ID of the actually sourced script that
this script name links to, if any, otherwise this script name links to, if any, otherwise
zero zero
version vimscript version (|scriptversion|)
The optional Dict argument {opts} supports the following
items:
name script name match pattern. If specified,
information about scripts with name
that match the pattern "name" are returned.
gettabinfo([{tabnr}]) *gettabinfo()* gettabinfo([{tabnr}]) *gettabinfo()*
If {tabnr} is not specified, then information about all the If {tabnr} is not specified, then information about all the

View File

@@ -1935,7 +1935,7 @@ static funcentry_T global_functions[] =
ret_dict_any, f_getreginfo}, ret_dict_any, f_getreginfo},
{"getregtype", 0, 1, FEARG_1, arg1_string, {"getregtype", 0, 1, FEARG_1, arg1_string,
ret_string, f_getregtype}, ret_string, f_getregtype},
{"getscriptinfo", 0, 0, 0, NULL, {"getscriptinfo", 0, 1, 0, arg1_dict_any,
ret_list_dict_any, f_getscriptinfo}, ret_list_dict_any, f_getscriptinfo},
{"gettabinfo", 0, 1, FEARG_1, arg1_number, {"gettabinfo", 0, 1, FEARG_1, arg1_number,
ret_list_dict_any, f_gettabinfo}, ret_list_dict_any, f_gettabinfo},

View File

@@ -1946,17 +1946,35 @@ get_sourced_lnum(
: SOURCING_LNUM; : SOURCING_LNUM;
} }
/*
* getscriptinfo() function
*/
void void
f_getscriptinfo(typval_T *argvars UNUSED, typval_T *rettv) f_getscriptinfo(typval_T *argvars, typval_T *rettv)
{ {
int i; int i;
list_T *l; list_T *l;
char_u *pat = NULL;
regmatch_T regmatch;
if (rettv_list_alloc(rettv) == FAIL) if (rettv_list_alloc(rettv) == FAIL)
return; return;
if (check_for_opt_dict_arg(argvars, 0) == FAIL)
return;
l = rettv->vval.v_list; l = rettv->vval.v_list;
regmatch.regprog = NULL;
regmatch.rm_ic = p_ic;
if (argvars[0].v_type == VAR_DICT)
{
pat = dict_get_string(argvars[0].vval.v_dict, "name", TRUE);
if (pat != NULL)
regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
}
for (i = 1; i <= script_items.ga_len; ++i) for (i = 1; i <= script_items.ga_len; ++i)
{ {
scriptitem_T *si = SCRIPT_ITEM(i); scriptitem_T *si = SCRIPT_ITEM(i);
@@ -1965,15 +1983,23 @@ f_getscriptinfo(typval_T *argvars UNUSED, typval_T *rettv)
if (si->sn_name == NULL) if (si->sn_name == NULL)
continue; continue;
if (pat != NULL && regmatch.regprog != NULL
&& !vim_regexec(&regmatch, si->sn_name, (colnr_T)0))
continue;
if ((d = dict_alloc()) == NULL if ((d = dict_alloc()) == NULL
|| list_append_dict(l, d) == FAIL || list_append_dict(l, d) == FAIL
|| dict_add_string(d, "name", si->sn_name) == FAIL || dict_add_string(d, "name", si->sn_name) == FAIL
|| dict_add_number(d, "sid", i) == FAIL || dict_add_number(d, "sid", i) == FAIL
|| dict_add_number(d, "sourced", si->sn_sourced_sid) == FAIL || dict_add_number(d, "sourced", si->sn_sourced_sid) == FAIL
|| dict_add_number(d, "version", si->sn_version) == FAIL
|| dict_add_bool(d, "autoload", || dict_add_bool(d, "autoload",
si->sn_state == SN_STATE_NOT_LOADED) == FAIL) si->sn_state == SN_STATE_NOT_LOADED) == FAIL)
return; return;
} }
vim_regfree(regmatch.regprog);
vim_free(pat);
} }
#endif #endif

View File

@@ -31,12 +31,34 @@ endfunc
" Test for the getscriptinfo() function " Test for the getscriptinfo() function
func Test_getscriptinfo() func Test_getscriptinfo()
call writefile(['let loaded_script_id = expand("<SID>")'], 'Xscript') let lines =<< trim END
source Xscript let g:loaded_script_id = expand("<SID>")
let s:XscriptVar = [1, #{v: 2}]
func s:XscriptFunc()
endfunc
END
call writefile(lines, 'X22script91')
source X22script91
let l = getscriptinfo() let l = getscriptinfo()
call assert_match('Xscript$', l[-1].name) call assert_match('X22script91$', l[-1].name)
call assert_equal(g:loaded_script_id, $"<SNR>{l[-1].sid}_") call assert_equal(g:loaded_script_id, $"<SNR>{l[-1].sid}_")
call delete('Xscript')
let l = getscriptinfo({'name': '22script91'})
call assert_equal(1, len(l))
call assert_match('22script91$', l[0].name)
let l = getscriptinfo({'name': 'foobar'})
call assert_equal(0, len(l))
let l = getscriptinfo({'name': ''})
call assert_true(len(l) > 1)
call assert_fails("echo getscriptinfo({'name': []})", 'E730:')
call assert_fails("echo getscriptinfo({'name': '\\@'})", 'E866:')
let l = getscriptinfo({'name': test_null_string()})
call assert_true(len(l) > 1)
call assert_fails("echo getscriptinfo('foobar')", 'E1206:')
call delete('X22script91')
endfunc endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -1896,6 +1896,10 @@ def Test_getregtype()
getregtype('')->assert_equal("\<C-V>4") getregtype('')->assert_equal("\<C-V>4")
enddef enddef
def Test_getscriptinfo()
v9.CheckDefAndScriptFailure(['getscriptinfo("x")'], ['E1013: Argument 1: type mismatch, expected dict<any> but got string', 'E1206: Dictionary required for argument 1'])
enddef
def Test_gettabinfo() def Test_gettabinfo()
v9.CheckDefAndScriptFailure(['gettabinfo("x")'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1']) v9.CheckDefAndScriptFailure(['gettabinfo("x")'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1'])
enddef enddef

View File

@@ -732,10 +732,15 @@ def Test_use_relative_autoload_import_in_mapping()
source Xmapscript.vim source Xmapscript.vim
assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1]) assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
assert_match('XrelautoloadExport.vim$', getscriptinfo()[-1].name) var l = getscriptinfo()
assert_true(getscriptinfo()[-1].autoload) assert_match('XrelautoloadExport.vim$', l[-1].name)
assert_true(l[-1].autoload)
feedkeys("\<F3>", "xt") feedkeys("\<F3>", "xt")
assert_equal(42, g:result) assert_equal(42, g:result)
l = getscriptinfo({name: 'XrelautoloadExport'})
assert_true(len(l) == 1)
assert_match('XrelautoloadExport.vim$', l[0].name)
assert_false(l[0].autoload)
unlet g:result unlet g:result
delete('XrelautoloadExport.vim') delete('XrelautoloadExport.vim')

View File

@@ -727,6 +727,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 */
/**/
269,
/**/ /**/
268, 268,
/**/ /**/