mirror of
https://github.com/neovim/neovim
synced 2025-07-15 16:51:49 +00:00
fix(exrc): exrc knows its own location #34638
Problem:
'exrc' files are inherently bound to their location / workspace and
therefore require to "know" their location on the filesystem. However,
currently using `debug.getinfo(1, 'S')` returns `"<nvim>"`.
Solution:
Include the filepath as chunkname in `loadstring()` and `nlua_exec()`.
(cherry picked from commit f7c939fa7a
)
This commit is contained in:
committed by
Justin M. Keyes
parent
ef68eae09a
commit
7b2119dbd9
@ -2357,6 +2357,8 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
in the |trust| list. Use |:trust| to manage trusted files. See also
|
||||
|vim.secure.read()|.
|
||||
|
||||
To get its own location, Lua exrc files can use |debug.getinfo()|.
|
||||
|
||||
Compare 'exrc' to |editorconfig|:
|
||||
- 'exrc' can execute any code; editorconfig only specifies settings.
|
||||
- 'exrc' is Nvim-specific; editorconfig works in other editors.
|
||||
|
@ -2040,7 +2040,8 @@ expand({string} [, {nosuf} [, {list}]]) *expand()*
|
||||
<SID> "<SNR>123_" where "123" is the
|
||||
current script ID |<SID>|
|
||||
<script> sourced script file, or script file
|
||||
where the current function was defined
|
||||
where the current function was defined.
|
||||
Use |debug.getinfo()| in Lua scripts.
|
||||
<stack> call stack
|
||||
<cword> word under the cursor
|
||||
<cWORD> WORD under the cursor
|
||||
|
2
runtime/lua/vim/_meta/options.lua
generated
2
runtime/lua/vim/_meta/options.lua
generated
@ -2015,6 +2015,8 @@ vim.bo.et = vim.bo.expandtab
|
||||
--- in the `trust` list. Use `:trust` to manage trusted files. See also
|
||||
--- `vim.secure.read()`.
|
||||
---
|
||||
--- To get its own location, Lua exrc files can use `debug.getinfo()`.
|
||||
---
|
||||
--- Compare 'exrc' to `editorconfig`:
|
||||
--- - 'exrc' can execute any code; editorconfig only specifies settings.
|
||||
--- - 'exrc' is Nvim-specific; editorconfig works in other editors.
|
||||
|
3
runtime/lua/vim/_meta/vimfn.lua
generated
3
runtime/lua/vim/_meta/vimfn.lua
generated
@ -1801,7 +1801,8 @@ function vim.fn.exp(expr) end
|
||||
--- <SID> "<SNR>123_" where "123" is the
|
||||
--- current script ID |<SID>|
|
||||
--- <script> sourced script file, or script file
|
||||
--- where the current function was defined
|
||||
--- where the current function was defined.
|
||||
--- Use |debug.getinfo()| in Lua scripts.
|
||||
--- <stack> call stack
|
||||
--- <cword> word under the cursor
|
||||
--- <cWORD> WORD under the cursor
|
||||
|
@ -62,7 +62,7 @@ Object nvim_execute_lua(String code, Array args, Arena *arena, Error *err)
|
||||
FUNC_API_DEPRECATED_SINCE(7)
|
||||
FUNC_API_REMOTE_ONLY
|
||||
{
|
||||
return nlua_exec(code, args, kRetObject, arena, err);
|
||||
return nlua_exec(code, NULL, args, kRetObject, arena, err);
|
||||
}
|
||||
|
||||
/// Gets the buffer number
|
||||
|
@ -514,7 +514,7 @@ Object nvim_exec_lua(String code, Array args, Arena *arena, Error *err)
|
||||
FUNC_API_REMOTE_ONLY
|
||||
{
|
||||
// TODO(bfredl): convert directly from msgpack to lua and then back again
|
||||
return nlua_exec(code, args, kRetObject, arena, err);
|
||||
return nlua_exec(code, NULL, args, kRetObject, arena, err);
|
||||
}
|
||||
|
||||
/// Calculates the number of display cells occupied by `text`.
|
||||
|
@ -2342,7 +2342,8 @@ M.funcs = {
|
||||
<SID> "<SNR>123_" where "123" is the
|
||||
current script ID |<SID>|
|
||||
<script> sourced script file, or script file
|
||||
where the current function was defined
|
||||
where the current function was defined.
|
||||
Use |debug.getinfo()| in Lua scripts.
|
||||
<stack> call stack
|
||||
<cword> word under the cursor
|
||||
<cWORD> WORD under the cursor
|
||||
|
@ -1507,17 +1507,20 @@ int typval_exec_lua_callable(LuaRef lua_cb, int argcount, typval_T *argvars, typ
|
||||
/// Used for nvim_exec_lua() and internally to execute a lua string.
|
||||
///
|
||||
/// @param[in] str String to execute.
|
||||
/// @param[in] chunkname Chunkname, defaults to "<nvim>".
|
||||
/// @param[in] args array of ... args
|
||||
/// @param[in] mode Whether and how the the return value should be converted to Object
|
||||
/// @param[in] arena can be NULL, then nested allocations are used
|
||||
/// @param[out] err Location where error will be saved.
|
||||
///
|
||||
/// @return Return value of the execution.
|
||||
Object nlua_exec(const String str, const Array args, LuaRetMode mode, Arena *arena, Error *err)
|
||||
Object nlua_exec(const String str, const char *chunkname, const Array args, LuaRetMode mode,
|
||||
Arena *arena, Error *err)
|
||||
{
|
||||
lua_State *const lstate = global_lstate;
|
||||
|
||||
if (luaL_loadbuffer(lstate, str.data, str.size, "<nvim>")) {
|
||||
const char *name = (chunkname && chunkname[0]) ? chunkname : "<nvim>";
|
||||
if (luaL_loadbuffer(lstate, str.data, str.size, name)) {
|
||||
size_t len;
|
||||
const char *errstr = lua_tolstring(lstate, -1, &len);
|
||||
api_set_error(err, kErrorTypeValidation,
|
||||
|
@ -26,7 +26,7 @@ typedef struct {
|
||||
} nlua_ref_state_t;
|
||||
|
||||
#define NLUA_EXEC_STATIC(cstr, arg, mode, arena, err) \
|
||||
nlua_exec(STATIC_CSTR_AS_STRING(cstr), arg, mode, arena, err)
|
||||
nlua_exec(STATIC_CSTR_AS_STRING(cstr), NULL, arg, mode, arena, err)
|
||||
|
||||
#define NLUA_CLEAR_REF(x) \
|
||||
do { \
|
||||
|
@ -958,7 +958,7 @@ static void remote_request(mparm_T *params, int remote_args, char *server_addr,
|
||||
ADD_C(a, CSTR_AS_OBJ(connect_error));
|
||||
ADD_C(a, ARRAY_OBJ(args));
|
||||
String s = STATIC_CSTR_AS_STRING("return vim._cs_remote(...)");
|
||||
Object o = nlua_exec(s, a, kRetObject, NULL, &err);
|
||||
Object o = nlua_exec(s, NULL, a, kRetObject, NULL, &err);
|
||||
kv_destroy(args);
|
||||
if (ERROR_SET(&err)) {
|
||||
fprintf(stderr, "%s\n", err.msg);
|
||||
@ -2059,7 +2059,8 @@ static void do_exrc_initialization(void)
|
||||
str = nlua_read_secure(VIMRC_LUA_FILE);
|
||||
if (str != NULL) {
|
||||
Error err = ERROR_INIT;
|
||||
nlua_exec(cstr_as_string(str), (Array)ARRAY_DICT_INIT, kRetNilBool, NULL, &err);
|
||||
nlua_exec(cstr_as_string(str), "@"VIMRC_LUA_FILE, (Array)ARRAY_DICT_INIT, kRetNilBool, NULL,
|
||||
&err);
|
||||
xfree(str);
|
||||
if (ERROR_SET(&err)) {
|
||||
semsg("Error detected while processing %s:", VIMRC_LUA_FILE);
|
||||
|
@ -2668,6 +2668,8 @@ local options = {
|
||||
in the |trust| list. Use |:trust| to manage trusted files. See also
|
||||
|vim.secure.read()|.
|
||||
|
||||
To get its own location, Lua exrc files can use |debug.getinfo()|.
|
||||
|
||||
Compare 'exrc' to |editorconfig|:
|
||||
- 'exrc' can execute any code; editorconfig only specifies settings.
|
||||
- 'exrc' is Nvim-specific; editorconfig works in other editors.
|
||||
|
Reference in New Issue
Block a user