diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2020-01-13 00:19:20 -0800 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2020-01-18 21:32:14 -0800 |
commit | 156c25e4983d4c106ba70e5e3bcc6bbb012d8065 (patch) | |
tree | 64e89489d61715dc4bfa5f6da3f7211ed43c256d | |
parent | 2b8e66c6ce0a5ccae09023732c06da90f96ed5f5 (diff) | |
download | rneovim-156c25e4983d4c106ba70e5e3bcc6bbb012d8065.tar.gz rneovim-156c25e4983d4c106ba70e5e3bcc6bbb012d8065.tar.bz2 rneovim-156c25e4983d4c106ba70e5e3bcc6bbb012d8065.zip |
WinClosed: sort auevents.lua; improve tests
- test: reduce verbosity, condense redundancy, improve readability
- auevents.lua: keep events sorted by name. ref afd1d412fa91
-rw-r--r-- | runtime/doc/autocmd.txt | 26 | ||||
-rw-r--r-- | src/nvim/auevents.lua | 10 | ||||
-rw-r--r-- | src/nvim/window.c | 3 | ||||
-rw-r--r-- | test/functional/autocmd/autocmd_spec.lua | 148 | ||||
-rw-r--r-- | test/functional/helpers.lua | 13 |
5 files changed, 102 insertions, 98 deletions
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt index d15f5e7900..608f8bbf3d 100644 --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -576,8 +576,7 @@ ColorSchemePre Before loading a color scheme. |:colorscheme| CompleteChanged *CompleteChanged* After each time the Insert mode completion menu changed. Not fired on popup menu hide, - use |CompleteDone| for that. Never triggered - recursively. + use |CompleteDone| for that. Sets these |v:event| keys: completed_item See |complete-items|. @@ -588,7 +587,8 @@ CompleteChanged *CompleteChanged* size total nr of items scrollbar TRUE if visible - It is not allowed to change the text |textlock|. + Non-recursive (event cannot trigger itself). + Cannot change the text. |textlock| The size and position of the popup are also available by calling |pum_getpos()|. @@ -661,7 +661,7 @@ DirChanged After the |current-directory| was changed. Sets these |v:event| keys: cwd: current working directory scope: "global", "tab", "window" - Recursion is ignored. + Non-recursive (event cannot trigger itself). *FileAppendCmd* FileAppendCmd Before appending to a file. Should do the appending to the file. Use the '[ and '] @@ -697,6 +697,7 @@ ExitPre When using `:quit`, `:wq` in a way it makes cancelled if there is a modified buffer that isn't automatically saved, use |VimLeavePre| for really exiting. + See also |QuitPre|, |WinClosed|. *FileChangedShell* FileChangedShell When Vim notices that the modification time of a file has changed since editing started. @@ -841,7 +842,7 @@ TextYankPost Just after a |yank| or |deleting| command, but not and |']| marks can be used to calculate the precise region of the operation. - Recursion is ignored. + Non-recursive (event cannot trigger itself). Cannot change the text. |textlock| *InsertEnter* InsertEnter Just before starting Insert mode. Also for @@ -908,8 +909,8 @@ OptionSet After setting an option (except during always use |:noautocmd| to prevent triggering OptionSet. - Recursion is ignored, thus |:set| in the - autocommand does not trigger OptionSet again. + Non-recursive: |:set| in the autocommand does + not trigger OptionSet again. *QuickFixCmdPre* QuickFixCmdPre Before a quickfix command is run (|:make|, @@ -941,7 +942,7 @@ QuitPre When using `:quit`, `:wq` or `:qall`, before or quits Vim. Can be used to close any non-essential window if the current window is the last ordinary window. - Also see |ExitPre|. + See also |ExitPre|, ||WinClosed|. *RemoteReply* RemoteReply When a reply from a Vim that functions as server was received |server2client()|. The @@ -1042,8 +1043,8 @@ TabNew When creating a new tab page. |tab-page| TabNewEntered After entering a new tab page. |tab-page| After BufEnter. *TabClosed* -TabClosed After closing a tab page. <afile> can be used - for the tab page number. +TabClosed After closing a tab page. <afile> expands to + the tab page number. *TermOpen* TermOpen When a |terminal| job is starting. Can be used to configure the terminal buffer. @@ -1133,7 +1134,10 @@ VimResume After Nvim resumes from |suspend| state. *VimSuspend* VimSuspend Before Nvim enters |suspend| state. *WinClosed* -WinClosed After closing a window. +WinClosed After closing a window. <afile> expands to the + |window-ID|. + Non-recursive (event cannot trigger itself). + See also |ExitPre|, |QuitPre|. *WinEnter* WinEnter After entering another window. Not done for the first window, when Vim has just started. diff --git a/src/nvim/auevents.lua b/src/nvim/auevents.lua index d596edf551..96e170a9e1 100644 --- a/src/nvim/auevents.lua +++ b/src/nvim/auevents.lua @@ -21,12 +21,12 @@ return { 'BufWritePre', -- before writing a buffer 'ChanInfo', -- info was received about channel 'ChanOpen', -- channel was opened - 'CmdlineChanged', -- command line was modified - 'CmdlineEnter', -- after entering cmdline mode - 'CmdlineLeave', -- before leaving cmdline mode 'CmdUndefined', -- command undefined 'CmdWinEnter', -- after entering the cmdline window 'CmdWinLeave', -- before leaving the cmdline window + 'CmdlineChanged', -- command line was modified + 'CmdlineEnter', -- after entering cmdline mode + 'CmdlineLeave', -- before leaving cmdline mode 'ColorScheme', -- after loading a colorscheme 'ColorSchemePre', -- before loading a colorscheme 'CompleteChanged', -- after popup menu changed @@ -76,8 +76,8 @@ return { 'ShellFilterPost', -- after ":1,2!cmd", ":w !cmd", ":r !cmd". 'Signal', -- after nvim process received a signal 'SourceCmd', -- sourcing a Vim script using command - 'SourcePre', -- before sourcing a Vim script 'SourcePost', -- after sourcing a Vim script + 'SourcePre', -- before sourcing a Vim script 'SpellFileMissing', -- spell file missing 'StdinReadPost', -- after reading from stdin 'StdinReadPre', -- before reading from stdin @@ -107,10 +107,10 @@ return { 'VimResized', -- after Vim window was resized 'VimResume', -- after Nvim is resumed 'VimSuspend', -- before Nvim is suspended + 'WinClosed', -- after closing a window 'WinEnter', -- after entering a window 'WinLeave', -- before leaving a window 'WinNew', -- when entering a new window - 'WinClosed', -- after closing a window }, aliases = { BufCreate = 'BufAdd', diff --git a/src/nvim/window.c b/src/nvim/window.c index 9efed49e70..8181883426 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -2695,8 +2695,7 @@ static void do_autocmd_winclosed(win_T *win) return; } recursive = true; - - char_u winid[10]; + char_u winid[NUMBUFLEN]; vim_snprintf((char *)winid, sizeof(winid), "%i", win->handle); apply_autocmds(EVENT_WINCLOSED, winid, winid, false, win->w_buffer); recursive = false; diff --git a/test/functional/autocmd/autocmd_spec.lua b/test/functional/autocmd/autocmd_spec.lua index 6cb12750a1..e62d3bb66b 100644 --- a/test/functional/autocmd/autocmd_spec.lua +++ b/test/functional/autocmd/autocmd_spec.lua @@ -1,8 +1,8 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') +local assert_visible = helpers.assert_visible local dedent = helpers.dedent -local neq = helpers.neq local eq = helpers.eq local eval = helpers.eval local feed = helpers.feed @@ -19,98 +19,86 @@ local source = helpers.source describe('autocmd', function() before_each(clear) - it(':tabnew triggers events in the correct order', function() + it(':tabnew, :split, :close events order, <afile>', function() local expected = { - 'WinLeave', - 'TabLeave', - 'WinEnter', - 'TabNew', - 'TabEnter', - 'BufLeave', - 'BufEnter' + {'WinLeave', ''}, + {'TabLeave', ''}, + {'WinEnter', ''}, + {'TabNew', 'testfile1'}, -- :tabnew + {'TabEnter', ''}, + {'BufLeave', ''}, + {'BufEnter', 'testfile1'}, -- :split + {'WinLeave', 'testfile1'}, + {'WinEnter', 'testfile1'}, + {'WinLeave', 'testfile1'}, + {'WinClosed', '1002'}, -- :close, WinClosed <afile> = window-id + {'WinEnter', 'testfile1'}, + {'WinLeave', 'testfile1'}, -- :bdelete + {'WinEnter', 'testfile1'}, + {'BufLeave', 'testfile1'}, + {'BufEnter', 'testfile2'}, + {'WinClosed', '1000'}, } - command('let g:foo = []') - command('autocmd BufEnter * :call add(g:foo, "BufEnter")') - command('autocmd BufLeave * :call add(g:foo, "BufLeave")') - command('autocmd TabEnter * :call add(g:foo, "TabEnter")') - command('autocmd TabLeave * :call add(g:foo, "TabLeave")') - command('autocmd TabNew * :call add(g:foo, "TabNew")') - command('autocmd WinEnter * :call add(g:foo, "WinEnter")') - command('autocmd WinLeave * :call add(g:foo, "WinLeave")') - command('tabnew') - assert.same(expected, eval('g:foo')) - end) - - it(':close triggers WinClosed event', function() - command('let g:triggered = 0') - command('new') - command('autocmd WinClosed <buffer> :let g:triggered+=1') - eq(0, eval('g:triggered')) + command('let g:evs = []') + command('autocmd BufEnter * :call add(g:evs, ["BufEnter", expand("<afile>")])') + command('autocmd BufLeave * :call add(g:evs, ["BufLeave", expand("<afile>")])') + command('autocmd TabEnter * :call add(g:evs, ["TabEnter", expand("<afile>")])') + command('autocmd TabLeave * :call add(g:evs, ["TabLeave", expand("<afile>")])') + command('autocmd TabNew * :call add(g:evs, ["TabNew", expand("<afile>")])') + command('autocmd WinEnter * :call add(g:evs, ["WinEnter", expand("<afile>")])') + command('autocmd WinLeave * :call add(g:evs, ["WinLeave", expand("<afile>")])') + command('autocmd WinClosed * :call add(g:evs, ["WinClosed", expand("<afile>")])') + command('tabnew testfile1') + command('split') command('close') - eq(1, eval('g:triggered')) + command('new testfile2') + command('bdelete 1') + eq(expected, eval('g:evs')) end) - it('WinClosed event exposes window id as <afile>', function() - command('new') - local id = meths.get_current_win().id - helpers.nvim('command', 'au! WinClosed * echom "winclosed:".expand("<afile>").":".expand("<amatch>").":".win_getid()') - eq(string.format("winclosed:%s:%s:%s", id, id, id), helpers.nvim('exec', 'close', true)) - end) - - it(':bdelete triggers WinClosed event', function() + it('WinClosed is non-recursive', function() command('let g:triggered = 0') - command('autocmd WinClosed <buffer> :let g:triggered+=1') - local first_buffer = eval("bufnr('%')") - command('new') - command('bdelete ' .. first_buffer ) - eq(1, eval('g:triggered')) - end) + command('autocmd WinClosed * :let g:triggered+=1 | :bdelete 2') + command('new testfile2') + command('new testfile3') - it(':close triggers WinClosed event in another tab', function() - command('let g:triggered = 0') - local current_buffer = eval("bufnr('%')") - command('autocmd WinClosed <buffer> :let g:triggered+=1') - command('tabnew') - command('bdelete ' .. current_buffer) - eq(1, eval('g:triggered')) - end) + -- All 3 buffers are visible. + assert_visible(1, true) + assert_visible(2, true) + assert_visible(3, true) - it('WinClosed events are not recursive in different window', function() - command('let g:triggered = 0') - local first_buffer = eval("bufnr('%')") - command('autocmd WinClosed <buffer> :let g:triggered+=1') - command('new') - local second_buffer = eval("bufnr('%')") - command('autocmd WinClosed <buffer> :bdelete ' .. first_buffer) - command('new') - neq(-1, funcs.bufwinnr(first_buffer)) - command('bdelete ' .. second_buffer ) - eq(0, eval('g:triggered')) + -- Trigger WinClosed, which also deletes buffer/window 2. + command('bdelete 1') - -- first event was triggered, second wasn't - eq(-1, funcs.bufwinnr(first_buffer)) - end) - - it('WinClosed events are not recursive in the same window', function() - command('let g:triggered = 0') - command('new') - local second_buffer = eval("bufnr('%')") - command('autocmd WinClosed <buffer> :let g:triggered+=1 | bdelete ' .. second_buffer) - neq(-1, funcs.bufwinnr(second_buffer)) - eq(0, eval('g:triggered')) - command('bdelete ' .. second_buffer ) - eq(-1, funcs.bufwinnr(second_buffer)) + -- Buffers 1 and 2 were closed but WinClosed was triggered only once. eq(1, eval('g:triggered')) + assert_visible(1, false) + assert_visible(2, false) + assert_visible(3, true) end) - it('WinClosed events are not recursive in different tab', function() - command('let g:triggered = 0') + it('WinClosed from a different tabpage', function() + command('let g:evs = []') + command('edit tesfile1') + command('autocmd WinClosed <buffer> :call add(g:evs, ["WinClosed", expand("<abuf>")])') + local buf1 = eval("bufnr('%')") command('new') - local second_buffer = eval("bufnr('%')") - command('autocmd WinClosed <buffer> :let g:triggered+=1 | bdelete ' .. second_buffer) - command('tabnew') - command('bdelete ' .. second_buffer ) - eq(1, eval('g:triggered')) + local buf2 = eval("bufnr('%')") + command('autocmd WinClosed <buffer> :call add(g:evs, ["WinClosed", expand("<abuf>")])' + -- Attempt recursion. + ..' | bdelete '..buf2) + command('tabedit testfile2') + command('tabedit testfile3') + command('bdelete '..buf2) + -- Non-recursive: only triggered once. + eq({ + {'WinClosed', '2'}, + }, eval('g:evs')) + command('bdelete '..buf1) + eq({ + {'WinClosed', '2'}, + {'WinClosed', '1'}, + }, eval('g:evs')) end) it('v:vim_did_enter is 1 after VimEnter', function() diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua index e0012c6ced..de61ff9cc8 100644 --- a/test/functional/helpers.lua +++ b/test/functional/helpers.lua @@ -597,6 +597,19 @@ function module.assert_alive() assert(2 == module.eval('1+1'), 'crash? request failed') end +-- Asserts that buffer is loaded and visible in the current tabpage. +function module.assert_visible(bufnr, visible) + assert(type(visible) == 'boolean') + eq(visible, module.bufmeths.is_loaded(bufnr)) + if visible then + assert(-1 ~= module.funcs.bufwinnr(bufnr), + 'expected buffer to be visible in current tabpage: '..tostring(bufnr)) + else + assert(-1 == module.funcs.bufwinnr(bufnr), + 'expected buffer NOT visible in current tabpage: '..tostring(bufnr)) + end +end + local function do_rmdir(path) local mode, errmsg, errcode = lfs.attributes(path, 'mode') if mode == nil then |