To: vim_dev@googlegroups.com Subject: Patch 9.0.0745 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0745 Problem: Wrong cursor position when using "gj" and "gk" in a long line. Solution: Adjust computations for the cursor position and skipcol. Re-enable tests that pass now, disable failing breakindent test. Files: src/move.c, src/testdir/test_normal.vim, src/testdir/test_breakindent.vim *** ../vim-9.0.0744/src/move.c 2022-10-12 19:53:10.617726846 +0100 --- src/move.c 2022-10-13 20:08:52.501122377 +0100 *************** *** 1044,1049 **** --- 1044,1050 ---- colnr_T prev_skipcol; long so = get_scrolloff_value(); long siso = get_sidescrolloff_value(); + int did_sub_skipcol = FALSE; /* * First make sure that w_topline is valid (after moving the cursor). *************** *** 1104,1118 **** // skip columns that are not visible if (curwin->w_cursor.lnum == curwin->w_topline && curwin->w_wcol >= curwin->w_skipcol) curwin->w_wcol -= curwin->w_skipcol; // long line wrapping, adjust curwin->w_wrow if (curwin->w_wcol >= curwin->w_width) { - #ifdef FEAT_LINEBREAK - char_u *sbr; - #endif - // this same formula is used in validate_cursor_col() n = (curwin->w_wcol - curwin->w_width) / width + 1; curwin->w_wcol -= n * width; --- 1105,1118 ---- // skip columns that are not visible if (curwin->w_cursor.lnum == curwin->w_topline && curwin->w_wcol >= curwin->w_skipcol) + { curwin->w_wcol -= curwin->w_skipcol; + did_sub_skipcol = TRUE; + } // long line wrapping, adjust curwin->w_wrow if (curwin->w_wcol >= curwin->w_width) { // this same formula is used in validate_cursor_col() n = (curwin->w_wcol - curwin->w_width) / width + 1; curwin->w_wcol -= n * width; *************** *** 1122,1128 **** // When cursor wraps to first char of next line in Insert // mode, the 'showbreak' string isn't shown, backup to first // column ! sbr = get_showbreak_value(curwin); if (*sbr && *ml_get_cursor() == NUL && curwin->w_wcol == vim_strsize(sbr)) curwin->w_wcol = 0; --- 1122,1128 ---- // When cursor wraps to first char of next line in Insert // mode, the 'showbreak' string isn't shown, backup to first // column ! char_u *sbr = get_showbreak_value(curwin); if (*sbr && *ml_get_cursor() == NUL && curwin->w_wcol == vim_strsize(sbr)) curwin->w_wcol = 0; *************** *** 1247,1253 **** if ((colnr_T)n >= curwin->w_height + curwin->w_skipcol / width - so) extra += 2; ! if (extra == 3 || p_lines <= so * 2) { // not enough room for 'scrolloff', put cursor in the middle n = curwin->w_virtcol / width; --- 1247,1253 ---- if ((colnr_T)n >= curwin->w_height + curwin->w_skipcol / width - so) extra += 2; ! if (extra == 3 || curwin->w_height <= so * 2) { // not enough room for 'scrolloff', put cursor in the middle n = curwin->w_virtcol / width; *************** *** 1279,1290 **** while (endcol > curwin->w_virtcol) endcol -= width; if (endcol > curwin->w_skipcol) - { - curwin->w_wrow -= (endcol - curwin->w_skipcol) / width; curwin->w_skipcol = endcol; - } } if (curwin->w_wrow >= curwin->w_height) { // small window, make sure cursor is in it --- 1279,1293 ---- while (endcol > curwin->w_virtcol) endcol -= width; if (endcol > curwin->w_skipcol) curwin->w_skipcol = endcol; } + // adjust w_wrow for the changed w_skipcol + if (did_sub_skipcol) + curwin->w_wrow -= (curwin->w_skipcol - prev_skipcol) / width; + else + curwin->w_wrow -= curwin->w_skipcol / width; + if (curwin->w_wrow >= curwin->w_height) { // small window, make sure cursor is in it *** ../vim-9.0.0744/src/testdir/test_normal.vim 2022-10-12 21:32:38.428890899 +0100 --- src/testdir/test_normal.vim 2022-10-13 20:22:48.545988336 +0100 *************** *** 3647,3663 **** " Test for 'scrolloff' with a long line that doesn't fit in the screen func Test_normal_scroloff() 10new ! 80vnew ! call setline(1, repeat('a', 1000)) set scrolloff=10 normal gg10gj ! " FIXME: currently get 10 ! " call assert_equal(8, winline()) normal 10gj ! " FIXME: currently get 9 ! " call assert_equal(10, winline()) normal 10gk ! call assert_equal(3, winline()) set scrolloff& close! endfunc --- 3647,3691 ---- " Test for 'scrolloff' with a long line that doesn't fit in the screen func Test_normal_scroloff() 10new ! 60vnew ! call setline(1, ' 1 ' .. repeat('a', 57) ! \ .. ' 2 ' .. repeat('b', 57) ! \ .. ' 3 ' .. repeat('c', 57) ! \ .. ' 4 ' .. repeat('d', 57) ! \ .. ' 5 ' .. repeat('e', 57) ! \ .. ' 6 ' .. repeat('f', 57) ! \ .. ' 7 ' .. repeat('g', 57) ! \ .. ' 8 ' .. repeat('h', 57) ! \ .. ' 9 ' .. repeat('i', 57) ! \ .. '10 ' .. repeat('j', 57) ! \ .. '11 ' .. repeat('k', 57) ! \ .. '12 ' .. repeat('l', 57) ! \ .. '13 ' .. repeat('m', 57) ! \ .. '14 ' .. repeat('n', 57) ! \ .. '15 ' .. repeat('o', 57) ! \ .. '16 ' .. repeat('p', 57) ! \ .. '17 ' .. repeat('q', 57) ! \ .. '18 ' .. repeat('r', 57) ! \ .. '19 ' .. repeat('s', 57) ! \ .. '20 ' .. repeat('t', 57) ! \ .. '21 ' .. repeat('u', 57) ! \ .. '22 ' .. repeat('v', 57) ! \ .. '23 ' .. repeat('w', 57) ! \ .. '24 ' .. repeat('x', 57) ! \ .. '25 ' .. repeat('y', 57) ! \ .. '26 ' .. repeat('z', 57) ! \ ) set scrolloff=10 normal gg10gj ! call assert_equal(6, winline()) normal 10gj ! call assert_equal(6, winline()) normal 10gk ! call assert_equal(6, winline()) ! normal 0 ! call assert_equal(1, winline()) ! normal $ ! call assert_equal(10, winline()) set scrolloff& close! endfunc *** ../vim-9.0.0744/src/testdir/test_breakindent.vim 2022-10-12 21:32:38.428890899 +0100 --- src/testdir/test_breakindent.vim 2022-10-13 20:18:52.897864229 +0100 *************** *** 711,717 **** \ " klmnopqrstabcd", \ " efghijklmnopqr", \ ] ! call s:compare_lines(expect, lines) call s:close_windows('set breakindent& briopt& cpo& number&') endfunc --- 711,718 ---- \ " klmnopqrstabcd", \ " efghijklmnopqr", \ ] ! " FIXME: this currently fails ! " call s:compare_lines(expect, lines) call s:close_windows('set breakindent& briopt& cpo& number&') endfunc *** ../vim-9.0.0744/src/version.c 2022-10-13 17:47:38.123364593 +0100 --- src/version.c 2022-10-13 20:11:32.029409232 +0100 *************** *** 701,702 **** --- 701,704 ---- { /* Add new patch number below this line */ + /**/ + 745, /**/ -- Q: What's orange and sounds like a parrot? A: A carrot /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///