FOR_ALL_WINDOWS(wp)
{
- if (wp->w_buffer == buffer
- && (save_write_to
- ? wp->w_cursor.lnum == lnum + 1
- : (wp->w_cursor.lnum == lnum
- && wp->w_cursor.col == 0)))
+ if (wp->w_buffer == buffer)
{
- ++wp->w_cursor.lnum;
- save_curwin = curwin;
- curwin = wp;
- curbuf = curwin->w_buffer;
- scroll_cursor_bot(0, FALSE);
- curwin = save_curwin;
- curbuf = curwin->w_buffer;
+ int move_cursor = save_write_to
+ ? wp->w_cursor.lnum == lnum + 1
+ : (wp->w_cursor.lnum == lnum
+ && wp->w_cursor.col == 0);
+
+ // If the cursor is at or above the new line, move it one line
+ // down. If the topline is outdated update it now.
+ if (move_cursor || wp->w_topline > buffer->b_ml.ml_line_count)
+ {
+ if (move_cursor)
+ ++wp->w_cursor.lnum;
+ save_curwin = curwin;
+ curwin = wp;
+ curbuf = curwin->w_buffer;
+ scroll_cursor_bot(0, FALSE);
+ curwin = save_curwin;
+ curbuf = curwin->w_buffer;
+ }
}
}
redraw_buf_and_status_later(buffer, VALID);
throw 'Skipped: ' .. a:name .. ' function missing'
endif
endfunc
+
+" Command to check for running on MS-Windows
+command CheckMSWindows call CheckMSWindows()
+func CheckMSWindows()
+ if !has('win32')
+ throw 'Skipped: only works on MS-Windows'
+ endif
+endfunc
+
+" Command to check for running on Unix
+command CheckUnix call CheckUnix()
+func CheckUnix()
+ if !has('unix')
+ throw 'Skipped: only works on Unix'
+ endif
+endfunc
" Test for channel functions.
-if !has('channel')
- throw 'Skipped: channel feature missing'
-endif
+source check.vim
+CheckFeature channel
source shared.vim
+source screendump.vim
let s:python = PythonProg()
if s:python == ''
endtry
endfunc
+func Test_write_to_buffer_and_scroll()
+ CheckFeature job
+ if !CanRunVimInTerminal()
+ throw 'Skipped: cannot make screendumps'
+ endif
+ let lines =<< trim END
+ new Xscrollbuffer
+ call setline(1, range(1, 200))
+ $
+ redraw
+ wincmd w
+ call deletebufline('Xscrollbuffer', 1, '$')
+ if has('win32')
+ let cmd = ['cmd', '/c', 'echo sometext']
+ else
+ let cmd = [&shell, &shellcmdflag, 'echo sometext']
+ endif
+ call job_start(cmd, #{out_io: 'buffer', out_name: 'Xscrollbuffer'})
+ END
+ call writefile(lines, 'XtestBufferScroll')
+ let buf = RunVimInTerminal('-S XtestBufferScroll', #{rows: 10})
+ sleep 500m
+ call VerifyScreenDump(buf, 'Test_job_buffer_scroll_1', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete('XtestBufferScroll')
+endfunc
+
func Test_pipe_null()
if !has('job')
return
endfunc
func Test_job_start_windows()
- if !has('job') || !has('win32')
- return
- endif
+ CheckFeature job
+ CheckMSWindows
" Check that backslash in $COMSPEC is handled properly.
let g:echostr = ''
endfunc
func Test_env()
- if !has('job')
- return
- endif
+ CheckFeature job
let g:envstr = ''
if has('win32')
endfunc
func Test_cwd()
- if !has('job')
- return
- endif
+ CheckFeature job
let g:envstr = ''
if has('win32')
endfunc
func Test_list_args()
- if !has('job')
- return
- endif
+ CheckFeature job
call s:test_list_args('import sys;sys.stdout.write("hello world")', "hello world", 0)
call s:test_list_args('import sys;sys.stdout.write("hello\nworld")', "hello\nworld", 0)
endfunc
func Test_job_start_in_timer()
- if !has('job') || !has('timers')
- return
- endif
+ CheckFeature job
+ CheckFeature timers
func OutCb(chan, msg)
let g:val += 1
endfunc
func Test_no_hang_windows()
- if !has('job') || !has('win32')
- return
- endif
+ CheckFeature job
+ CheckMSWindows
try
let job = job_start(s:python . " test_channel_pipe.py busy",
endfunc
func Test_job_tty_in_out()
- if !has('job') || !has('unix')
- return
- endif
+ CheckFeature job
+ CheckUnix
call writefile(['test'], 'Xtestin')
let in_opts = [{},