aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/fileio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/fileio.c')
-rw-r--r--src/nvim/fileio.c52
1 files changed, 31 insertions, 21 deletions
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c
index 51180c4939..7be4107c94 100644
--- a/src/nvim/fileio.c
+++ b/src/nvim/fileio.c
@@ -5591,39 +5591,48 @@ static void au_del_cmd(AutoCmd *ac)
au_need_clean = true;
}
-/*
- * Cleanup autocommands and patterns that have been deleted.
- * This is only done when not executing autocommands.
- */
+/// Cleanup autocommands and patterns that have been deleted.
+/// This is only done when not executing autocommands.
static void au_cleanup(void)
{
AutoPat *ap, **prev_ap;
AutoCmd *ac, **prev_ac;
event_T event;
- if (autocmd_busy || !au_need_clean)
+ if (autocmd_busy || !au_need_clean) {
return;
+ }
- /* loop over all events */
+ // Loop over all events.
for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
event = (event_T)((int)event + 1)) {
- /* loop over all autocommand patterns */
+ // Loop over all autocommand patterns.
prev_ap = &(first_autopat[(int)event]);
for (ap = *prev_ap; ap != NULL; ap = *prev_ap) {
- /* loop over all commands for this pattern */
+ // Loop over all commands for this pattern.
prev_ac = &(ap->cmds);
+ bool has_cmd = false;
+
for (ac = *prev_ac; ac != NULL; ac = *prev_ac) {
- /* remove the command if the pattern is to be deleted or when
- * the command has been marked for deletion */
+ // Remove the command if the pattern is to be deleted or when
+ // the command has been marked for deletion.
if (ap->pat == NULL || ac->cmd == NULL) {
*prev_ac = ac->next;
xfree(ac->cmd);
xfree(ac);
- } else
+ } else {
+ has_cmd = true;
prev_ac = &(ac->next);
+ }
}
- /* remove the pattern if it has been marked for deletion */
+ if (ap->pat != NULL && !has_cmd) {
+ // Pattern was not marked for deletion, but all of its commands were.
+ // So mark the pattern for deletion.
+ au_remove_pat(ap);
+ }
+
+ // Remove the pattern if it has been marked for deletion.
if (ap->pat == NULL) {
if (ap->next == NULL) {
if (prev_ap == &(first_autopat[(int)event])) {
@@ -5637,12 +5646,13 @@ static void au_cleanup(void)
*prev_ap = ap->next;
vim_regfree(ap->reg_prog);
xfree(ap);
- } else
+ } else {
prev_ap = &(ap->next);
+ }
}
}
- au_need_clean = FALSE;
+ au_need_clean = false;
}
/*
@@ -6050,18 +6060,18 @@ void do_autocmd(char_u *arg_in, int forceit)
cmd = skipwhite(cmd);
for (size_t i = 0; i < 2; i++) {
if (*cmd != NUL) {
- // Check for "-once" flag.
- if (!once && STRNCMP(cmd, "-once", 5) == 0 && ascii_iswhite(cmd[5])) {
+ // Check for "++once" flag.
+ if (!once && STRNCMP(cmd, "++once", 6) == 0 && ascii_iswhite(cmd[6])) {
once = true;
- cmd = skipwhite(cmd + 5);
+ cmd = skipwhite(cmd + 6);
}
- // Check for "-nested" flag.
+ // Check for "++nested" flag.
if (!nested
- && ((STRNCMP(cmd, "-nested", 7) == 0 && ascii_iswhite(cmd[7]))
- // Deprecated form (without "-").
+ && ((STRNCMP(cmd, "++nested", 8) == 0 && ascii_iswhite(cmd[8]))
+ // Deprecated form (without "++").
|| (STRNCMP(cmd, "nested", 6) == 0 && ascii_iswhite(cmd[6])))) {
nested = true;
- cmd = skipwhite(cmd + ('-' == cmd[0] ? 7 : 6));
+ cmd = skipwhite(cmd + ('+' == cmd[0] ? 8 : 6));
}
}
}