mirror of
https://github.com/neovim/neovim
synced 2025-07-18 18:21:46 +00:00
Merge pull request #18680 from dundargoc/backport-autocmd
[Backport] fix(autocmds): separate command from desc
This commit is contained in:
@ -283,7 +283,7 @@ Array nvim_get_autocmds(Dict(get_autocmds) *opts, Error *err)
|
|||||||
|
|
||||||
PUT(autocmd_info,
|
PUT(autocmd_info,
|
||||||
"command",
|
"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,
|
PUT(autocmd_info,
|
||||||
"pattern",
|
"pattern",
|
||||||
|
@ -189,7 +189,18 @@ static void aupat_show(AutoPat *ap, event_T event, int previous_group)
|
|||||||
if (got_int) {
|
if (got_int) {
|
||||||
return;
|
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) {
|
if (p_verbose > 0) {
|
||||||
last_set_msg(ac->script_ctx);
|
last_set_msg(ac->script_ctx);
|
||||||
}
|
}
|
||||||
@ -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
|
// perhaps: <lua>DESCRIPTION or similar
|
||||||
if (desc != NULL) {
|
if (desc != NULL) {
|
||||||
ac->desc = xstrdup(desc);
|
ac->desc = xstrdup(desc);
|
||||||
} else {
|
|
||||||
ac->desc = aucmd_exec_default_desc(aucmd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
@ -2110,8 +2119,10 @@ char_u *getnextac(int c, void *cookie, int indent, bool do_concat)
|
|||||||
|
|
||||||
if (p_verbose >= 9) {
|
if (p_verbose >= 9) {
|
||||||
verbose_enter_scroll();
|
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
|
msg_puts("\n"); // don't overwrite this either
|
||||||
|
XFREE_CLEAR(exec_to_string);
|
||||||
verbose_leave_scroll();
|
verbose_leave_scroll();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2460,44 +2471,41 @@ bool autocmd_delete_id(int64_t id)
|
|||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// AucmdExecutable Functions
|
// AucmdExecutable Functions
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
char *aucmd_exec_default_desc(AucmdExecutable acc)
|
|
||||||
{
|
|
||||||
size_t msglen = 100;
|
|
||||||
|
|
||||||
switch (acc.type) {
|
/// Generate a string description of a callback
|
||||||
case CALLABLE_CB:
|
static char *aucmd_callback_to_string(Callback cb)
|
||||||
switch (acc.callable.cb.type) {
|
{
|
||||||
case kCallbackLua: {
|
// NOTE: this function probably belongs in a helper
|
||||||
|
|
||||||
|
size_t msglen = 100;
|
||||||
char *msg = (char *)xmallocz(msglen);
|
char *msg = (char *)xmallocz(msglen);
|
||||||
snprintf(msg, msglen, "<Lua function %d>", acc.callable.cb.data.luaref);
|
|
||||||
return msg;
|
switch (cb.type) {
|
||||||
}
|
case kCallbackLua:
|
||||||
case kCallbackFuncref: {
|
snprintf(msg, msglen, "<lua: %d>", cb.data.luaref);
|
||||||
|
break;
|
||||||
|
case kCallbackFuncref:
|
||||||
// TODO(tjdevries): Is this enough space for this?
|
// TODO(tjdevries): Is this enough space for this?
|
||||||
char *msg = (char *)xmallocz(msglen);
|
snprintf(msg, msglen, "<vim function: %s>", cb.data.funcref);
|
||||||
snprintf(msg, msglen, "<vim function: %s>", acc.callable.cb.data.funcref);
|
break;
|
||||||
return msg;
|
case kCallbackPartial:
|
||||||
}
|
snprintf(msg, msglen, "<vim partial: %s>", cb.data.partial->pt_name);
|
||||||
case kCallbackPartial: {
|
break;
|
||||||
char *msg = (char *)xmallocz(msglen);
|
|
||||||
snprintf(msg, msglen, "<vim partial: %s>", acc.callable.cb.data.partial->pt_name);
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
return NULL;
|
snprintf(msg, msglen, "%s", "");
|
||||||
}
|
break;
|
||||||
default:
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Generate a string description for the command/callback of an autocmd
|
||||||
char *aucmd_exec_to_string(AutoCmd *ac, AucmdExecutable acc)
|
char *aucmd_exec_to_string(AutoCmd *ac, AucmdExecutable acc)
|
||||||
{
|
{
|
||||||
switch (acc.type) {
|
switch (acc.type) {
|
||||||
case CALLABLE_EX:
|
case CALLABLE_EX:
|
||||||
return (char *)acc.callable.cmd;
|
return xstrdup((char *)acc.callable.cmd);
|
||||||
case CALLABLE_CB:
|
case CALLABLE_CB:
|
||||||
return ac->desc;
|
return aucmd_callback_to_string(acc.callable.cb);
|
||||||
case CALLABLE_NONE:
|
case CALLABLE_NONE:
|
||||||
return "This is not possible";
|
return "This is not possible";
|
||||||
}
|
}
|
||||||
|
@ -119,13 +119,45 @@ describe('autocmd api', function()
|
|||||||
|
|
||||||
describe('desc', function()
|
describe('desc', function()
|
||||||
it('can add description to one autocmd', 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", {
|
meths.create_autocmd("BufReadPost", {
|
||||||
pattern = "*.py",
|
pattern = "*.py",
|
||||||
command = "echo 'Should Not Have Errored'",
|
command = cmd,
|
||||||
desc = "Can show description",
|
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)
|
end)
|
||||||
|
|
||||||
it('can add description to multiple autocmd', function()
|
it('can add description to multiple autocmd', function()
|
||||||
@ -169,15 +201,11 @@ describe('autocmd api', function()
|
|||||||
]]
|
]]
|
||||||
|
|
||||||
meths.exec_autocmds("User", {pattern = "Test"})
|
meths.exec_autocmds("User", {pattern = "Test"})
|
||||||
eq({{
|
|
||||||
buflocal = false,
|
local aus = meths.get_autocmds({ event = 'User', pattern = 'Test' })
|
||||||
command = 'A test autocommand',
|
local first = aus[1]
|
||||||
desc = 'A test autocommand',
|
eq(first.id, 1)
|
||||||
event = 'User',
|
|
||||||
id = 1,
|
|
||||||
once = false,
|
|
||||||
pattern = 'Test',
|
|
||||||
}}, meths.get_autocmds({event = "User", pattern = "Test"}))
|
|
||||||
meths.set_var("some_condition", true)
|
meths.set_var("some_condition", true)
|
||||||
meths.exec_autocmds("User", {pattern = "Test"})
|
meths.exec_autocmds("User", {pattern = "Test"})
|
||||||
eq({}, meths.get_autocmds({event = "User", pattern = "Test"}))
|
eq({}, meths.get_autocmds({event = "User", pattern = "Test"}))
|
||||||
|
Reference in New Issue
Block a user