]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1607: screenpos() returns wrong row with diff filler lines v9.0.1607
authorzeertzjq <zeertzjq@outlook.com>
Sun, 4 Jun 2023 18:29:22 +0000 (19:29 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 4 Jun 2023 18:29:22 +0000 (19:29 +0100)
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)

src/move.c
src/testdir/test_cursor_func.vim
src/version.c

index 54f5648c214d16fd24226024113a10ca21c1743f..e021d71c59f0a007cd4435f8297dedcf658967a8 100644 (file)
@@ -344,7 +344,8 @@ update_topline(void)
                check_topline = TRUE;
            else if (check_top_offset())
                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;
 
@@ -1459,7 +1460,8 @@ textpos2screenpos(
 
 #ifdef FEAT_DIFF
        // 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
 
        colnr_T off = win_col_off(wp);
@@ -1479,7 +1481,7 @@ textpos2screenpos(
            col += off;
            width = wp->w_width - off + win_col_off2(wp);
 
-           if (pos->lnum == wp->w_topline)
+           if (lnum == wp->w_topline)
                col -= wp->w_skipcol;
 
            // 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
                || curwin->w_skipcol != prev_skipcol)
            // need to redraw because wl_size of the topline may now be invalid
index c37826cbc1cf13385c8232a889c4e556ab08dbec..74d7581db61c66d0e58ad22a5192dfb21b3db0bd 100644 (file)
@@ -132,13 +132,14 @@ func Test_screenpos()
   1split
   normal G$
   redraw
+  " w_skipcol should be subtracted
   call assert_equal({'row': winrow + 0,
        \ 'col': wincol + 20 - 1,
        \ 'curscol': wincol + 20 - 1,
        \ 'endcol': wincol + 20 - 1},
        \ screenpos(win_getid(), line('.'), col('.')))
 
-  " w_skipcol should be subtracted
+  " w_leftcol should be subtracted
   setlocal nowrap
   normal 050zl$
   call assert_equal({'row': winrow + 0,
@@ -203,6 +204,19 @@ func Test_screenpos_diff()
   windo diffthis
   wincmd w
   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
   bwipe!
index b17b01b6d1d18fbe44f245da933e03e5dba1a960..13a537def8002aaf760fa45b659324bcad94dc63 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1607,
 /**/
     1606,
 /**/