]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1419: It is difficult to ignore all but some events v9.1.1419
authorLuuk van Baal <luukvbaal@gmail.com>
Sat, 31 May 2025 10:10:31 +0000 (12:10 +0200)
committerChristian Brabandt <cb@256bit.org>
Sat, 31 May 2025 10:10:31 +0000 (12:10 +0200)
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>
runtime/doc/options.txt
src/autocmd.c
src/optionstr.c
src/testdir/gen_opt_test.vim
src/testdir/test_autocmd.vim
src/testdir/test_options.vim
src/version.c

index 47f56c0f4f863bb6557cba10b0277a4af935e2a4..d69c204f316584d251a3cb279c3995c4a9cc9486 100644 (file)
@@ -1,4 +1,4 @@
-*options.txt*  For Vim version 9.1.  Last change: 2025 May 30
+*options.txt*  For Vim version 9.1.  Last change: 2025 May 31
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -3376,6 +3376,9 @@ A jump table for the options with a short description can be found at |Q_op|.
        events are ignored, autocommands will not be executed.
        Otherwise this is a comma-separated list of event names.  Example: >
            :set ei=WinEnter,WinLeave
+<
+       To ignore all but some events, a "-" prefix can be used: >
+           :set ei=all,-WinLeave
 <
                                                *'eventignorewin'* *'eiw'*
 'eventignorewin' 'eiw' string  (default "")
index 6a5f035d2e97a6ccbc8ef18e1bee36b5e5cd2759..c8e51b2b750ab8444f408bc0c983dedea9f4d903 100644 (file)
@@ -803,16 +803,26 @@ find_end_event(
     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 @@ check_ei(char_u *ei)
     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;
index 603d0f4251f2a26970797e788b4843b5bb35d14a..d667e535809d28f6eda09079a0488390ee18a401 100644 (file)
@@ -2248,11 +2248,18 @@ static int expand_eiw = FALSE;
     static char_u *
 get_eventignore_name(expand_T *xp, int idx)
 {
+    int subtract = *xp->xp_pattern == '-';
     // 'eventignore(win)' allows special keyword "all" in addition to
     // all event names.
-    if (idx == 0)
+    if (!subtract && idx == 0)
        return (char_u *)"all";
-    return get_event_name_no_group(xp, idx - 1, expand_eiw);
+
+    char_u *name = get_event_name_no_group(xp, idx - 1 + subtract, expand_eiw);
+    if (name == NULL)
+       return NULL;
+
+    sprintf((char *)IObuff, "%s%s", subtract ? "-" : "", name);
+    return IObuff;
 }
 
     int
index 1f1545382fff10e9b5ee1d2771e5015a97c85fed..5b9616f6f523da1bae958747ee23ad113b611dec 100644 (file)
@@ -195,9 +195,9 @@ let test_values = {
       \                ['xxx']],
       \ 'eadirection': [['', 'both', 'ver', 'hor'], ['xxx', 'ver,hor']],
       \ 'encoding': [['latin1'], ['xxx', '']],
-      \ 'eventignore': [['', 'WinEnter', 'WinLeave,winenter', 'all,WinEnter'],
+      \ 'eventignore': [['', 'WinEnter', 'WinLeave,winenter', 'all,WinEnter', 'all,-WinLeave'],
       \                ['xxx']],
-      \ 'eventignorewin': [['', 'WinEnter', 'WinLeave,winenter', 'all,WinEnter'],
+      \ 'eventignorewin': [['', 'WinEnter', 'WinLeave,winenter', 'all,WinEnter', 'all,-WinLeave'],
       \                ['xxx', 'WinNew']],
       \ 'fileencoding': [['', 'latin1', 'xxx'], []],
       \ 'fileformat': [['', 'dos', 'unix', 'mac'], ['xxx']],
index dfeb93f06d96cdadcba6d5894a27410af8fd4f76..3dc49602687ffb0b3169709c9b13e79d06068096 100644 (file)
@@ -5463,4 +5463,20 @@ func Test_reuse_curbuf_switch()
   %bw!
 endfunc
 
+func Test_eventignore_subtract()
+  set eventignore=all,-WinEnter
+  augroup testing
+    autocmd!
+    autocmd WinEnter * ++once let s:triggered = 1
+  augroup END
+
+  new
+  call assert_equal(1, s:triggered)
+
+  set eventignore&
+  unlet! s:triggered
+  call CleanUpTestAuGroup()
+  %bw!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 867919872ff44852fdbf194a727e92e140fd6abc..e85dd6a9cc42d6da15c4208e78bf1156260aa29e 100644 (file)
@@ -602,6 +602,7 @@ func Test_set_completion_string_values()
 
   " Other string options that queries the system rather than fixed enum names
   call assert_equal(['all', 'BufAdd'], getcompletion('set eventignore=', 'cmdline')[0:1])
+  call assert_equal(['-BufAdd', '-BufCreate'], getcompletion('set eventignore=all,-', 'cmdline')[0:1])
   call assert_equal(['WinLeave', 'WinResized', 'WinScrolled'], getcompletion('set eiw=', 'cmdline')[-3:-1])
   call assert_equal('latin1', getcompletion('set fileencodings=', 'cmdline')[1])
   call assert_equal('top', getcompletion('set printoptions=', 'cmdline')[0])
index 8b10cf46a46448c6c061ca88e7e4ab5695fb08d9..6c7a2abdda388409e7df9dea122014eee14e384f 100644 (file)
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1419,
 /**/
     1418,
 /**/