-*terminal.txt* For Vim version 9.1. Last change: 2025 Jan 11
+*terminal.txt* For Vim version 9.1. Last change: 2025 Feb 13
VIM REFERENCE MANUAL by Bram Moolenaar
Wait for pending updates of {buf} to be handled.
{buf} is used as with |term_getsize()|.
{time} is how long to wait for updates to arrive in msec. If
- not set then 10 msec will be used.
+ not set then 10 msec will be used. Queued messages will also
+ be processed similar to |:sleep|.
Can also be used as a |method|: >
GetBufnr()->term_wait()
-*various.txt* For Vim version 9.1. Last change: 2024 Dec 16
+*various.txt* For Vim version 9.1. Last change: 2025 Feb 13
VIM REFERENCE MANUAL by Bram Moolenaar
MS-Windows). "gs" stands for "goto sleep".
While sleeping the cursor is positioned in the text,
if at a visible position.
- Also process the received netbeans messages. {only
- available when compiled with the |+netbeans_intg|
- feature}
+ Queued messages and timers (|+timers|) are processed
+ during the sleep as well.
*:sl!* *:sleep!*
:[N]sl[eep]! [N][m] Same as above, but hide the cursor.
+++ /dev/null
-v\1ediv\1evi|gIv|÷³\16\16\16\e\16\16X\80ý\\80ý,\16\16X\80ýX\80ý\\80ý#\r\16X\80ý\\84ý<\80ý\\80ý,X\16\80ùX
" buffers.
%bwipe!
+ " Clear all children notifications in case there are stale ones left
+ let g:child_notification = 0
+
" The test may change the current directory. Save and restore the
" directory after executing the test.
let save_cwd = getcwd()
let filter = 'dumps/' . a:filename . '.vim'
let testfile = 'failed/' . a:filename . '.dump'
- let max_loops = get(a:options, 'wait', 1000) / 10
+ let max_loops = get(a:options, 'wait', 1000) / 1
" Starting a terminal to make a screendump is always considered flaky.
let g:test_is_flaky = 1
let g:giveup_same_error = 0
" wait for the pending updates to be handled.
- call TermWait(a:buf)
+ call TermWait(a:buf, 0)
" Redraw to execute the code that updates the screen. Otherwise we get the
" text and attributes only from the internal buffer.
let i = 0
while 1
- " leave some time for updating the original window
- sleep 50m
+ " leave a bit of time for updating the original window while we spin wait.
+ sleep 1m
call delete(testfile)
call term_dumpwrite(a:buf, testfile, a:options)
endif
endfunc
+" Callback function to be invoked by a child terminal job. The parent could
+" then wait for the notification using WaitForChildNotification()
+let g:child_notification = 0
+func Tapi_notify_parent(bufnum, arglist)
+ let g:child_notification = 1
+endfunc
+
+" Generates a command that we can pass to a terminal job that it uses to
+" notify us. Argument 'escape' will specify whether to escape the double
+" quote.
+func TermNotifyParentCmd(escape)
+ call assert_false(has("win32"), 'Windows does not support terminal API right now. Use another method to synchronize timing.')
+ let cmd = '\033]51;["call", "Tapi_notify_parent", []]\007'
+ if a:escape
+ return escape(cmd, '"')
+ endif
+ return cmd
+endfunc
+
+" Wait for a child process to notify us. This allows us to sequence events in
+" conjunction with the child. Currently the only supported notification method
+" is for a terminal job to call Tapi_notify_parent() using terminal API.
+func WaitForChildNotification(...)
+ let timeout = get(a:000, 0, 5000)
+ call WaitFor({-> g:child_notification == 1}, timeout)
+ let g:child_notification = 0
+endfunc
+
" Wait for up to five seconds for "expr" to become true. "expr" can be a
" stringified expression to evaluate, or a funcref without arguments.
" Using a lambda works best. Example:
" A second argument can be used to specify a different timeout in msec.
"
" Return zero for success, one for failure (like the assert function).
-func WaitForAssert(assert, ...)
+func g:WaitForAssert(assert, ...)
let timeout = get(a:000, 0, 5000)
if s:WaitForCommon(v:null, a:assert, timeout) < 0
return 1
call remove(v:errors, -1)
endif
- sleep 10m
+ sleep 1m
if exists('*reltimefloat')
let slept = float2nr(reltimefloat(reltime(start)) * 1000)
else
- let slept += 10
+ let slept += 1
endif
endwhile
call assert_equal("running", term_getstatus(a:buf))
" Wait for all the pending updates to terminal to complete
- call TermWait(a:buf)
+ call TermWait(a:buf, 1)
" CTRL-O : works both in Normal mode and Insert mode to start a command line.
" In Command-line it's inserted, the CTRL-U removes it again.
call term_sendkeys(a:buf, "\<C-O>:\<C-U>qa!\<cr>")
" Wait for all the pending updates to terminal to complete
- call TermWait(a:buf)
+ call TermWait(a:buf, 1)
" Wait for the terminal to end.
call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))})
call TermWait(buf, 50)
call term_sendkeys(buf, 'll')
call term_sendkeys(buf, ":call Trigger()\<CR>")
+ sleep 150m " Wait for balloon to show up (100ms balloondelay time)
call VerifyScreenDump(buf, 'Test_balloon_eval_term_01', {})
" Make sure the balloon still shows after 'updatetime' passed and CursorHold
CheckScreendump
+" Run the command in terminal and wait for it to complete via notification
+func s:RunCommandAndWait(buf, cmd)
+ call term_sendkeys(a:buf, a:cmd .. "; printf '" .. TermNotifyParentCmd(v:false) .. "'\<cr>")
+ call WaitForChildNotification()
+endfunc
+
func Test_crash1()
CheckNotBSD
CheckExecutable dash
- " Test 7 fails on Mac ...
- CheckNotMac
" The following used to crash Vim
let opts = #{cmd: 'sh'}
let file = 'crash/poc_huaf1'
let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 1: [OK]" > X_crash1_result.txt' .. "\<cr>")
- call TermWait(buf, 50)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 1: [OK]" > X_crash1_result.txt')
let file = 'crash/poc_huaf2'
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 2: [OK]" >> X_crash1_result.txt' .. "\<cr>")
- call TermWait(buf, 50)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 2: [OK]" >> X_crash1_result.txt')
let file = 'crash/poc_huaf3'
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 3: [OK]" >> X_crash1_result.txt' .. "\<cr>")
- call TermWait(buf, 100)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 3: [OK]" >> X_crash1_result.txt')
let file = 'crash/bt_quickfix_poc'
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 4: [OK]" >> X_crash1_result.txt' .. "\<cr>")
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 4: [OK]" >> X_crash1_result.txt')
" clean up
call delete('Xerr')
- " This test takes a bit longer
- call TermWait(buf, 1000)
let file = 'crash/poc_tagfunc.vim'
let args = printf(cmn_args, vim, file)
" using || because this poc causes vim to exit with exitstatus != 0
- call term_sendkeys(buf, args ..
- \ ' || echo "crash 5: [OK]" >> X_crash1_result.txt' .. "\<cr>")
+ call s:RunCommandAndWait(buf, args ..
+ \ ' || echo "crash 5: [OK]" >> X_crash1_result.txt')
- call TermWait(buf, 100)
let file = 'crash/bt_quickfix1_poc'
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 6: [OK]" >> X_crash1_result.txt' .. "\<cr>")
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 6: [OK]" >> X_crash1_result.txt')
" clean up
call delete('X')
- call TermWait(buf, 3000)
let file = 'crash/vim_regsub_both_poc'
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 7: [OK]" >> X_crash1_result.txt' .. "\<cr>")
- call TermWait(buf, 3000)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 7: [OK]" >> X_crash1_result.txt')
let file = 'crash/vim_msg_trunc_poc'
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' || echo "crash 8: [OK]" >> X_crash1_result.txt' .. "\<cr>")
- call TermWait(buf, 3000)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' || echo "crash 8: [OK]" >> X_crash1_result.txt')
let file = 'crash/crash_scrollbar'
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 9: [OK]" >> X_crash1_result.txt' .. "\<cr>")
- call TermWait(buf, 1000)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 9: [OK]" >> X_crash1_result.txt')
let file = 'crash/editing_arg_idx_POC_1'
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' || echo "crash 10: [OK]" >> X_crash1_result.txt' .. "\<cr>")
- call TermWait(buf, 1000)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' || echo "crash 10: [OK]" >> X_crash1_result.txt')
call delete('Xerr')
call delete('@')
func Test_crash1_2()
CheckNotBSD
CheckExecutable dash
- let g:test_is_flaky = 1
" The following used to crash Vim
let opts = #{cmd: 'sh'}
let file = 'crash/poc1'
let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 1: [OK]" > '.. result .. "\<cr>")
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 1: [OK]" > '.. result)
let file = 'crash/poc_win_enter_ext'
let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 2: [OK]" >> '.. result .. "\<cr>")
- call TermWait(buf, 350)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 2: [OK]" >> '.. result)
let file = 'crash/poc_suggest_trie_walk'
let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' && echo "crash 3: [OK]" >> '.. result .. "\<cr>")
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' && echo "crash 3: [OK]" >> '.. result)
let file = 'crash/poc_did_set_langmap'
let cmn_args = "%s -u NONE -i NONE -n -X -m -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' ; echo "crash 4: [OK]" >> '.. result .. "\<cr>")
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' ; echo "crash 4: [OK]" >> '.. result)
let file = 'crash/reverse_text_overflow'
let cmn_args = "%s -u NONE -i NONE -n -X -m -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args ..
- \ ' ; echo "crash 5: [OK]" >> '.. result .. "\<cr>")
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args ..
+ \ ' ; echo "crash 5: [OK]" >> '.. result)
" clean up
exe buf .. "bw!"
let buf = RunVimInTerminal('sh', #{cmd: 'sh'})
let file = 'crash/poc_ex_substitute'
- let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'\<cr>"
+ let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args)
let file = 'crash/poc_uaf_exec_instructions'
- let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'\<cr>"
+ let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args)
let file = 'crash/poc_uaf_check_argument_types'
- let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'\<cr>"
+ let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args)
let file = 'crash/double_free'
- let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'\<cr>"
+ let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 50)
+ call s:RunCommandAndWait(buf, args)
let file = 'crash/dialog_changed_uaf'
- let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'\<cr>"
+ let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args)
let file = 'crash/nullpointer'
- let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'\<cr>"
+ let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 50)
+ call s:RunCommandAndWait(buf, args)
let file = 'crash/heap_overflow3'
let cmn_args = "%s -u NONE -i NONE -n -X -m -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args)
let file = 'crash/heap_overflow_glob2regpat'
let cmn_args = "%s -u NONE -i NONE -n -X -m -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 50)
+ call s:RunCommandAndWait(buf, args)
let file = 'crash/nullptr_regexp_nfa'
let cmn_args = "%s -u NONE -i NONE -n -X -m -n -e -s -S %s -c ':qa!'"
let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 50)
-
- let file = 'crash/ex_redraw_crash'
- let cmn_args = "%s -u NONE -i NONE -n -m -X -Z -e -s -S %s -c ':qa!'"
- let args = printf(cmn_args, vim, file)
- call term_sendkeys(buf, args)
- call TermWait(buf, 150)
+ call s:RunCommandAndWait(buf, args)
" clean up
exe buf .. "bw!"
func Test_visual_ends_before_showbreak()
CheckScreendump
+ " Redraw at the end is necessary due to https://github.com/vim/vim/issues/16620
let lines =<< trim END
vim9script
&wrap = true
&showbreak = '↪ '
['xxxxx ' .. 'y'->repeat(&columns - 6) .. ' zzzz']->setline(1)
normal! wvel
+ redraw
END
call writefile(lines, 'XvisualEndsBeforeShowbreak', 'D')
let buf = RunVimInTerminal('-S XvisualEndsBeforeShowbreak', #{rows: 6})
call writefile(code, 'Xfoo', 'D')
let v:statusmsg = ''
- ta func1
+ silent ta func1
call assert_match('E435:', v:statusmsg)
call assert_equal(2, line('.'))
let v:statusmsg = ''
- ta func2
+ silent ta func2
call assert_match('E435:', v:statusmsg)
call assert_equal(4, line('.'))
let v:statusmsg = ''
- ta func3
+ silent ta func3
call assert_match('E435:', v:statusmsg)
call assert_equal(5, line('.'))
call assert_fails('ta func4', 'E434:')
let v:statusmsg = ''
let @/ = ''
- ta y
+ silent ta y
call assert_match('E435:', v:statusmsg)
call assert_equal(2, line('.'))
call assert_match('<y', @/)
close
if has("unix")
- terminal ++hidden ++open sleep 1
- sleep 1
+ terminal ++hidden ++open echo
+ call WaitForAssert({-> assert_equal('terminal', &buftype)})
call assert_fails("echo b:done", 'E121:')
endif
func Test_termwinscroll_topline2()
" calling the terminal API doesn't work on Windows
CheckNotMSWindows
- let g:test_is_flaky = 1
- let g:print_complete = 0
- func! Tapi_print_complete(bufnum, arglist)
- let g:print_complete = 1
- endfunc
set termwinscroll=50000 mouse=a
set shell=sh
let num1 = &termwinscroll / 1000 * 999
call writefile(range(num1), 'Xtext', 'D')
call term_sendkeys(buf, "cat Xtext\<CR>")
- call term_sendkeys(buf, 'printf ''\033]51;["call", "Tapi_print_complete", []]\007''' .. "\<cr>")
+ call term_sendkeys(buf, "printf '" .. TermNotifyParentCmd(v:false) .. "'\<cr>")
let rows = term_getsize(buf)[0]
let cnt = 0
- while !g:print_complete && cnt <= 1000
- " max number of runs
+ while !g:child_notification && cnt <= 50000
+ " Spin wait to process the terminal print as quickly as possible. This is
+ " more efficient than calling WaitForChildNotification() as we don't want
+ " to sleep here as the print is I/O-bound.
let cnt += 1
- " sleep a bit, to give the the terminal some time to finish
-
- " It may take a while to finish on a slow system
- " so wait a bit and handle the callback
- call term_wait(buf)
+ call term_wait(buf, 0)
endwhile
call WaitForAssert({-> assert_match(string(num1 - 1), term_getline(buf, rows - 1) .. '\|' .. term_getline(buf, rows - 2))})
call feedkeys("\<C-W>N", 'xt')
exe buf . 'bwipe!'
set termwinscroll& mouse& sh&
- delfunc Tapi_print_complete
- unlet! g:print_complete
endfunc
" Resizing the terminal window caused an ml_get error.
let lines = [
\ 'call setline(1, range(20))',
+ \ 'func NotifyParent()',
+ \ ' call echoraw("' .. TermNotifyParentCmd(v:true) .. '")',
+ \ 'endfunc',
\ 'func OpenTerm()',
\ ' set noruler',
- \ " call term_start('cat', #{vertical: 1, " .. a:highlight_opt .. "})",
+ \ " call term_start('cat', #{vertical: 1, "
+ \ .. 'exit_cb: {->NotifyParent()}, '
+ \ .. a:highlight_opt .. "})",
+ \ ' call NotifyParent()',
\ ] + a:open_cmds + [
\ 'endfunc',
- \ ] + a:highlight_cmds
+ \ ] + a:highlight_cmds + [
+ \ 'call NotifyParent()',
+ \ ]
call writefile(lines, 'XtermStart', 'D')
let buf = RunVimInTerminal('-S XtermStart', #{rows: 15})
- call TermWait(buf, 100)
+ call WaitForChildNotification()
call term_sendkeys(buf, ":call OpenTerm()\<CR>")
- call TermWait(buf, 50)
+ call WaitForChildNotification()
call term_sendkeys(buf, "hello\<CR>")
call VerifyScreenDump(buf, 'Test_terminal_color_' .. a:group_name, {})
call term_sendkeys(buf, "\<C-D>")
- call TermWait(buf, 50)
+ call WaitForChildNotification()
call StopVimInTerminal(buf)
endfunc
\ ]
call writefile(lines, 'XtermPopup', 'D')
let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15})
- call TermWait(buf, 200)
+ call TermWait(buf,0)
call term_sendkeys(buf, ":call OpenTerm(0)\<CR>")
- call TermWait(buf, 800)
+ call TermWait(buf,0)
call term_sendkeys(buf, ":\<CR>")
- call TermWait(buf, 500)
+ call TermWait(buf,0)
call term_sendkeys(buf, "\<C-W>:echo getwinvar(g:winid, \"&buftype\") win_gettype(g:winid)\<CR>")
call VerifyScreenDump(buf, 'Test_terminal_popup_1', {})
call VerifyScreenDump(buf, 'Test_terminal_popup_2', {})
call term_sendkeys(buf, ":call OpenTerm(1)\<CR>")
- call TermWait(buf, 800)
+ call TermWait(buf,0)
call term_sendkeys(buf, ":set hlsearch\<CR>")
- call TermWait(buf, 500)
+ call TermWait(buf,0)
call term_sendkeys(buf, "/edit\<CR>")
call VerifyScreenDump(buf, 'Test_terminal_popup_3', {})
call term_sendkeys(buf, "\<C-W>:call HidePopup()\<CR>")
call VerifyScreenDump(buf, 'Test_terminal_popup_4', {})
call term_sendkeys(buf, "\<CR>")
- call TermWait(buf, 50)
+ call TermWait(buf,0)
call term_sendkeys(buf, "\<C-W>:call ClosePopup()\<CR>")
call VerifyScreenDump(buf, 'Test_terminal_popup_5', {})
call term_sendkeys(buf, "A")
call VerifyScreenDump(buf, 'Test_terminal_popup_8', {})
- call TermWait(buf, 50)
+ call TermWait(buf,0)
call term_sendkeys(buf, ":q\<CR>")
- call TermWait(buf, 250) " wait for terminal to vanish
+ call WaitForAssert({-> assert_equal(0, match(term_getline(buf, 6), '^5\s*$'))}, 250) " wait for terminal to vanish
call StopVimInTerminal(buf)
endfunc
let lines = [
\ 'call setline(1, range(20))',
+ \ 'func NotifyParent(...)',
+ \ ' call echoraw("' .. TermNotifyParentCmd(v:true) .. '")',
+ \ 'endfunc',
\ 'func OpenTerm()',
- \ " let s:buf = term_start('cat', #{hidden: 1, "
+ \ " let s:buf = term_start('cat', #{hidden: 1, term_finish: 'close', "
\ .. a:highlight_opt .. "})",
- \ ' let g:winid = popup_create(s:buf, #{border: [], '
- \ .. a:popup_opt .. '})',
- \ ] + a:popup_cmds + [
+ \ ' let g:winid = popup_create(s:buf, #{border: [], '
+ \ .. 'callback: {->NotifyParent()}, '
+ \ .. a:popup_opt .. '})',
+ \ ] + a:popup_cmds + [
+ \ ' call NotifyParent()',
\ 'endfunc',
- \ ] + a:highlight_cmds
+ \ ] + a:highlight_cmds + [
+ \ 'call NotifyParent()',
+ \ ]
call writefile(lines, 'XtermPopup', 'D')
let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15})
- call TermWait(buf, 100)
+ call WaitForChildNotification()
call term_sendkeys(buf, ":set noruler\<CR>")
call term_sendkeys(buf, ":call OpenTerm()\<CR>")
- call TermWait(buf, 50)
+ call WaitForChildNotification()
call term_sendkeys(buf, "hello\<CR>")
call VerifyScreenDump(buf, 'Test_terminal_popup_' .. a:group_name, {})
call term_sendkeys(buf, "\<C-D>")
- call TermWait(buf, 50)
- call term_sendkeys(buf, ":q\<CR>")
- call TermWait(buf, 50) " wait for terminal to vanish
+ call WaitForChildNotification()
call StopVimInTerminal(buf)
endfunc
let slept = WaitFor('g:val == 3')
call assert_equal(3, g:val)
if has('reltime')
+ " Timer has an internal 1ms allowance in calculating due time, so it's
+ " possible for each timer to undershoot by 1ms resulting in only 49*3=147
+ " ms elapsed. Additionally we started the timer before we called
+ " WaitFor(), so the reported time could be a couple more ms below 147.
if has('mac')
- " Mac on Travis can be slow.
- call assert_inrange(149, 400, slept)
+ " Mac in CI can be slow.
+ call assert_inrange(145, 400, slept)
else
- call assert_inrange(149, 250, slept)
+ call assert_inrange(145, 250, slept)
endif
else
call assert_inrange(80, 200, slept)
# Another timer will fire in half a second and close it early after stopping
# all timers.
var pop = popup_create('Popup', {time: 10000})
- var tmr = timer_start(500, (_) => {
+ var tmr = timer_start(100, (_) => {
timer_stopall()
popup_clear()
})
- sleep 1
+ sleep 100m
+ g:WaitForAssert(() => assert_equal([], popup_list()), 1000)
assert_equal([], timer_info(tmr))
- assert_equal([], popup_list())
enddef
func Test_timer_paused()
func Test_visual_hl_with_showbreak()
CheckScreendump
+ " Redraw at the end is necessary due to https://github.com/vim/vim/issues/16620
let lines =<< trim END
setlocal showbreak=+
call setline(1, repeat('a', &columns + 10))
normal g$v4lo
+ redraw
END
call writefile(lines, 'XTest_visual_sbr', 'D')
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1110,
/**/
1109,
/**/