feat(api): remove Lua autocommand callbacks when they return true (#17784)

This copies the semantics of nvim_buf_attach callbacks, and is a
convenient way to create oneshot autocommands gated by some condition.
This commit is contained in:
Gregory Anders
2022-03-19 18:57:58 -06:00
committed by GitHub
parent 77eb6f9dc7
commit be35d3c5ad
3 changed files with 45 additions and 6 deletions

View File

@@ -2013,6 +2013,7 @@ char_u *getnextac(int c, void *cookie, int indent, bool do_concat)
}
AutoCmd *ac = acp->nextcmd;
bool oneshot = ac->once;
if (p_verbose >= 9) {
verbose_enter_scroll();
@@ -2024,7 +2025,13 @@ char_u *getnextac(int c, void *cookie, int indent, bool do_concat)
if (ac->exec.type == CALLABLE_CB) {
typval_T argsin = TV_INITIAL_VALUE;
typval_T rettv = TV_INITIAL_VALUE;
callback_call(&ac->exec.callable.cb, 0, &argsin, &rettv);
if (callback_call(&ac->exec.callable.cb, 0, &argsin, &rettv)) {
if (ac->exec.callable.cb.type == kCallbackLua) {
// If a Lua callback returns 'true' then the autocommand is removed
oneshot = true;
}
}
// TODO(tjdevries):
//
@@ -2042,7 +2049,7 @@ char_u *getnextac(int c, void *cookie, int indent, bool do_concat)
}
// Remove one-shot ("once") autocmd in anticipation of its execution.
if (ac->once) {
if (oneshot) {
aucmd_del(ac);
}
autocmd_nested = ac->nested;

View File

@@ -7730,6 +7730,7 @@ bool callback_call(Callback *const callback, const int argcount_in, typval_T *co
partial_T *partial;
char_u *name;
Array args = ARRAY_DICT_INIT;
Object rv;
switch (callback->type) {
case kCallbackFuncref:
name = callback->data.funcref;
@@ -7742,10 +7743,13 @@ bool callback_call(Callback *const callback, const int argcount_in, typval_T *co
break;
case kCallbackLua:
nlua_call_ref(callback->data.luaref, NULL, args, false, NULL);
return false;
break;
rv = nlua_call_ref(callback->data.luaref, NULL, args, true, NULL);
switch (rv.type) {
case kObjectTypeBoolean:
return rv.data.boolean;
default:
return false;
}
case kCallbackNone:
return false;