mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
fix: anonymous sid not working
This commit is contained in:
parent
ebfe083337
commit
7b6ee3ef0a
@ -9369,10 +9369,31 @@ static hashtab_T *find_var_ht_dict(const char *name, const size_t name_len, cons
|
|||||||
} else if (*name == 'l' && funccal != NULL) { // local variable
|
} else if (*name == 'l' && funccal != NULL) { // local variable
|
||||||
*d = &funccal->l_vars;
|
*d = &funccal->l_vars;
|
||||||
} else if (*name == 's' // script variable
|
} else if (*name == 's' // script variable
|
||||||
&& (current_sctx.sc_sid > 0 || current_sctx.sc_sid == SID_STR)
|
&& (current_sctx.sc_sid > 0 || current_sctx.sc_sid == SID_STR
|
||||||
|
|| current_sctx.sc_sid == SID_LUA)
|
||||||
&& current_sctx.sc_sid <= ga_scripts.ga_len) {
|
&& current_sctx.sc_sid <= ga_scripts.ga_len) {
|
||||||
// For anonymous scripts without a script item, create one now so script vars can be used
|
// For anonymous scripts without a script item, create one now so script vars can be used
|
||||||
if (current_sctx.sc_sid == SID_STR) {
|
if (current_sctx.sc_sid == SID_LUA) {
|
||||||
|
// try to resolve lua filename & line no so it can be shown in lastset messages.
|
||||||
|
nlua_set_sctx(¤t_sctx);
|
||||||
|
if (current_sctx.sc_sid != SID_LUA) {
|
||||||
|
// Great we have valid location. Now here this out we'll create a new
|
||||||
|
// script context with the name and lineno of this one. why ?
|
||||||
|
// for behavioral consistency. With this different anonymous exec from
|
||||||
|
// same file can't access each others script local stuff. We need to do
|
||||||
|
// this all other cases except this will act like that otherwise.
|
||||||
|
const LastSet last_set = (LastSet){
|
||||||
|
.script_ctx = current_sctx,
|
||||||
|
.channel_id = LUA_INTERNAL_CALL,
|
||||||
|
};
|
||||||
|
bool should_free;
|
||||||
|
// should_free is ignored as script_sctx will be resolved to a fnmae
|
||||||
|
// & new_script_item will consume it.
|
||||||
|
char_u *sc_name = get_scriptname(last_set, &should_free);
|
||||||
|
new_script_item(sc_name, ¤t_sctx.sc_sid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (current_sctx.sc_sid == SID_STR || current_sctx.sc_sid == SID_LUA) {
|
||||||
new_script_item(NULL, ¤t_sctx.sc_sid);
|
new_script_item(NULL, ¤t_sctx.sc_sid);
|
||||||
}
|
}
|
||||||
*d = &SCRIPT_SV(current_sctx.sc_sid)->sv_dict;
|
*d = &SCRIPT_SV(current_sctx.sc_sid)->sv_dict;
|
||||||
|
@ -1818,24 +1818,14 @@ void nlua_execute_on_key(int c)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks if str is in blacklist array
|
// Sets the editor "script context" during Lua execution. Used by :verbose.
|
||||||
static bool is_in_ignorelist(const char *str, char *ignorelist[], int ignorelist_size)
|
// @param[out] current
|
||||||
|
void nlua_set_sctx(sctx_T *current)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < ignorelist_size; i++) {
|
if (p_verbose <= 0 || current->sc_sid != SID_LUA) {
|
||||||
if (strncmp(ignorelist[i], str, strlen(ignorelist[i])) == 0) {
|
return;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Get sctx of current file being sourced if doesn't exist generate it
|
|
||||||
static sctx_T *nlua_get_sourcing_sctx(void)
|
|
||||||
{
|
|
||||||
lua_State *const lstate = global_lstate;
|
lua_State *const lstate = global_lstate;
|
||||||
sctx_T *retval = (sctx_T *)xmalloc(sizeof(sctx_T));
|
|
||||||
retval->sc_seq = -1;
|
|
||||||
retval->sc_sid = SID_LUA;
|
|
||||||
retval->sc_lnum = -1;
|
|
||||||
lua_Debug *info = (lua_Debug *)xmalloc(sizeof(lua_Debug));
|
lua_Debug *info = (lua_Debug *)xmalloc(sizeof(lua_Debug));
|
||||||
|
|
||||||
// Files where internal wrappers are defined so we can ignore them
|
// Files where internal wrappers are defined so we can ignore them
|
||||||
@ -1844,7 +1834,7 @@ static sctx_T *nlua_get_sourcing_sctx(void)
|
|||||||
"vim/_meta.lua",
|
"vim/_meta.lua",
|
||||||
"vim/keymap.lua",
|
"vim/keymap.lua",
|
||||||
};
|
};
|
||||||
int blacklist_size = sizeof(ignorelist) / sizeof(ignorelist[0]);
|
int ignorelist_size = sizeof(ignorelist) / sizeof(ignorelist[0]);
|
||||||
|
|
||||||
for (int level = 1; true; level++) {
|
for (int level = 1; true; level++) {
|
||||||
if (lua_getstack(lstate, level, info) != 1) {
|
if (lua_getstack(lstate, level, info) != 1) {
|
||||||
@ -1854,31 +1844,30 @@ static sctx_T *nlua_get_sourcing_sctx(void)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info->what[0] == 'C' || info->source[0] != '@'
|
bool is_ignored = false;
|
||||||
|| is_in_ignorelist(info->source+1, ignorelist, blacklist_size)) {
|
if (info->what[0] == 'C' || info->source[0] != '@') {
|
||||||
|
is_ignored = true;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < ignorelist_size; i++) {
|
||||||
|
if (strncmp(ignorelist[i], info->source+1, strlen(ignorelist[i])) == 0) {
|
||||||
|
is_ignored = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_ignored) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
char *source_path = fix_fname(info->source + 1);
|
char *source_path = fix_fname(info->source + 1);
|
||||||
get_current_script_id((char_u *)source_path, retval);
|
get_current_script_id((char_u *)source_path, current);
|
||||||
xfree(source_path);
|
xfree(source_path);
|
||||||
retval->sc_lnum = info->currentline;
|
current->sc_lnum = info->currentline;
|
||||||
|
current->sc_seq = -1;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
xfree(info);
|
xfree(info);
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sets the editor "script context" during Lua execution. Used by :verbose.
|
|
||||||
// @param[out] current
|
|
||||||
void nlua_set_sctx(sctx_T *current)
|
|
||||||
{
|
|
||||||
if (p_verbose > 0 && current->sc_sid == SID_LUA) {
|
|
||||||
sctx_T *lua_sctx = nlua_get_sourcing_sctx();
|
|
||||||
*current = *lua_sctx;
|
|
||||||
xfree(lua_sctx);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void nlua_do_ucmd(ucmd_T *cmd, exarg_T *eap)
|
void nlua_do_ucmd(ucmd_T *cmd, exarg_T *eap)
|
||||||
|
@ -38,6 +38,13 @@ function Close_Window() abort\
|
|||||||
wincmd -\
|
wincmd -\
|
||||||
endfunction\
|
endfunction\
|
||||||
", false)
|
", false)
|
||||||
|
|
||||||
|
local ret = vim.api.nvim_exec ("\
|
||||||
|
function! s:return80()\
|
||||||
|
return 80\
|
||||||
|
endfunction\
|
||||||
|
let &tw = s:return80()\
|
||||||
|
", true)
|
||||||
]])
|
]])
|
||||||
exec(':source '..script_file)
|
exec(':source '..script_file)
|
||||||
end)
|
end)
|
||||||
@ -125,6 +132,14 @@ test_group FileType
|
|||||||
endfunction]],
|
endfunction]],
|
||||||
script_location), result)
|
script_location), result)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('"Last set" works with anonymous sid', function()
|
||||||
|
local result = exec_capture(':verbose set tw?')
|
||||||
|
eq(string.format([[
|
||||||
|
textwidth=80
|
||||||
|
Last set from %s line 22]],
|
||||||
|
script_location), result)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('lua verbose:', function()
|
describe('lua verbose:', function()
|
||||||
|
Loading…
Reference in New Issue
Block a user