diff options
-rw-r--r-- | src/nvim/api/command.c | 5 | ||||
-rw-r--r-- | src/nvim/autocmd.c | 9 | ||||
-rw-r--r-- | src/nvim/eval/typval.c | 11 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 12 | ||||
-rw-r--r-- | src/nvim/lua/executor.c | 31 | ||||
-rw-r--r-- | src/nvim/mapping.c | 11 | ||||
-rw-r--r-- | src/nvim/os/env.c | 2 | ||||
-rw-r--r-- | test/functional/api/keymap_spec.lua | 6 |
8 files changed, 66 insertions, 21 deletions
diff --git a/src/nvim/api/command.c b/src/nvim/api/command.c index 5ab0beec9d..04242932c9 100644 --- a/src/nvim/api/command.c +++ b/src/nvim/api/command.c @@ -944,7 +944,7 @@ void create_user_command(String name, Object command, Dict(user_command) *opts, cmd_addr_T addr_type_arg = ADDR_NONE; int compl = EXPAND_NOTHING; char *compl_arg = NULL; - char *rep = NULL; + const char *rep = NULL; LuaRef luaref = LUA_NOREF; LuaRef compl_luaref = LUA_NOREF; LuaRef preview_luaref = LUA_NOREF; @@ -1116,8 +1116,7 @@ void create_user_command(String name, Object command, Dict(user_command) *opts, if (opts->desc.type == kObjectTypeString) { rep = opts->desc.data.string.data; } else { - snprintf((char *)IObuff, IOSIZE, "<Lua function %d>", luaref); - rep = (char *)IObuff; + rep = ""; } break; case kObjectTypeString: diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 2b4c9c5b9c..bbb044fba3 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -196,9 +196,16 @@ static void aupat_show(AutoPat *ap, event_T event, int previous_group) if (ac->desc != NULL) { size_t msglen = 100; char *msg = (char *)xmallocz(msglen); - snprintf(msg, msglen, "%s [%s]", exec_to_string, ac->desc); + if (ac->exec.type == CALLABLE_CB) { + msg_puts_attr(exec_to_string, HL_ATTR(HLF_8)); + snprintf(msg, msglen, " [%s]", ac->desc); + } else { + snprintf(msg, msglen, "%s [%s]", exec_to_string, ac->desc); + } msg_outtrans(msg); XFREE_CLEAR(msg); + } else if (ac->exec.type == CALLABLE_CB) { + msg_puts_attr(exec_to_string, HL_ATTR(HLF_8)); } else { msg_outtrans(exec_to_string); } diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c index fd57b45e86..ff1808ed91 100644 --- a/src/nvim/eval/typval.c +++ b/src/nvim/eval/typval.c @@ -1657,13 +1657,14 @@ void callback_copy(Callback *dest, Callback *src) /// Generate a string description of a callback char *callback_to_string(Callback *cb) { - size_t msglen = 100; + if (cb->type == kCallbackLua) { + return nlua_funcref_str(cb->data.luaref); + } + + const size_t msglen = 100; char *msg = (char *)xmallocz(msglen); switch (cb->type) { - case kCallbackLua: - snprintf(msg, msglen, "<lua: %d>", cb->data.luaref); - break; case kCallbackFuncref: // TODO(tjdevries): Is this enough space for this? snprintf(msg, msglen, "<vim function: %s>", cb->data.funcref); @@ -1672,7 +1673,7 @@ char *callback_to_string(Callback *cb) snprintf(msg, msglen, "<vim partial: %s>", cb->data.partial->pt_name); break; default: - snprintf(msg, msglen, "%s", ""); + *msg = '\0'; break; } return msg; diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 31314fd8b9..e3d61ef7e2 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -5440,7 +5440,7 @@ char *uc_validate_name(char *name) /// This function takes ownership of compl_arg, compl_luaref, and luaref. /// /// @return OK if the command is created, FAIL otherwise. -int uc_add_command(char *name, size_t name_len, char *rep, uint32_t argt, long def, int flags, +int uc_add_command(char *name, size_t name_len, const char *rep, uint32_t argt, long def, int flags, int compl, char *compl_arg, LuaRef compl_luaref, LuaRef preview_luaref, cmd_addr_T addr_type, LuaRef luaref, bool force) FUNC_ATTR_NONNULL_ARG(1, 3) @@ -5762,6 +5762,16 @@ static void uc_list(char *name, size_t name_len) IObuff[len] = '\0'; msg_outtrans((char *)IObuff); + if (cmd->uc_luaref != LUA_NOREF) { + char *fn = nlua_funcref_str(cmd->uc_luaref); + msg_puts_attr(fn, HL_ATTR(HLF_8)); + xfree(fn); + // put the description on a new line + if (*cmd->uc_rep != NUL) { + msg_puts("\n "); + } + } + msg_outtrans_special(cmd->uc_rep, false, name_len == 0 ? Columns - 47 : 0); if (p_verbose > 0) { diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c index 17157ccdc2..197a209e97 100644 --- a/src/nvim/lua/executor.c +++ b/src/nvim/lua/executor.c @@ -2076,3 +2076,34 @@ int nlua_do_ucmd(ucmd_T *cmd, exarg_T *eap, bool preview) return retv; } + +/// String representation of a Lua function reference +/// +/// @return Allocated string +char *nlua_funcref_str(LuaRef ref) +{ + lua_State *const lstate = global_lstate; + StringBuilder str = KV_INITIAL_VALUE; + kv_resize(str, 16); + + if (!lua_checkstack(lstate, 1)) { + goto plain; + } + nlua_pushref(lstate, ref); + if (!lua_isfunction(lstate, -1)) { + lua_pop(lstate, 1); + goto plain; + } + + lua_Debug ar; + if (lua_getinfo(lstate, ">S", &ar) && *ar.source == '@' && ar.linedefined >= 0) { + char *src = home_replace_save(NULL, ar.source + 1); + kv_printf(str, "<Lua %d: %s:%d>", ref, src, ar.linedefined); + xfree(src); + return str.items; + } + +plain: + kv_printf(str, "<Lua %d>", ref); + return str.items; +} diff --git a/src/nvim/mapping.c b/src/nvim/mapping.c index 1797bb0365..342b1b0d47 100644 --- a/src/nvim/mapping.c +++ b/src/nvim/mapping.c @@ -196,9 +196,9 @@ static void showmap(mapblock_T *mp, bool local) // Use false below if we only want things like <Up> to show up as such on // the rhs, and not M-x etc, true gets both -- webb if (mp->m_luaref != LUA_NOREF) { - char msg[100]; - snprintf(msg, sizeof(msg), "<Lua function %d>", mp->m_luaref); - msg_puts_attr(msg, HL_ATTR(HLF_8)); + char *str = nlua_funcref_str(mp->m_luaref); + msg_puts_attr(str, HL_ATTR(HLF_8)); + xfree(str); } else if (mp->m_str[0] == NUL) { msg_puts_attr("<Nop>", HL_ATTR(HLF_8)); } else { @@ -2110,10 +2110,7 @@ static void get_maparg(typval_T *argvars, typval_T *rettv, int exact) rettv->vval.v_string = str2special_save((char *)rhs, false, false); } } else if (rhs_lua != LUA_NOREF) { - size_t msglen = 100; - char *msg = (char *)xmalloc(msglen); - snprintf(msg, msglen, "<Lua function %d>", mp->m_luaref); - rettv->vval.v_string = msg; + rettv->vval.v_string = nlua_funcref_str(mp->m_luaref); } } else { tv_dict_alloc_ret(rettv); diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 9c93057fe7..eaa56ffe63 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -1143,7 +1143,7 @@ size_t home_replace(const buf_T *const buf, const char *src, char *const dst, si /// Like home_replace, store the replaced string in allocated memory. /// @param buf When not NULL, check for help files /// @param src Input file name -char *home_replace_save(buf_T *buf, char *src) +char *home_replace_save(buf_T *buf, const char *src) FUNC_ATTR_NONNULL_RET { size_t len = 3; // space for "~/" and trailing NUL diff --git a/test/functional/api/keymap_spec.lua b/test/functional/api/keymap_spec.lua index eb2a467a8b..a93a4544ff 100644 --- a/test/functional/api/keymap_spec.lua +++ b/test/functional/api/keymap_spec.lua @@ -822,7 +822,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() vim.api.nvim_set_keymap ('n', 'asdf', '', {callback = function() print('jkl;') end }) ]] assert.truthy(string.match(exec_lua[[return vim.api.nvim_exec(':nmap asdf', true)]], - "^\nn asdf <Lua function %d+>")) + "^\nn asdf <Lua %d+>")) end) it ('mapcheck() returns lua mapping correctly', function() @@ -830,7 +830,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() vim.api.nvim_set_keymap ('n', 'asdf', '', {callback = function() print('jkl;') end }) ]] assert.truthy(string.match(funcs.mapcheck('asdf', 'n'), - "^<Lua function %d+>")) + "^<Lua %d+>")) end) it ('maparg() returns lua mapping correctly', function() @@ -838,7 +838,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() vim.api.nvim_set_keymap ('n', 'asdf', '', {callback = function() print('jkl;') end }) ]] assert.truthy(string.match(funcs.maparg('asdf', 'n'), - "^<Lua function %d+>")) + "^<Lua %d+>")) local mapargs = funcs.maparg('asdf', 'n', false, true) assert(type(mapargs.callback) == 'number', 'callback is not luaref number') mapargs.callback = nil |