patch 9.1.1084: Unable to persistently ignore events in a window and its buffers
Problem: Unable to persistently ignore events in a window and its buffers.
Solution: Add 'eventignorewin' option to ignore events in a window and buffer
(Luuk van Baal)
Add the window-local 'eventignorewin' option that is analogous to
'eventignore', but applies to a certain window and its buffers. Identify
events that should be allowed in 'eventignorewin', adapt "auto_event"
and "event_tab" to encode this information. Window context is not passed
onto apply_autocmds_group(), and when to ignore an event is a bit
ambiguous when "buf" is not "curbuf", rather than a large refactor, only
ignore an event when all windows into "buf" are ignoring the event.
closes: #16530
Signed-off-by: Luuk van Baal <luukvbaal@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 5868f1c..bcb0f59 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -4103,10 +4103,10 @@
augroup END
let expected = [
- \ {'cmd': 'echo "suspend"', 'group': 'TestAutoCmdFns', 'pattern': '*',
- \ 'nested': v:true, 'once': v:false, 'event': 'VimSuspend'},
\ {'cmd': 'echo "resume"', 'group': 'TestAutoCmdFns', 'pattern': '*',
- \ 'nested': v:false, 'once': v:true, 'event': 'VimResume'}]
+ \ 'nested': v:false, 'once': v:true, 'event': 'VimResume'},
+ \ {'cmd': 'echo "suspend"', 'group': 'TestAutoCmdFns', 'pattern': '*',
+ \ 'nested': v:true, 'once': v:false, 'event': 'VimSuspend'}]
call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns'}))
" Test for buffer-local autocmd
@@ -4926,4 +4926,64 @@
set cmdheight& mouse& laststatus&
endfunc
+func Test_eventignorewin()
+ defer CleanUpTestAuGroup()
+ augroup testing
+ au WinEnter * :call add(g:evs, ["WinEnter", expand("<afile>")])
+ au WinLeave * :call add(g:evs, ["WinLeave", expand("<afile>")])
+ au BufWinEnter * :call add(g:evs, ["BufWinEnter", expand("<afile>")])
+ augroup END
+
+ let g:evs = []
+ set eventignorewin=WinLeave,WinEnter
+ split foo
+ call assert_equal([['BufWinEnter', 'foo']], g:evs)
+ set eventignorewin=all
+ edit bar
+ call assert_equal([['BufWinEnter', 'foo']], g:evs)
+ set eventignorewin=
+ wincmd w
+ call assert_equal([['BufWinEnter', 'foo'], ['WinLeave', 'bar']], g:evs)
+
+ only!
+ %bwipe!
+ set eventignorewin&
+ unlet g:evs
+endfunc
+
+func Test_WinScrolled_Resized_eiw()
+ CheckRunVimInTerminal
+
+ let lines =<< trim END
+ call setline(1, ['foo']->repeat(32))
+ set eventignorewin=WinScrolled,WinResized
+ split
+ let [g:afile,g:resized,g:scrolled] = ['none',0,0]
+ au WinScrolled * let [g:afile,g:scrolled] = [expand('<afile>'),g:scrolled+1]
+ au WinResized * let [g:afile,g:resized] = [expand('<afile>'),g:resized+1]
+ END
+ call writefile(lines, 'Xtest_winscrolled_mouse', 'D')
+ let buf = RunVimInTerminal('-S Xtest_winscrolled_mouse', {'rows': 10})
+
+ " Both windows are ignoring resize events
+ call term_sendkeys(buf, "\<C-W>-")
+ call TermWait(buf)
+ call term_sendkeys(buf, ":echo g:afile g:resized g:scrolled\<CR>")
+ call WaitForAssert({-> assert_equal('none 0 0', term_getline(buf, 10))}, 1000)
+
+ " And scroll events
+ call term_sendkeys(buf, "Ggg")
+ call TermWait(buf)
+ call term_sendkeys(buf, ":echo g:afile g:resized g:scrolled\<CR>")
+ call WaitForAssert({-> assert_equal('none 0 0', term_getline(buf, 10))}, 1000)
+
+ " Un-ignore events in second window, make first window current and resize
+ call term_sendkeys(buf, ":set eventignorewin=\<CR>\<C-W>w\<C-W>+")
+ call TermWait(buf)
+ call term_sendkeys(buf, ":echo win_getid() g:afile g:resized g:scrolled\<CR>")
+ call WaitForAssert({-> assert_equal('1000 1001 1 1', term_getline(buf, 10))}, 1000)
+
+ call StopVimInTerminal(buf)
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab