vim-patch:8.0.1817: a timer may change v:count unexpectedly

Problem:    A timer may change v:count unexpectedly.
Solution:   Save and restore v:count and similar variables when a timer
            callback is invoked. (closes vim/vim#2897)
b0f42ba60d
This commit is contained in:
Jan Edmund Lazo 2020-01-03 20:08:13 -05:00
parent 234232ff4e
commit 4c4bcecc4a
No known key found for this signature in database
GPG Key ID: 64915E6E9F735B15

View File

@ -5,6 +5,7 @@ if !has('timers')
endif
source shared.vim
source screendump.vim
source load.vim
func MyHandler(timer)
@ -263,4 +264,35 @@ func Test_ex_mode()
call timer_stop(timer)
endfunc
func Test_restore_count()
if !CanRunVimInTerminal()
return
endif
" Check that v:count is saved and restored, not changed by a timer.
call writefile([
\ 'nnoremap <expr><silent> L v:count ? v:count . "l" : "l"',
\ 'func Doit(id)',
\ ' normal 3j',
\ 'endfunc',
\ 'call timer_start(100, "Doit")',
\ ], 'Xtrcscript')
call writefile([
\ '1-1234',
\ '2-1234',
\ '3-1234',
\ ], 'Xtrctext')
let buf = RunVimInTerminal('-S Xtrcscript Xtrctext', {})
" Wait for the timer to move the cursor to the third line.
call WaitForAssert({-> assert_equal(3, term_getcursor(buf)[0])})
call assert_equal(1, term_getcursor(buf)[1])
" Now check that v:count has not been set to 3
call term_sendkeys(buf, 'L')
call WaitForAssert({-> assert_equal(2, term_getcursor(buf)[1])})
call StopVimInTerminal(buf)
call delete('Xtrcscript')
call delete('Xtrctext')
endfunc
" vim: shiftwidth=2 sts=2 expandtab