diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-07-29 22:10:23 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-07-29 22:10:23 +0200 |
commit | 4641a122f2ffb820ec6d05526532ab38930c5286 (patch) | |
tree | 638c53ae9b77dae4daf7a25e36031739e3886263 /src | |
parent | eee9f65b2a213e9031f172d9d3b22adad6cb985d (diff) |
patch 8.1.1776: text added with a job isn't displayedv8.1.1776
Problem: Text added with a job to another buffer isn't displayed.
Solution: Update topline after adding a line. (closes #4745)
Diffstat (limited to 'src')
-rw-r--r-- | src/channel.c | 31 | ||||
-rw-r--r-- | src/testdir/check.vim | 16 | ||||
-rw-r--r-- | src/testdir/dumps/Test_job_buffer_scroll_1.dump | 10 | ||||
-rw-r--r-- | src/testdir/test_channel.vim | 67 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 90 insertions, 36 deletions
diff --git a/src/channel.c b/src/channel.c index 5d1b83aafa..6351c892c3 100644 --- a/src/channel.c +++ b/src/channel.c @@ -2537,19 +2537,26 @@ append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T part) 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); diff --git a/src/testdir/check.vim b/src/testdir/check.vim index 7f37f1c96e..48dbd85396 100644 --- a/src/testdir/check.vim +++ b/src/testdir/check.vim @@ -21,3 +21,19 @@ func CheckFunction(name) 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 diff --git a/src/testdir/dumps/Test_job_buffer_scroll_1.dump b/src/testdir/dumps/Test_job_buffer_scroll_1.dump new file mode 100644 index 0000000000..11abe60391 --- /dev/null +++ b/src/testdir/dumps/Test_job_buffer_scroll_1.dump @@ -0,0 +1,10 @@ +|s+0&#ffffff0|o|m|e|t|e|x|t| @66 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|X+1#0000000&|s|c|r|o|l@1|b|u|f@1|e|r| |[|+|]| @39|1|,|1| @11|A|l@1 +> +0&&@74 +|~+0#4040ff13&| @73 +|~| @73 +|[+3#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 +|-+0&&@1|N|o| |l|i|n|e|s| |i|n| |b|u|f@1|e|r|-@1| @52 diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim index 982a0459a1..62eaa2089c 100644 --- a/src/testdir/test_channel.vim +++ b/src/testdir/test_channel.vim @@ -1,10 +1,10 @@ " 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 == '' @@ -1125,6 +1125,35 @@ func Test_pipe_io_one_buffer() 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 @@ -1804,9 +1833,8 @@ func Test_read_from_terminated_job() 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 = '' @@ -1820,9 +1848,7 @@ func Test_job_start_windows() endfunc func Test_env() - if !has('job') - return - endif + CheckFeature job let g:envstr = '' if has('win32') @@ -1837,9 +1863,7 @@ func Test_env() endfunc func Test_cwd() - if !has('job') - return - endif + CheckFeature job let g:envstr = '' if has('win32') @@ -1901,9 +1925,7 @@ func s:test_list_args(cmd, out, remove_lf) 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) @@ -1956,9 +1978,8 @@ func Test_keep_pty_open() 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 @@ -2017,9 +2038,8 @@ func Test_raw_large_data() 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", @@ -2055,9 +2075,8 @@ func Test_job_exitval_and_termsig() endfunc func Test_job_tty_in_out() - if !has('job') || !has('unix') - return - endif + CheckFeature job + CheckUnix call writefile(['test'], 'Xtestin') let in_opts = [{}, diff --git a/src/version.c b/src/version.c index 1043275a78..5b025117a9 100644 --- a/src/version.c +++ b/src/version.c @@ -778,6 +778,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1776, +/**/ 1775, /**/ 1774, |