diff options
-rw-r--r-- | src/nvim/api/autocmd.c | 2 | ||||
-rw-r--r-- | src/nvim/autocmd.c | 68 | ||||
-rw-r--r-- | test/functional/api/autocmd_spec.lua | 52 |
3 files changed, 79 insertions, 43 deletions
diff --git a/src/nvim/api/autocmd.c b/src/nvim/api/autocmd.c index 30a5d60c39..4ee834d75a 100644 --- a/src/nvim/api/autocmd.c +++ b/src/nvim/api/autocmd.c @@ -283,7 +283,7 @@ Array nvim_get_autocmds(Dict(get_autocmds) *opts, Error *err) PUT(autocmd_info, "command", - STRING_OBJ(cstr_to_string(aucmd_exec_to_string(ac, ac->exec)))); + STRING_OBJ(cstr_as_string(aucmd_exec_to_string(ac, ac->exec)))); PUT(autocmd_info, "pattern", diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index b87c7886e3..bc9e548b77 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -190,7 +190,18 @@ static void aupat_show(AutoPat *ap, event_T event, int previous_group) if (got_int) { return; } - msg_outtrans((char_u *)aucmd_exec_to_string(ac, ac->exec)); + + char *exec_to_string = aucmd_exec_to_string(ac, ac->exec); + if (ac->desc != NULL) { + size_t msglen = 100; + char *msg = (char *)xmallocz(msglen); + snprintf(msg, msglen, "%s [%s]", exec_to_string, ac->desc); + msg_outtrans((char_u *)msg); + XFREE_CLEAR(msg); + } else { + msg_outtrans((char_u *)exec_to_string); + } + XFREE_CLEAR(exec_to_string); if (p_verbose > 0) { last_set_msg(ac->script_ctx); } @@ -1136,8 +1147,6 @@ int autocmd_register(int64_t id, event_T event, char *pat, int patlen, int group // perhaps: <lua>DESCRIPTION or similar if (desc != NULL) { ac->desc = xstrdup(desc); - } else { - ac->desc = aucmd_exec_default_desc(aucmd); } return OK; @@ -2118,8 +2127,10 @@ char *getnextac(int c, void *cookie, int indent, bool do_concat) if (p_verbose >= 9) { verbose_enter_scroll(); - smsg(_("autocommand %s"), aucmd_exec_to_string(ac, ac->exec)); + char *exec_to_string = aucmd_exec_to_string(ac, ac->exec); + smsg(_("autocommand %s"), exec_to_string); msg_puts("\n"); // don't overwrite this either + XFREE_CLEAR(exec_to_string); verbose_leave_scroll(); } @@ -2470,45 +2481,42 @@ bool autocmd_delete_id(int64_t id) // =========================================================================== // AucmdExecutable Functions // =========================================================================== -char *aucmd_exec_default_desc(AucmdExecutable acc) + +/// Generate a string description of a callback +static char *aucmd_callback_to_string(Callback cb) { + // NOTE: this function probably belongs in a helper + size_t msglen = 100; + char *msg = (char *)xmallocz(msglen); - switch (acc.type) { - case CALLABLE_CB: - switch (acc.callable.cb.type) { - case kCallbackLua: { - char *msg = (char *)xmallocz(msglen); - snprintf(msg, msglen, "<Lua function %d>", acc.callable.cb.data.luaref); - return msg; - } - case kCallbackFuncref: { - // TODO(tjdevries): Is this enough space for this? - char *msg = (char *)xmallocz(msglen); - snprintf(msg, msglen, "<vim function: %s>", acc.callable.cb.data.funcref); - return msg; - } - case kCallbackPartial: { - char *msg = (char *)xmallocz(msglen); - snprintf(msg, msglen, "<vim partial: %s>", acc.callable.cb.data.partial->pt_name); - return msg; - } - default: - return NULL; - } + 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); + break; + case kCallbackPartial: + snprintf(msg, msglen, "<vim partial: %s>", cb.data.partial->pt_name); + break; default: - return NULL; + snprintf(msg, msglen, "%s", ""); + break; } + return msg; } +/// Generate a string description for the command/callback of an autocmd char *aucmd_exec_to_string(AutoCmd *ac, AucmdExecutable acc) FUNC_ATTR_PURE { switch (acc.type) { case CALLABLE_EX: - return acc.callable.cmd; + return xstrdup(acc.callable.cmd); case CALLABLE_CB: - return ac->desc; + return aucmd_callback_to_string(acc.callable.cb); case CALLABLE_NONE: return "This is not possible"; } diff --git a/test/functional/api/autocmd_spec.lua b/test/functional/api/autocmd_spec.lua index c08c411de1..491dac9f35 100644 --- a/test/functional/api/autocmd_spec.lua +++ b/test/functional/api/autocmd_spec.lua @@ -119,13 +119,45 @@ describe('autocmd api', function() describe('desc', function() it('can add description to one autocmd', function() + local cmd = "echo 'Should Not Have Errored'" + local desc = "Can show description" meths.create_autocmd("BufReadPost", { pattern = "*.py", - command = "echo 'Should Not Have Errored'", - desc = "Can show description", + command = cmd, + desc = desc, }) - eq("Can show description", meths.get_autocmds { event = "BufReadPost" }[1].desc) + eq(desc, meths.get_autocmds { event = "BufReadPost" }[1].desc) + eq(cmd, meths.get_autocmds { event = "BufReadPost" }[1].command) + end) + + it('can add description to one autocmd that uses a callback', function() + local desc = 'Can show description' + meths.set_var('desc', desc) + + exec_lua([[ + local callback = function() print 'Should Not Have Errored' end + vim.api.nvim_create_autocmd("BufReadPost", { + pattern = "*.py", + callback = callback, + desc = vim.g.desc, + }) + ]]) + + eq(desc, meths.get_autocmds({ event = 'BufReadPost' })[1].desc) + matches('<lua: %d+>', meths.get_autocmds({ event = 'BufReadPost' })[1].command) + end) + + it('will not add a description unless it was provided', function() + exec_lua([[ + local callback = function() print 'Should Not Have Errored' end + vim.api.nvim_create_autocmd("BufReadPost", { + pattern = "*.py", + callback = callback, + }) + ]]) + + eq(nil, meths.get_autocmds({ event = 'BufReadPost' })[1].desc) end) it('can add description to multiple autocmd', function() @@ -169,15 +201,11 @@ describe('autocmd api', function() ]] meths.exec_autocmds("User", {pattern = "Test"}) - eq({{ - buflocal = false, - command = 'A test autocommand', - desc = 'A test autocommand', - event = 'User', - id = 1, - once = false, - pattern = 'Test', - }}, meths.get_autocmds({event = "User", pattern = "Test"})) + + local aus = meths.get_autocmds({ event = 'User', pattern = 'Test' }) + local first = aus[1] + eq(first.id, 1) + meths.set_var("some_condition", true) meths.exec_autocmds("User", {pattern = "Test"}) eq({}, meths.get_autocmds({event = "User", pattern = "Test"})) |