aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/autocmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/api/autocmd.c')
-rw-r--r--src/nvim/api/autocmd.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/nvim/api/autocmd.c b/src/nvim/api/autocmd.c
index 19b4119344..3a35e49dc8 100644
--- a/src/nvim/api/autocmd.c
+++ b/src/nvim/api/autocmd.c
@@ -66,7 +66,9 @@ static int64_t next_autocmd_id = 1;
/// - group_name (string): the autocommand group name.
/// - desc (string): the autocommand description.
/// - event (string): the autocommand event.
-/// - command (string): the autocommand command.
+/// - command (string): the autocommand command. Note: this will be empty if a callback is set.
+/// - callback (function|string|nil): Lua function or name of a Vim script function
+/// which is executed when this autocommand is triggered.
/// - once (boolean): whether the autocommand is only run once.
/// - pattern (string): the autocommand pattern.
/// If the autocommand is buffer local |autocmd-buffer-local|:
@@ -280,9 +282,28 @@ Array nvim_get_autocmds(Dict(get_autocmds) *opts, Error *err)
PUT(autocmd_info, "desc", CSTR_TO_OBJ(ac->desc));
}
- PUT(autocmd_info,
- "command",
- STRING_OBJ(cstr_as_string(aucmd_exec_to_string(ac, ac->exec))));
+ if (ac->exec.type == CALLABLE_CB) {
+ PUT(autocmd_info, "command", STRING_OBJ(STRING_INIT));
+
+ Callback *cb = &ac->exec.callable.cb;
+ switch (cb->type) {
+ case kCallbackLua:
+ if (nlua_ref_is_function(cb->data.luaref)) {
+ PUT(autocmd_info, "callback", LUAREF_OBJ(api_new_luaref(cb->data.luaref)));
+ }
+ break;
+ case kCallbackFuncref:
+ case kCallbackPartial:
+ PUT(autocmd_info, "callback", STRING_OBJ(cstr_as_string(callback_to_string(cb))));
+ break;
+ default:
+ abort();
+ }
+ } else {
+ PUT(autocmd_info,
+ "command",
+ STRING_OBJ(cstr_as_string(xstrdup(ac->exec.callable.cmd))));
+ }
PUT(autocmd_info,
"pattern",
@@ -442,7 +463,8 @@ Integer nvim_create_autocmd(uint64_t channel_id, Object event, Dict(create_autoc
// not do that.
Object *callback = &opts->callback;
- if (callback->type == kObjectTypeLuaRef) {
+ switch (callback->type) {
+ case kObjectTypeLuaRef:
if (callback->data.luaref == LUA_NOREF) {
api_set_error(err,
kErrorTypeValidation,
@@ -459,10 +481,12 @@ Integer nvim_create_autocmd(uint64_t channel_id, Object event, Dict(create_autoc
cb.type = kCallbackLua;
cb.data.luaref = api_new_luaref(callback->data.luaref);
- } else if (callback->type == kObjectTypeString) {
+ break;
+ case kObjectTypeString:
cb.type = kCallbackFuncref;
cb.data.funcref = string_to_cstr(callback->data.string);
- } else {
+ break;
+ default:
api_set_error(err,
kErrorTypeException,
"'callback' must be a lua function or name of vim function");