diff options
author | Bram Moolenaar <Bram@vim.org> | 2023-06-05 20:44:55 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-06-05 20:44:55 +0100 |
commit | 15d4747ffd197ffa5b5a41a852a1fe93b6cc35fd (patch) | |
tree | 907dad16e2411396ae41839ef766af1b2b738016 | |
parent | 16d2c02c80e6d4822010816e085cabf91bf91423 (diff) |
patch 9.0.1612: "skipcol" not reset when using multi-byte charactersv9.0.1612
Problem: "skipcol" not reset when using multi-byte characters.
Solution: Compare with w_virtcol instead of w_cursor.col. (closes #12457)
-rw-r--r-- | src/move.c | 12 | ||||
-rw-r--r-- | src/testdir/dumps/Test_smoothscroll_multi_1.dump | 6 | ||||
-rw-r--r-- | src/testdir/test_scroll_opt.vim | 15 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 31 insertions, 4 deletions
diff --git a/src/move.c b/src/move.c index 4cd4d1c2bc..ea7d380056 100644 --- a/src/move.c +++ b/src/move.c @@ -2414,10 +2414,14 @@ scroll_cursor_top(int min_scroll, int always) } check_topfill(curwin, FALSE); #endif - // TODO: if the line doesn't fit may optimize w_skipcol - if (curwin->w_topline == curwin->w_cursor.lnum - && curwin->w_skipcol >= curwin->w_cursor.col) - reset_skipcol(); + if (curwin->w_topline == curwin->w_cursor.lnum) + { + validate_virtcol(); + if (curwin->w_skipcol >= curwin->w_virtcol) + // TODO: if the line doesn't fit may optimize w_skipcol instead + // of making it zero + reset_skipcol(); + } if (curwin->w_topline != old_topline || curwin->w_skipcol != old_skipcol #ifdef FEAT_DIFF diff --git a/src/testdir/dumps/Test_smoothscroll_multi_1.dump b/src/testdir/dumps/Test_smoothscroll_multi_1.dump new file mode 100644 index 0000000000..21c73bc5ed --- /dev/null +++ b/src/testdir/dumps/Test_smoothscroll_multi_1.dump @@ -0,0 +1,6 @@ +|ϛ+0&#ffffff0@34>ϛ@4 +@5| @34 +|2@35| @3 +|~+0#4040ff13&| @38 +|~| @38 +| +0#0000000&@21|1|,|7|1|-|3|6| @6|A|l@1| diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim index f8b4b4f09e..460416665d 100644 --- a/src/testdir/test_scroll_opt.vim +++ b/src/testdir/test_scroll_opt.vim @@ -124,6 +124,21 @@ func Test_smoothscroll_CtrlE_CtrlY() call StopVimInTerminal(buf) endfunc +func Test_smoothscroll_multibyte() + CheckScreendump + + let lines =<< trim END + set scrolloff=0 smoothscroll + call setline(1, [repeat('ϛ', 45), repeat('2', 36)]) + exe "normal G35l\<C-E>k" + END + call writefile(lines, 'XSmoothMultibyte', 'D') + let buf = RunVimInTerminal('-S XSmoothMultibyte', #{rows: 6, cols: 40}) + call VerifyScreenDump(buf, 'Test_smoothscroll_multi_1', {}) + + call StopVimInTerminal(buf) +endfunc + func Test_smoothscroll_number() CheckScreendump diff --git a/src/version.c b/src/version.c index 2e3c240f6e..a0c6893ee0 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1612, +/**/ 1611, /**/ 1610, |