aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/autocmd.c
diff options
context:
space:
mode:
authorGregory Anders <8965202+gpanders@users.noreply.github.com>2022-03-19 18:57:58 -0600
committerGitHub <noreply@github.com>2022-03-19 18:57:58 -0600
commitbe35d3c5ad501abb029279f8e1812d0e4525284f (patch)
tree22f0371d83adcf5f2a97809c8a573562bd7fd129 /src/nvim/autocmd.c
parent77eb6f9dc75ebe00aa835441ad623ba46d7108bb (diff)
downloadrneovim-be35d3c5ad501abb029279f8e1812d0e4525284f.tar.gz
rneovim-be35d3c5ad501abb029279f8e1812d0e4525284f.tar.bz2
rneovim-be35d3c5ad501abb029279f8e1812d0e4525284f.zip
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.
Diffstat (limited to 'src/nvim/autocmd.c')
-rw-r--r--src/nvim/autocmd.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c
index df336d8703..a36f2c97b5 100644
--- a/src/nvim/autocmd.c
+++ b/src/nvim/autocmd.c
@@ -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;