Skip to content
forked from neovim/neovim

Commit

Permalink
fix(autocmds): separate command from desc (neovim#18617)
Browse files Browse the repository at this point in the history
  • Loading branch information
kylo252 authored and dundargoc committed May 21, 2022
1 parent cb1b4bb commit 3a1e8ef
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 43 deletions.
2 changes: 1 addition & 1 deletion src/nvim/api/autocmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
68 changes: 38 additions & 30 deletions src/nvim/autocmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,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);
}
Expand Down Expand Up @@ -1135,8 +1146,6 @@ int autocmd_register(int64_t id, event_T event, char_u *pat, int patlen, int gro
// perhaps: <lua>DESCRIPTION or similar
if (desc != NULL) {
ac->desc = xstrdup(desc);
} else {
ac->desc = aucmd_exec_default_desc(aucmd);
}

return OK;
Expand Down Expand Up @@ -2110,8 +2119,10 @@ char_u *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();
}

Expand Down Expand Up @@ -2460,44 +2471,41 @@ 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)
{
switch (acc.type) {
case CALLABLE_EX:
return (char *)acc.callable.cmd;
return xstrdup((char *)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";
}
Expand Down
52 changes: 40 additions & 12 deletions test/functional/api/autocmd_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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"}))
Expand Down

0 comments on commit 3a1e8ef

Please sign in to comment.