0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 9.0.0244: cannot easily get the list of sourced scripts

Problem:    Cannot easily get the list of sourced scripts.
Solution:   Add the getscriptinfo() function. (Yegappan Lakshmanan,
            closes #10957)
This commit is contained in:
Yegappan Lakshmanan
2022-08-22 13:15:13 +01:00
committed by Bram Moolenaar
parent e89aeed43e
commit f768c3d19c
8 changed files with 70 additions and 8 deletions

View File

@@ -253,6 +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
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}
@@ -4088,6 +4089,18 @@ getregtype([{regname}]) *getregtype()*
Can also be used as a |method|: > Can also be used as a |method|: >
GetRegname()->getregtype() GetRegname()->getregtype()
getscriptinfo() *getscriptinfo()*
Returns a |List| with information about all the sourced Vim
scripts in the order they were sourced. (|:scriptinfo|)
Each item in the returned List is a |Dict| with the following
items:
autoload set to TRUE for a script that was used with
|import autoload| but was not actually sourced
yet.
name vim script file name.
sid script ID |<SID>|.
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
tab pages is returned as a |List|. Each List item is a tab pages is returned as a |List|. Each List item is a

View File

@@ -1310,6 +1310,14 @@ Prompt Buffer: *promptbuffer-functions*
prompt_setinterrupt() set interrupt callback for a buffer prompt_setinterrupt() set interrupt callback for a buffer
prompt_setprompt() set the prompt text for a buffer prompt_setprompt() set the prompt text for a buffer
Registers: *register-functions*
getreg() get contents of a register
getreginfo() get information about a register
getregtype() get type of a register
setreg() set contents and type of a register
reg_executing() return the name of the register being executed
reg_recording() return the name of the register being recorded
Text Properties: *text-property-functions* Text Properties: *text-property-functions*
prop_add() attach a property at a position prop_add() attach a property at a position
prop_add_list() attach a property at multiple positions prop_add_list() attach a property at multiple positions
@@ -1341,6 +1349,7 @@ Various: *various-functions*
did_filetype() check if a FileType autocommand was used did_filetype() check if a FileType autocommand was used
eventhandler() check if invoked by an event handler eventhandler() check if invoked by an event handler
getpid() get process ID of Vim getpid() get process ID of Vim
getscriptinfo() get list of sourced vim scripts
getimstatus() check if IME status is active getimstatus() check if IME status is active
interrupt() interrupt script execution interrupt() interrupt script execution
windowsversion() get MS-Windows version windowsversion() get MS-Windows version
@@ -1352,13 +1361,6 @@ Various: *various-functions*
undofile() get the name of the undo file undofile() get the name of the undo file
undotree() return the state of the undo tree undotree() return the state of the undo tree
getreg() get contents of a register
getreginfo() get information about a register
getregtype() get type of a register
setreg() set contents and type of a register
reg_executing() return the name of the register being executed
reg_recording() return the name of the register being recorded
shiftwidth() effective value of 'shiftwidth' shiftwidth() effective value of 'shiftwidth'
wordcount() get byte/word/char count of buffer wordcount() get byte/word/char count of buffer

View File

@@ -1935,6 +1935,8 @@ 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,
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},
{"gettabvar", 2, 3, FEARG_1, arg3_number_string_any, {"gettabvar", 2, 3, FEARG_1, arg3_number_string_any,

View File

@@ -33,6 +33,7 @@ char_u *get_scriptname(scid_T id);
void free_scriptnames(void); void free_scriptnames(void);
void free_autoload_scriptnames(void); void free_autoload_scriptnames(void);
linenr_T get_sourced_lnum(char_u *(*fgetline)(int, void *, int, getline_opt_T), void *cookie); linenr_T get_sourced_lnum(char_u *(*fgetline)(int, void *, int, getline_opt_T), void *cookie);
void f_getscriptinfo(typval_T *argvars, typval_T *rettv);
char_u *getsourceline(int c, void *cookie, int indent, getline_opt_T options); char_u *getsourceline(int c, void *cookie, int indent, getline_opt_T options);
int sourcing_a_script(exarg_T *eap); int sourcing_a_script(exarg_T *eap);
void ex_scriptencoding(exarg_T *eap); void ex_scriptencoding(exarg_T *eap);

View File

@@ -1933,6 +1933,36 @@ get_sourced_lnum(
? ((source_cookie_T *)cookie)->sourcing_lnum ? ((source_cookie_T *)cookie)->sourcing_lnum
: SOURCING_LNUM; : SOURCING_LNUM;
} }
void
f_getscriptinfo(typval_T *argvars UNUSED, typval_T *rettv)
{
int i;
list_T *l;
if (rettv_list_alloc(rettv) == FAIL)
return;
l = rettv->vval.v_list;
for (i = 1; i <= script_items.ga_len; ++i)
{
scriptitem_T *si = SCRIPT_ITEM(i);
dict_T *d;
if (si->sn_name == NULL)
continue;
if ((d = dict_alloc()) == NULL
|| list_append_dict(l, d) == FAIL
|| dict_add_string(d, "name", si->sn_name) == FAIL
|| dict_add_number(d, "sid", i) == FAIL
|| dict_add_bool(d, "autoload",
si->sn_state == SN_STATE_NOT_LOADED) == FAIL)
return;
}
}
#endif #endif
static char_u * static char_u *

View File

@@ -1,5 +1,5 @@
" Test for :scriptnames
" Test for the :scriptnames command
func Test_scriptnames() func Test_scriptnames()
call writefile(['let did_load_script = 123'], 'Xscripting') call writefile(['let did_load_script = 123'], 'Xscripting')
source Xscripting source Xscripting
@@ -29,4 +29,14 @@ func Test_scriptnames()
call assert_equal(msgs, execute('messages')) call assert_equal(msgs, execute('messages'))
endfunc endfunc
" Test for the getscriptinfo() function
func Test_getscriptinfo()
call writefile(['let loaded_script_id = expand("<SID>")'], 'Xscript')
source Xscript
let l = getscriptinfo()
call assert_match('Xscript$', l[-1].name)
call assert_equal(g:loaded_script_id, $"<SNR>{l[-1].sid}_")
call delete('Xscript')
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -732,6 +732,8 @@ 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)
assert_true(getscriptinfo()[-1].autoload)
feedkeys("\<F3>", "xt") feedkeys("\<F3>", "xt")
assert_equal(42, g:result) assert_equal(42, g:result)

View File

@@ -731,6 +731,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 */
/**/
244,
/**/ /**/
243, 243,
/**/ /**/