runnvim.vim (1813B)
1 let s:logger = {'d_events': []} 2 function s:logger.on_stdout(id, data, event) 3 call add(self.d_events, [a:event, a:data]) 4 endfunction 5 let s:logger.on_stderr = s:logger.on_stdout 6 function s:logger.on_exit(id, data, event) 7 call add(self.d_events, [a:event, ['']]) 8 endfunction 9 10 let s:logger.env = #{VIMRUNTIME: $VIMRUNTIME} 11 let s:logger.term = v:true 12 13 " Replace non-printable chars by special sequence, or "<%x>". 14 let s:escaped_char = {"\n": '\n', "\r": '\r', "\t": '\t'} 15 function! s:escape_non_printable(char) abort 16 let r = get(s:escaped_char, a:char) 17 return r is 0 ? printf('<%x>', char2nr(a:char)) : r 18 endfunction 19 20 function Main() 21 let argc = +$NVIM_TEST_ARGC 22 let args = [] 23 for i in range(argc) 24 call add(args, eval("$NVIM_TEST_ARG" . i)) 25 endfor 26 set lines=25 27 set columns=80 28 enew 29 let job = jobstart(args, s:logger) 30 let results = jobwait([job], 5 * 60 * 1000) 31 " TODO(ZyX-I): Get colors 32 let screen = getline(1, '$') 33 call jobstop(job) " kills the job always. 34 bwipeout! 35 let stringified_events = map(s:logger.d_events, 36 \'v:val[0] . ": " . ' . 37 \'join(map(v:val[1], '. 38 \ '''substitute(v:val, '. 39 \ '"\\v\\C(\\p@!.|\\<)", '. 40 \ '"\\=s:escape_non_printable(submatch(0))", '. 41 \ '"g")''), '. 42 \ '''\n'')') 43 call setline(1, [ 44 \ 'Job exited with code ' . results[0], 45 \ printf('Screen (%u lines)', len(screen)), 46 \ repeat('=', 80), 47 \] + screen + [ 48 \ repeat('=', 80), 49 \ printf('Events (%u lines):', len(stringified_events)), 50 \ repeat('=', 80), 51 \] + stringified_events + [ 52 \ repeat('=', 80), 53 \]) 54 write 55 if results[0] != 0 56 cquit 57 else 58 qall 59 endif 60 endfunction 61 62 call Main()