patch 9.1.1419: It is difficult to ignore all but some events Commit: https://github.com/vim/vim/commit/8cc6d8b187d53c70c5fdc8fb83d4d3cef35e6d44 Author: Luuk van Baal <luukvb...@gmail.com> Date: Sat May 31 12:10:31 2025 +0200
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 <luukvb...@gmail.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 47f56c0f4..d69c204f3 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -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 "") diff --git a/src/autocmd.c b/src/autocmd.c index 6a5f035d2..c8e51b2b7 100644 --- a/src/autocmd.c +++ b/src/autocmd.c @@ -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; diff --git a/src/optionstr.c b/src/optionstr.c index 603d0f425..d667e5358 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -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 diff --git a/src/testdir/gen_opt_test.vim b/src/testdir/gen_opt_test.vim index 1f1545382..5b9616f6f 100644 --- a/src/testdir/gen_opt_test.vim +++ b/src/testdir/gen_opt_test.vim @@ -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']], diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index dfeb93f06..3dc496026 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -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 diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim index 867919872..e85dd6a9c 100644 --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -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]) diff --git a/src/version.c b/src/version.c index 8b10cf46a..6c7a2abdd 100644 --- a/src/version.c +++ b/src/version.c @@ -709,6 +709,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1419, /**/ 1418, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1uLJF4-008v7H-Cb%40256bit.org.