forked from aniani/vim
patch 9.0.1607: screenpos() returns wrong row with diff filler lines
Problem: screenpos() returns wrong row with diff filler lines.
Solution: Only add filler lines when appropriate. Also don't add the
'smoothscroll' marker when w_skipcol is zero. (closes #12485,
closes #12484)
This commit is contained in:
@@ -344,7 +344,8 @@ update_topline(void)
|
|||||||
check_topline = TRUE;
|
check_topline = TRUE;
|
||||||
else if (check_top_offset())
|
else if (check_top_offset())
|
||||||
check_topline = TRUE;
|
check_topline = TRUE;
|
||||||
else if (curwin->w_cursor.lnum == curwin->w_topline)
|
else if (curwin->w_skipcol > 0
|
||||||
|
&& curwin->w_cursor.lnum == curwin->w_topline)
|
||||||
{
|
{
|
||||||
colnr_T vcol;
|
colnr_T vcol;
|
||||||
|
|
||||||
@@ -1459,7 +1460,8 @@ textpos2screenpos(
|
|||||||
|
|
||||||
#ifdef FEAT_DIFF
|
#ifdef FEAT_DIFF
|
||||||
// Add filler lines above this buffer line.
|
// Add filler lines above this buffer line.
|
||||||
row += diff_check_fill(wp, lnum);
|
row += lnum == wp->w_topline ? wp->w_topfill
|
||||||
|
: diff_check_fill(wp, lnum);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
colnr_T off = win_col_off(wp);
|
colnr_T off = win_col_off(wp);
|
||||||
@@ -1479,7 +1481,7 @@ textpos2screenpos(
|
|||||||
col += off;
|
col += off;
|
||||||
width = wp->w_width - off + win_col_off2(wp);
|
width = wp->w_width - off + win_col_off2(wp);
|
||||||
|
|
||||||
if (pos->lnum == wp->w_topline)
|
if (lnum == wp->w_topline)
|
||||||
col -= wp->w_skipcol;
|
col -= wp->w_skipcol;
|
||||||
|
|
||||||
// long line wrapping, adjust row
|
// long line wrapping, adjust row
|
||||||
@@ -1848,6 +1850,7 @@ scrollup(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: is comparing w_topline with prev_topline still needed?
|
||||||
if (curwin->w_topline == prev_topline
|
if (curwin->w_topline == prev_topline
|
||||||
|| curwin->w_skipcol != prev_skipcol)
|
|| curwin->w_skipcol != prev_skipcol)
|
||||||
// need to redraw because wl_size of the topline may now be invalid
|
// need to redraw because wl_size of the topline may now be invalid
|
||||||
|
|||||||
@@ -132,13 +132,14 @@ func Test_screenpos()
|
|||||||
1split
|
1split
|
||||||
normal G$
|
normal G$
|
||||||
redraw
|
redraw
|
||||||
|
" w_skipcol should be subtracted
|
||||||
call assert_equal({'row': winrow + 0,
|
call assert_equal({'row': winrow + 0,
|
||||||
\ 'col': wincol + 20 - 1,
|
\ 'col': wincol + 20 - 1,
|
||||||
\ 'curscol': wincol + 20 - 1,
|
\ 'curscol': wincol + 20 - 1,
|
||||||
\ 'endcol': wincol + 20 - 1},
|
\ 'endcol': wincol + 20 - 1},
|
||||||
\ screenpos(win_getid(), line('.'), col('.')))
|
\ screenpos(win_getid(), line('.'), col('.')))
|
||||||
|
|
||||||
" w_skipcol should be subtracted
|
" w_leftcol should be subtracted
|
||||||
setlocal nowrap
|
setlocal nowrap
|
||||||
normal 050zl$
|
normal 050zl$
|
||||||
call assert_equal({'row': winrow + 0,
|
call assert_equal({'row': winrow + 0,
|
||||||
@@ -203,6 +204,19 @@ func Test_screenpos_diff()
|
|||||||
windo diffthis
|
windo diffthis
|
||||||
wincmd w
|
wincmd w
|
||||||
call assert_equal(#{col: 3, row: 7, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
|
call assert_equal(#{col: 3, row: 7, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
|
||||||
|
call assert_equal(#{col: 3, row: 8, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
|
||||||
|
exe "normal! 3\<C-E>"
|
||||||
|
call assert_equal(#{col: 3, row: 4, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
|
||||||
|
call assert_equal(#{col: 3, row: 5, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
|
||||||
|
exe "normal! \<C-E>"
|
||||||
|
call assert_equal(#{col: 3, row: 3, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
|
||||||
|
call assert_equal(#{col: 3, row: 4, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
|
||||||
|
exe "normal! \<C-E>"
|
||||||
|
call assert_equal(#{col: 3, row: 2, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
|
||||||
|
call assert_equal(#{col: 3, row: 3, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
|
||||||
|
exe "normal! \<C-E>"
|
||||||
|
call assert_equal(#{col: 3, row: 1, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
|
||||||
|
call assert_equal(#{col: 3, row: 2, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
|
||||||
|
|
||||||
windo diffoff
|
windo diffoff
|
||||||
bwipe!
|
bwipe!
|
||||||
|
|||||||
@@ -695,6 +695,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1607,
|
||||||
/**/
|
/**/
|
||||||
1606,
|
1606,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user