aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/move.c9
-rw-r--r--test/functional/legacy/scroll_opt_spec.lua4
-rw-r--r--test/old/testdir/test_scroll_opt.vim66
3 files changed, 73 insertions, 6 deletions
diff --git a/src/nvim/move.c b/src/nvim/move.c
index cc8497f544..8113331c62 100644
--- a/src/nvim/move.c
+++ b/src/nvim/move.c
@@ -815,13 +815,14 @@ void curs_columns(win_T *wp, int may_scroll)
if (wp->w_cursor.lnum == wp->w_topline
&& wp->w_skipcol > 0
&& wp->w_wcol >= wp->w_skipcol) {
- // w_skipcol excludes win_col_off(). Include it here, since w_wcol
- // counts actual screen columns.
+ // Deduct by multiples of width2. This allows the long line wrapping
+ // formula below to correctly calculate the w_wcol value when wrapping.
if (wp->w_skipcol <= width1) {
- wp->w_wcol -= wp->w_width;
+ wp->w_wcol -= width2;
} else {
- wp->w_wcol -= wp->w_width * (((wp->w_skipcol - width1) / width2) + 1);
+ wp->w_wcol -= width2 * (((wp->w_skipcol - width1) / width2) + 1);
}
+
did_sub_skipcol = true;
}
diff --git a/test/functional/legacy/scroll_opt_spec.lua b/test/functional/legacy/scroll_opt_spec.lua
index 42d8f31d3c..8f0286771a 100644
--- a/test/functional/legacy/scroll_opt_spec.lua
+++ b/test/functional/legacy/scroll_opt_spec.lua
@@ -279,8 +279,8 @@ describe('smoothscroll', function()
]])
exec('call DoRel()')
screen:expect([[
- 2<<<ong text very long text very lon^g te|
- xt very long text very long text ver|
+ 2<<<ong text very long text very long te|
+ ^xt very long text very long text ver|
y long text very long text very long|
text very long text very long text |
1 three |
diff --git a/test/old/testdir/test_scroll_opt.vim b/test/old/testdir/test_scroll_opt.vim
index 423cba76bf..c3600ab4a7 100644
--- a/test/old/testdir/test_scroll_opt.vim
+++ b/test/old/testdir/test_scroll_opt.vim
@@ -325,5 +325,71 @@ func Test_smoothscroll_one_long_line()
call StopVimInTerminal(buf)
endfunc
+" Test that if the current cursor is on a smooth scrolled line, we correctly
+" reposition it. Also check that we don't miscalculate the values by checking
+" the consistency between wincol() and col('.') as they are calculated
+" separately in code.
+func Test_smoothscroll_cursor_position()
+ call NewWindow(10, 20)
+ setl smoothscroll wrap
+ call setline(1, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
+
+ func s:check_col_calc(win_col, win_line, buf_col)
+ call assert_equal(a:win_col, wincol())
+ call assert_equal(a:win_line, winline())
+ call assert_equal(a:buf_col, col('.'))
+ endfunc
+
+ call s:check_col_calc(1, 1, 1)
+ exe "normal \<C-E>"
+
+ " Move down another line to avoid blocking the <<< display
+ call s:check_col_calc(1, 2, 41)
+ exe "normal \<C-Y>"
+ call s:check_col_calc(1, 3, 41)
+ normal ggg$
+ exe "normal \<C-E>"
+
+ " Move down only 1 line when we are out of the range of the <<< display
+ call s:check_col_calc(20, 1, 40)
+ exe "normal \<C-Y>"
+ call s:check_col_calc(20, 2, 40)
+ normal gg
+
+ " Test number, where we have indented lines
+ setl number
+ call s:check_col_calc(5, 1, 1)
+ exe "normal \<C-E>"
+ call s:check_col_calc(5, 2, 33)
+ exe "normal \<C-Y>"
+ call s:check_col_calc(5, 3, 33)
+ normal ggg$
+ exe "normal \<C-E>"
+ call s:check_col_calc(20, 1, 32)
+ exe "normal \<C-Y>"
+ call s:check_col_calc(20, 2, 32)
+ normal gg
+
+ " Test number + showbreak, so test that the additional indentation works
+ setl number showbreak=+++
+ call s:check_col_calc(5, 1, 1)
+ exe "normal \<C-E>"
+ call s:check_col_calc(8, 2, 30)
+ exe "normal \<C-Y>"
+ call s:check_col_calc(8, 3, 30)
+ normal gg
+
+ " Test number + cpo+=n mode, where wrapped lines aren't indented
+ setl number cpo+=n showbreak=
+ call s:check_col_calc(5, 1, 1)
+ exe "normal \<C-E>"
+ call s:check_col_calc(1, 2, 37)
+ exe "normal \<C-Y>"
+ call s:check_col_calc(1, 3, 37)
+ normal gg
+
+ bwipeout!
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab