aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/autocmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/autocmd.c')
-rw-r--r--src/nvim/autocmd.c85
1 files changed, 50 insertions, 35 deletions
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c
index 6c7950fdd1..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;
@@ -1220,7 +1229,7 @@ int do_doautocmd(char *arg_start, bool do_msg, bool *did_something)
// Loop over the events.
while (*arg && !ends_excmd(*arg) && !ascii_iswhite(*arg)) {
if (apply_autocmds_group(event_name2nr(arg, &arg), fname, NULL, true, group,
- curbuf, NULL)) {
+ curbuf, NULL, NULL)) {
nothing_done = false;
}
}
@@ -1505,7 +1514,7 @@ win_found:
/// @return true if some commands were executed.
bool apply_autocmds(event_T event, char *fname, char *fname_io, bool force, buf_T *buf)
{
- return apply_autocmds_group(event, fname, fname_io, force, AUGROUP_ALL, buf, NULL);
+ return apply_autocmds_group(event, fname, fname_io, force, AUGROUP_ALL, buf, NULL, NULL);
}
/// Like apply_autocmds(), but with extra "eap" argument. This takes care of
@@ -1522,7 +1531,7 @@ bool apply_autocmds(event_T event, char *fname, char *fname_io, bool force, buf_
bool apply_autocmds_exarg(event_T event, char *fname, char *fname_io, bool force, buf_T *buf,
exarg_T *eap)
{
- return apply_autocmds_group(event, fname, fname_io, force, AUGROUP_ALL, buf, eap);
+ return apply_autocmds_group(event, fname, fname_io, force, AUGROUP_ALL, buf, eap, NULL);
}
/// Like apply_autocmds(), but handles the caller's retval. If the script
@@ -1546,7 +1555,7 @@ bool apply_autocmds_retval(event_T event, char *fname, char *fname_io, bool forc
}
bool did_cmd = apply_autocmds_group(event, fname, fname_io, force,
- AUGROUP_ALL, buf, NULL);
+ AUGROUP_ALL, buf, NULL, NULL);
if (did_cmd && aborting()) {
*retval = FAIL;
}
@@ -1595,7 +1604,7 @@ bool trigger_cursorhold(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
///
/// @return true if some commands were executed.
bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force, int group,
- buf_T *buf, exarg_T *eap)
+ buf_T *buf, exarg_T *eap, Object *data)
{
char *sfname = NULL; // short file name
bool retval = false;
@@ -1811,6 +1820,9 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force
patcmd.next = active_apc_list;
active_apc_list = &patcmd;
+ // Attach data to command
+ patcmd.data = data;
+
// set v:cmdarg (only when there is a matching pattern)
save_cmdbang = (long)get_vim_var_nr(VV_CMDBANG);
if (eap != NULL) {
@@ -2026,6 +2038,10 @@ static bool call_autocmd_callback(const AutoCmd *ac, const AutoPatCmd *apc)
PUT(data, "file", CSTR_TO_OBJ((char *)autocmd_fname));
PUT(data, "buf", INTEGER_OBJ(autocmd_bufnr));
+ if (apc->data) {
+ PUT(data, "data", copy_object(*apc->data));
+ }
+
int group = apc->curpat->group;
switch (group) {
case AUGROUP_ERROR:
@@ -2111,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();
}
@@ -2463,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";
}