# HG changeset patch # User Bram Moolenaar # Date 1664824503 -7200 # Node ID 604d7d7aa0430e0d82f901b99dcdbb94f437a002 # Parent f68f43043842aee2a9051e891d006d61631e8ee1 patch 9.0.0652: 'smoothscroll' not tested with 'number' and "n" in 'cpo' Commit: https://github.com/vim/vim/commit/b6aab8f44beb8c5d99393abdc2c9faab085c72aa Author: Bram Moolenaar Date: Mon Oct 3 20:01:16 2022 +0100 patch 9.0.0652: 'smoothscroll' not tested with 'number' and "n" in 'cpo' Problem: 'smoothscroll' not tested with 'number' and "n" in 'cpo'. Solution: Add tests, fix uncovered problem. diff --git a/src/drawline.c b/src/drawline.c --- a/src/drawline.c +++ b/src/drawline.c @@ -347,8 +347,9 @@ handle_lnum_col( int num_attr UNUSED) { if ((wp->w_p_nu || wp->w_p_rnu) - && (wlv->row == wlv->startrow + wlv->filler_lines - || vim_strchr(p_cpo, CPO_NUMCOL) == NULL)) + && ((wlv->row == wlv->startrow + wlv->filler_lines + && (wp->w_skipcol == 0 || wlv->row > wp->w_winrow)) + || vim_strchr(p_cpo, CPO_NUMCOL) == NULL)) { #ifdef FEAT_SIGNS // If 'signcolumn' is set to 'number' and a sign is present diff --git a/src/drawscreen.c b/src/drawscreen.c --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -1552,6 +1552,26 @@ win_update(win_T *wp) init_search_hl(wp, &screen_search_hl); #endif + // Make sure skipcol is valid, it depends on various options and the window + // width. + if (wp->w_skipcol > 0) + { + int w = 0; + int width1 = wp->w_width - win_col_off(wp); + int width2 = width1 + win_col_off2(wp); + int add = width1; + + while (w < wp->w_skipcol) + { + if (w > 0) + add = width2; + w += add; + } + if (w != wp->w_skipcol) + // always round down, the higher value may not be valid + wp->w_skipcol = w - add; + } + #ifdef FEAT_LINEBREAK // Force redraw when width of 'number' or 'relativenumber' column // changes. diff --git a/src/move.c b/src/move.c --- a/src/move.c +++ b/src/move.c @@ -50,7 +50,7 @@ adjust_plines_for_skipcol(win_T *wp, int { ++off; int skip = wp->w_skipcol - width; - width -= win_col_off2(wp); + width += win_col_off2(wp); while (skip >= width) { ++off; diff --git a/src/testdir/dumps/Test_smooth_number_1.dump b/src/testdir/dumps/Test_smooth_number_1.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smooth_number_1.dump @@ -0,0 +1,12 @@ +| +0#af5f00255#ffffff0@1|1| |o+0#0000000&|n|e| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o +|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o +|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @12 +| +0#af5f00255&@1|2| |t+0#0000000&|w|o| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o +|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @2 +| +0#af5f00255&@1|3| >l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|4| |l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|5| |l+0#0000000&|i|n|e| @31 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +| +0#0000000&@21|3|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_smooth_number_2.dump b/src/testdir/dumps/Test_smooth_number_2.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smooth_number_2.dump @@ -0,0 +1,12 @@ +|<+0#4040ff13#ffffff0@2|w+0#0000000&|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o +|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @12 +| +0#af5f00255&@1|2| |t+0#0000000&|w|o| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o +|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @2 +| +0#af5f00255&@1|3| >l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|4| |l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|5| |l+0#0000000&|i|n|e| @31 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +|~| @38 +| +0#0000000&@21|3|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_smooth_number_3.dump b/src/testdir/dumps/Test_smooth_number_3.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smooth_number_3.dump @@ -0,0 +1,12 @@ +|<+0#4040ff13#ffffff0@2|w+0#0000000&|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @12 +| +0#af5f00255&@1|2| |t+0#0000000&|w|o| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o +|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @2 +| +0#af5f00255&@1|3| >l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|4| |l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|5| |l+0#0000000&|i|n|e| @31 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +|~| @38 +|~| @38 +| +0#0000000&@21|3|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_smooth_number_4.dump b/src/testdir/dumps/Test_smooth_number_4.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smooth_number_4.dump @@ -0,0 +1,12 @@ +|<+0#4040ff13#ffffff0@2| +0#af5f00255&|d+0#0000000&| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @4 +| +0#af5f00255&@1|2| |t+0#0000000&|w|o| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o +| +0#af5f00255&@3|n+0#0000000&|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r +| +0#af5f00255&@3|d+0#0000000&| @34 +| +0#af5f00255&@1|3| >l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|4| |l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|5| |l+0#0000000&|i|n|e| @31 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +|~| @38 +|:+0#0000000&|s|e|t| |c|p|o|-|=|n| @10|3|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_smooth_number_5.dump b/src/testdir/dumps/Test_smooth_number_5.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smooth_number_5.dump @@ -0,0 +1,12 @@ +|<+0#4040ff13#ffffff0@2| +0#af5f00255&|r+0#0000000&|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r +| +0#af5f00255&@3|d+0#0000000&| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @4 +| +0#af5f00255&@1|2| |t+0#0000000&|w|o| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o +| +0#af5f00255&@3|n+0#0000000&|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r +| +0#af5f00255&@3|d+0#0000000&| @34 +| +0#af5f00255&@1|3| >l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|4| |l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|5| |l+0#0000000&|i|n|e| @31 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +|:+0#0000000&|s|e|t| |c|p|o|-|=|n| @10|3|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_smooth_number_6.dump b/src/testdir/dumps/Test_smooth_number_6.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smooth_number_6.dump @@ -0,0 +1,12 @@ +| +0#af5f00255#ffffff0@1|1| |o+0#0000000&|n|e| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o +| +0#af5f00255&@3|r+0#0000000&|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r +| +0#af5f00255&@3|d+0#0000000&| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @4 +| +0#af5f00255&@1|2| |t+0#0000000&|w|o| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o +| +0#af5f00255&@3|n+0#0000000&|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r +| +0#af5f00255&@3|d+0#0000000&| @34 +| +0#af5f00255&@1|3| >l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|4| |l+0#0000000&|i|n|e| @31 +| +0#af5f00255&@1|5| |l+0#0000000&|i|n|e| @31 +|~+0#4040ff13&| @38 +|~| @38 +|:+0#0000000&|s|e|t| |c|p|o|-|=|n| @10|3|,|1| @10|A|l@1| diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim --- a/src/testdir/test_scroll_opt.vim +++ b/src/testdir/test_scroll_opt.vim @@ -106,6 +106,41 @@ func Test_smoothscroll_CtrlE_CtrlY() call StopVimInTerminal(buf) endfunc +func Test_smoothscroll_number() + CheckScreendump + + let lines =<< trim END + vim9script + setline(1, [ + 'one ' .. 'word '->repeat(20), + 'two ' .. 'long word '->repeat(7), + 'line', + 'line', + 'line', + ]) + set smoothscroll + set number cpo+=n + :3 + END + call writefile(lines, 'XSmoothNumber', 'D') + let buf = RunVimInTerminal('-S XSmoothNumber', #{rows: 12, cols: 40}) + + call VerifyScreenDump(buf, 'Test_smooth_number_1', {}) + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_smooth_number_2', {}) + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_smooth_number_3', {}) + + call term_sendkeys(buf, ":set cpo-=n\") + call VerifyScreenDump(buf, 'Test_smooth_number_4', {}) + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_smooth_number_5', {}) + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_smooth_number_6', {}) + + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 652, +/**/ 651, /**/ 650,