Patch 8.1.0786
Problem: ml_get error when updating the status line and a terminal had its
scrollback cleared. (Chris Patuzzo)
Solution: Check the cursor position when drawing the status line.
(closes #3830)
Files: src/buffer.c, src/testdir/test_terminal.vim
*** ../vim-8.1.0785/src/buffer.c 2019-01-20 15:30:36.881328770 +0100
--- src/buffer.c 2019-01-20 18:21:30.211582673 +0100
***************
*** 3869,3874 ****
--- 3869,3876 ----
struct stl_hlrec *hltab, /* return: HL attributes (can be NULL) */
struct stl_hlrec *tabtab) /* return: tab page nrs (can be NULL) */
{
+ linenr_T lnum;
+ size_t len;
char_u *p;
char_u *s;
char_u *t;
***************
*** 3943,3957 ****
fillchar = '-';
#endif
! /* Get line & check if empty (cursorpos will show "0-1"). Note that
! * p will become invalid when getting another buffer line. */
! p = ml_get_buf(wp->w_buffer, wp->w_cursor.lnum, FALSE);
empty_line = (*p == NUL);
! /* Get the byte value now, in case we need it below. This is more
! * efficient than making a copy of the line. */
! if (wp->w_cursor.col > (colnr_T)STRLEN(p))
byteval = 0;
else
#ifdef FEAT_MBYTE
byteval = (*mb_ptr2char)(p + wp->w_cursor.col);
--- 3945,3977 ----
fillchar = '-';
#endif
! // The cursor in windows other than the current one isn't always
! // up-to-date, esp. because of autocommands and timers.
! lnum = wp->w_cursor.lnum;
! if (lnum > wp->w_buffer->b_ml.ml_line_count)
! {
! lnum = wp->w_buffer->b_ml.ml_line_count;
! wp->w_cursor.lnum = lnum;
! }
!
! // Get line & check if empty (cursorpos will show "0-1"). Note that
! // p will become invalid when getting another buffer line.
! p = ml_get_buf(wp->w_buffer, lnum, FALSE);
empty_line = (*p == NUL);
! // Get the byte value now, in case we need it below. This is more
efficient
! // than making a copy of the line.
! len = STRLEN(p);
! if (wp->w_cursor.col > (colnr_T)len)
! {
! // Line may have changed since checking the cursor column, or the lnum
! // was adjusted above.
! wp->w_cursor.col = (colnr_T)len;
! #ifdef FEAT_VIRTUALEDIT
! wp->w_cursor.coladd = 0;
! #endif
byteval = 0;
+ }
else
#ifdef FEAT_MBYTE
byteval = (*mb_ptr2char)(p + wp->w_cursor.col);
*** ../vim-8.1.0785/src/testdir/test_terminal.vim 2019-01-19
18:20:41.918390095 +0100
--- src/testdir/test_terminal.vim 2019-01-20 18:21:24.023624845 +0100
***************
*** 1719,1721 ****
--- 1719,1746 ----
exe term . 'bwipe!'
endfunc
+
+ " When drawing the statusline the cursor position may not have been updated
+ " yet.
+ " 1. create a terminal, make it show 2 lines
+ " 2. 0.5 sec later: leave terminal window, execute "i"
+ " 3. 0.5 sec later: clear terminal window, now it's 1 line
+ " 4. 0.5 sec later: redraw, including statusline (used to trigger bug)
+ " 4. 0.5 sec later: should be done, clean up
+ func Test_terminal_statusline()
+ if !has('unix')
+ return
+ endif
+ set statusline=x
+ terminal
+ let tbuf = bufnr('')
+ call term_sendkeys(tbuf, "clear; echo a; echo b; sleep 1; clear\n")
+ call timer_start(500, { tid -> feedkeys("\<C-w>j", 'tx') })
+ call timer_start(1500, { tid -> feedkeys("\<C-l>", 'tx') })
+ au BufLeave * if &buftype == 'terminal' | silent! normal i | endif
+
+ sleep 2
+ exe tbuf . 'bwipe!'
+ au! BufLeave
+ set statusline=
+ endfunc
*** ../vim-8.1.0785/src/version.c 2019-01-20 15:30:36.897328669 +0100
--- src/version.c 2019-01-20 17:47:47.781180067 +0100
***************
*** 793,794 ****
--- 793,796 ----
{ /* Add new patch number below this line */
+ /**/
+ 786,
/**/
--
hundred-and-one symptoms of being an internet addict:
271. You collect hilarious signatures from all 250 mailing lists you
are subscribed to.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.