diff --git a/src/nvim/normal.c b/src/nvim/normal.c index ef3d25a7ce..f0378f9712 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -2054,7 +2054,7 @@ static void display_showcmd(void) showcmd_update_clear_state(); if (*p_sloc == 's') { - if (showcmd_is_clear) { + if (showcmd_is_clear && !vgetc_busy) { curwin->w_redr_status = true; } else { win_redr_status(curwin); @@ -2063,7 +2063,7 @@ static void display_showcmd(void) return; } if (*p_sloc == 't') { - if (showcmd_is_clear) { + if (showcmd_is_clear && !vgetc_busy) { redraw_tabline = true; } else { draw_tabline(); diff --git a/test/functional/legacy/statusline_spec.lua b/test/functional/legacy/statusline_spec.lua index bf3bc2315a..6f789a1d6c 100644 --- a/test/functional/legacy/statusline_spec.lua +++ b/test/functional/legacy/statusline_spec.lua @@ -136,4 +136,17 @@ describe('statusline', function() : | ]]) end) + + -- oldtest: Test_statusline_showcmd_nop_map() + it('showcmdloc=statusline is redrawn with timeout and mapping', function() + exec([[ + set timeoutlen=500 showcmd showcmdloc=statusline laststatus=2 + nnoremap + nnoremap + ]]) + feed(' ') + screen:expect({ any = '<20>', timeout = 400 }) + vim.uv.sleep(500) + screen:expect({ none = '<20>', timeout = 400 }) + end) end) diff --git a/test/functional/legacy/tabline_spec.lua b/test/functional/legacy/tabline_spec.lua index 3988ec8956..4564d6cae5 100644 --- a/test/functional/legacy/tabline_spec.lua +++ b/test/functional/legacy/tabline_spec.lua @@ -85,4 +85,16 @@ describe('tabline', function() : | ]]) end) + + -- oldtest: Test_tabline_showcmd_redraw_tabline() + it('clears showcmd rendered by tabline redraw', function() + exec([[ + set showcmd showcmdloc=tabline showtabline=2 tabline=%S timeoutlen=0 + nnoremap g :redraw + nnoremap gc + ]]) + feed('g') + screen:expect({ any = ':redraw', none = '{2::' }) + t.eq('', n.api.nvim_eval_statusline('%S', {}).str) + end) end) diff --git a/test/functional/ui/statusline_spec.lua b/test/functional/ui/statusline_spec.lua index 91b8e37897..0b676be6f9 100644 --- a/test/functional/ui/statusline_spec.lua +++ b/test/functional/ui/statusline_spec.lua @@ -884,15 +884,6 @@ describe('statusline', function() ]]) end) - it('clears showcmd rendered by tabline redraw', function() - command('set showcmd showcmdloc=tabline showtabline=2 tabline=%S timeoutlen=0') - command('nnoremap g :redraw') - command('nnoremap gc ') - feed('g') - screen:expect({ any = ':redraw', none = '{2::' }) - eq('', api.nvim_eval_statusline('%S', {}).str) - end) - it('showcmdloc=statusline works with vertical splits', function() command('rightbelow vsplit') command('set showcmd showcmdloc=statusline') diff --git a/test/old/testdir/test_statusline.vim b/test/old/testdir/test_statusline.vim index e53f281131..1247c18969 100644 --- a/test/old/testdir/test_statusline.vim +++ b/test/old/testdir/test_statusline.vim @@ -667,23 +667,6 @@ func Test_statusline_showcmd() call StopVimInTerminal(buf) endfunc -func Test_statusline_showcmd_redraw_tabline() - CheckRunVimInTerminal - - let lines =<< trim END - set showcmd showcmdloc=tabline showtabline=2 tabline=%S timeoutlen=0 - nnoremap g :redraw - nnoremap gc - END - call writefile(lines, 'XTest_statusline_showcmd_redraw', 'D') - - let buf = RunVimInTerminal('-S XTest_statusline_showcmd_redraw', #{rows: 6, cols: 40}) - call term_sendkeys(buf, 'g') - call WaitForAssert({-> assert_match(':redraw', term_getline(buf, 6))}) - call WaitForAssert({-> assert_notmatch('^:', term_getline(buf, 1))}) - call StopVimInTerminal(buf) -endfunc - func Test_statusline_showcmd_cmd_mapping() set showcmd set statusline=AAA%SBBB @@ -708,6 +691,25 @@ func Test_statusline_showcmd_cmd_mapping() endtry endfunc +func Test_statusline_showcmd_nop_map() + CheckRunVimInTerminal + + let lines =<< trim END + set timeoutlen=500 showcmdloc=statusline laststatus=2 + nnoremap + nnoremap + END + call writefile(lines, 'XTest_statusline_showcmd_nop', 'D') + + let buf = RunVimInTerminal('-S XTest_statusline_showcmd_nop', {'rows': 6}) + call term_sendkeys(buf, ' ') + call WaitForAssert({-> assert_match('<20>', term_getline(buf, 5))}, 400) + sleep 500m + call WaitForAssert({-> assert_notmatch('<20>', term_getline(buf, 5))}, 400) + + call StopVimInTerminal(buf) +endfunc + func Test_statusline_highlight_group_cleared() CheckScreendump diff --git a/test/old/testdir/test_tabline.vim b/test/old/testdir/test_tabline.vim index d1ec2a64fe..72acf51e39 100644 --- a/test/old/testdir/test_tabline.vim +++ b/test/old/testdir/test_tabline.vim @@ -204,6 +204,24 @@ func Test_tabline_showcmd() call StopVimInTerminal(buf) endfunc +func Test_tabline_showcmd_redraw_tabline() + CheckRunVimInTerminal + + let lines =<< trim END + set showcmd showcmdloc=tabline showtabline=2 tabline=%S timeoutlen=0 + nnoremap g :redraw + nnoremap gc + END + call writefile(lines, 'XTest_tabline_showcmd_redraw', 'D') + + let buf = RunVimInTerminal('-S XTest_tabline_showcmd_redraw', #{rows: 6, cols: 40}) + call term_sendkeys(buf, 'g') + call WaitForAssert({-> assert_match(':redraw', term_getline(buf, 6))}) + call WaitForAssert({-> assert_notmatch('^:', term_getline(buf, 1))}) + + call StopVimInTerminal(buf) +endfunc + func TruncTabLine() return '%1T口口%2Ta' .. repeat('b', &columns - 4) .. '%999X%#TabLine#c' endfunc