patch 9.1.1419: It is difficult to ignore all but some events
Problem: It is difficult to ignore all but some events.
Solution: Add support for a "-" prefix syntax in '(win)eventignore' that
subtracts an event from the ignored set if present
(Luuk van Baal).
closes: #17392
Signed-off-by: Luuk van Baal <luukvbaal@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/autocmd.c b/src/autocmd.c
index 6a5f035..c8e51b2 100644
--- a/src/autocmd.c
+++ b/src/autocmd.c
@@ -803,16 +803,26 @@
int
event_ignored(event_T event, char_u *ei)
{
+ int ignored = FALSE;
while (*ei != NUL)
{
- if (STRNICMP(ei, "all", 3) == 0 && (ei[3] == NUL || ei[3] == ',')
- && (ei == p_ei || (event_tab[event].key <= 0)))
- return TRUE;
- if (event_name2nr(ei, &ei) == event)
- return TRUE;
+ int unignore = *ei == '-';
+ ei += unignore;
+ if (STRNICMP(ei, "all", 3) == 0 && (ei[3] == NUL || ei[3] == ','))
+ {
+ ignored = ei == p_ei || (event_tab[event].key <= 0);
+ ei += 3 + (ei[3] == ',');
+ }
+ else if (event_name2nr(ei, &ei) == event)
+ {
+ if (unignore)
+ return FALSE;
+ else
+ ignored = TRUE;
+ }
}
- return FALSE;
+ return ignored;
}
/*
@@ -827,13 +837,10 @@
while (*ei)
{
if (STRNICMP(ei, "all", 3) == 0 && (ei[3] == NUL || ei[3] == ','))
- {
- ei += 3;
- if (*ei == ',')
- ++ei;
- }
+ ei += 3 + (ei[3] == ',');
else
{
+ ei += (*ei == '-');
event_T event = event_name2nr(ei, &ei);
if (event == NUM_EVENTS || (win && event_tab[event].key > 0))
return FAIL;