Skip to content

Commit

Permalink
patch 9.0.0244: cannot easily get the list of sourced scripts
Browse files Browse the repository at this point in the history
Problem:    Cannot easily get the list of sourced scripts.
Solution:   Add the getscriptinfo() function. (Yegappan Lakshmanan,
            closes #10957)
  • Loading branch information
yegappan authored and brammool committed Aug 22, 2022
1 parent e89aeed commit f768c3d
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 8 deletions.
13 changes: 13 additions & 0 deletions runtime/doc/builtin.txt
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ getreg([{regname} [, 1 [, {list}]]])
String or List contents of a register
getreginfo([{regname}]) Dict information about a register
getregtype([{regname}]) String type of a register
getscriptinfo() List list of sourced scripts
gettabinfo([{expr}]) List list of tab pages
gettabvar({nr}, {varname} [, {def}])
any variable {varname} in tab {nr} or {def}
Expand Down Expand Up @@ -4088,6 +4089,18 @@ getregtype([{regname}]) *getregtype()*
Can also be used as a |method|: >
GetRegname()->getregtype()
getscriptinfo() *getscriptinfo()*
Returns a |List| with information about all the sourced Vim
scripts in the order they were sourced. (|:scriptinfo|)

This comment has been minimized.

Copy link
@Shane-XB-Qian

Shane-XB-Qian Aug 22, 2022

Contributor

no such tag yet (or incorrect)

This comment has been minimized.

Copy link
@brammool

brammool Aug 22, 2022

Contributor

Rename this one incorrectly


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

This comment has been minimized.

Copy link
@Shane-XB-Qian

Shane-XB-Qian Aug 22, 2022

Contributor

looks this was not a correct tag name also

This comment has been minimized.

Copy link
@brammool

brammool Aug 22, 2022

Contributor

This should use backticks, it is a command, not a help tag.

yet.
name vim script file name.
sid script ID |<SID>|.

gettabinfo([{tabnr}]) *gettabinfo()*
If {tabnr} is not specified, then information about all the
tab pages is returned as a |List|. Each List item is a
Expand Down
16 changes: 9 additions & 7 deletions runtime/doc/usr_41.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1310,6 +1310,14 @@ Prompt Buffer: *promptbuffer-functions*
prompt_setinterrupt() set interrupt callback 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*
prop_add() attach a property at a position
prop_add_list() attach a property at multiple positions
Expand Down Expand Up @@ -1341,6 +1349,7 @@ Various: *various-functions*
did_filetype() check if a FileType autocommand was used
eventhandler() check if invoked by an event handler
getpid() get process ID of Vim
getscriptinfo() get list of sourced vim scripts
getimstatus() check if IME status is active
interrupt() interrupt script execution
windowsversion() get MS-Windows version
Expand All @@ -1352,13 +1361,6 @@ Various: *various-functions*
undofile() get the name of the undo file
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'

wordcount() get byte/word/char count of buffer
Expand Down
2 changes: 2 additions & 0 deletions src/evalfunc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1935,6 +1935,8 @@ static funcentry_T global_functions[] =
ret_dict_any, f_getreginfo},
{"getregtype", 0, 1, FEARG_1, arg1_string,
ret_string, f_getregtype},
{"getscriptinfo", 0, 0, 0, NULL,
ret_list_dict_any, f_getscriptinfo},
{"gettabinfo", 0, 1, FEARG_1, arg1_number,
ret_list_dict_any, f_gettabinfo},
{"gettabvar", 2, 3, FEARG_1, arg3_number_string_any,
Expand Down
1 change: 1 addition & 0 deletions src/proto/scriptfile.pro
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ char_u *get_scriptname(scid_T id);
void free_scriptnames(void);
void free_autoload_scriptnames(void);
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);
int sourcing_a_script(exarg_T *eap);
void ex_scriptencoding(exarg_T *eap);
Expand Down
30 changes: 30 additions & 0 deletions src/scriptfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -1933,6 +1933,36 @@ get_sourced_lnum(
? ((source_cookie_T *)cookie)->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

static char_u *
Expand Down
12 changes: 11 additions & 1 deletion src/testdir/test_scriptnames.vim
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
" Test for :scriptnames

" Test for the :scriptnames command
func Test_scriptnames()
call writefile(['let did_load_script = 123'], 'Xscripting')
source Xscripting
Expand Down Expand Up @@ -29,4 +29,14 @@ func Test_scriptnames()
call assert_equal(msgs, execute('messages'))
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
2 changes: 2 additions & 0 deletions src/testdir/test_vim9_import.vim
Original file line number Diff line number Diff line change
Expand Up @@ -732,6 +732,8 @@ def Test_use_relative_autoload_import_in_mapping()

source Xmapscript.vim
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")
assert_equal(42, g:result)

Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -731,6 +731,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
244,
/**/
243,
/**/
Expand Down

0 comments on commit f768c3d

Please sign in to comment.