From 58a1ef8e6a93c615379f6fbe7234697bcdc42b3e Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 12 Aug 2023 09:50:17 +0800 Subject: fix(events): avoid unnecessary CursorMoved (#24675) Problem: Temporarily changing current window in a script causes CursorMoved to be triggerd. Solution: Don't trigger CursorMoved if neither curwin nor cursor changed between two checks. --- test/functional/autocmd/cursormoved_spec.lua | 39 ++++++++++++++++++---------- 1 file changed, 25 insertions(+), 14 deletions(-) (limited to 'test') diff --git a/test/functional/autocmd/cursormoved_spec.lua b/test/functional/autocmd/cursormoved_spec.lua index 64b63c3205..854e14b088 100644 --- a/test/functional/autocmd/cursormoved_spec.lua +++ b/test/functional/autocmd/cursormoved_spec.lua @@ -3,7 +3,7 @@ local helpers = require('test.functional.helpers')(after_each) local clear = helpers.clear local eq = helpers.eq local eval = helpers.eval -local funcs = helpers.funcs +local meths = helpers.meths local source = helpers.source local command = helpers.command @@ -12,10 +12,10 @@ describe('CursorMoved', function() it('is triggered after BufEnter when changing or splitting windows #11878 #12031', function() source([[ - call setline(1, 'foo') - let g:log = [] - autocmd BufEnter * let g:log += ['BufEnter' .. expand("")] - autocmd CursorMoved * let g:log += ['CursorMoved' .. expand("")] + call setline(1, 'foo') + let g:log = [] + autocmd BufEnter * let g:log += ['BufEnter' .. expand("")] + autocmd CursorMoved * let g:log += ['CursorMoved' .. expand("")] ]]) eq({}, eval('g:log')) command('new') @@ -24,23 +24,34 @@ describe('CursorMoved', function() eq({'BufEnter2', 'CursorMoved2', 'BufEnter1', 'CursorMoved1'}, eval('g:log')) end) + it('is not triggered by temporarily switching window', function() + source([[ + let g:cursormoved = 0 + vnew + autocmd CursorMoved * let g:cursormoved += 1 + ]]) + command('wincmd w | wincmd p') + eq(0, eval('g:cursormoved')) + end) + it("is not triggered by functions that don't change the window", function() source([[ - let g:cursormoved = 0 - let g:buf = bufnr('%') - vsplit foo - autocmd CursorMoved * let g:cursormoved += 1 - call nvim_buf_set_lines(g:buf, 0, -1, v:true, ['aaa']) + let g:cursormoved = 0 + let g:buf = bufnr('%') + vsplit foo + autocmd CursorMoved * let g:cursormoved += 1 ]]) - eq({'aaa'}, funcs.nvim_buf_get_lines(eval('g:buf'), 0, -1, true)) + meths.buf_set_lines(eval('g:buf'), 0, -1, true, {'aaa'}) + eq(0, eval('g:cursormoved')) + eq({'aaa'}, meths.buf_get_lines(eval('g:buf'), 0, -1, true)) eq(0, eval('g:cursormoved')) end) it("is not triggered by cursor movement prior to first CursorMoved instantiation", function() source([[ - let g:cursormoved = 0 - autocmd! CursorMoved - autocmd CursorMoved * let g:cursormoved += 1 + let g:cursormoved = 0 + autocmd! CursorMoved + autocmd CursorMoved * let g:cursormoved += 1 ]]) eq(0, eval('g:cursormoved')) end) -- cgit