From abc39ab642791ae3d22a524516eeedb673a95d9d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 1 Mar 2017 18:04:05 +0100 Subject: [PATCH] patch 8.0.0394: tabs are not aligned when scrolling horizontally Problem: Tabs are not aligned when scrolling horizontally and a Tab doesn't fit. (Axel Bender) Solution: Handle a Tab as a not fitting character. (Christian Brabandt) Also fix that ":redraw" does not scroll horizontally to show the cursor. And fix the test that depended on the old behavior. --- src/ex_docmd.c | 1 + src/screen.c | 7 +++++-- src/testdir/test_breakindent.vim | 5 ++--- src/testdir/test_listlbr.vim | 16 +++++++++++++++ src/testdir/test_listlbr_utf8.vim | 34 +++++++++++++++++++++++++++++++ src/version.c | 2 ++ 6 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 4c52cdf808961..0bf940f3198d5 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -9812,6 +9812,7 @@ ex_redraw(exarg_T *eap) RedrawingDisabled = 0; p_lz = FALSE; + validate_cursor(); update_topline(); update_screen(eap->forceit ? CLEAR : VIsual_active ? INVERTED : 0); #ifdef FEAT_TITLE diff --git a/src/screen.c b/src/screen.c index 8514f3e384646..20a778a68ac00 100644 --- a/src/screen.c +++ b/src/screen.c @@ -3429,10 +3429,13 @@ win_line( #else --ptr; #endif + /* If the character fits on the screen, don't need to skip it. + * Except for a TAB. */ + if (( #ifdef FEAT_MBYTE - /* character fits on the screen, don't need to skip it */ - if ((*mb_ptr2cells)(ptr) >= c && col == 0) + (*mb_ptr2cells)(ptr) >= c || #endif + *ptr == TAB) && col == 0) n_skip = v - vcol; } diff --git a/src/testdir/test_breakindent.vim b/src/testdir/test_breakindent.vim index 8721b35cdf67c..7deffbe452397 100644 --- a/src/testdir/test_breakindent.vim +++ b/src/testdir/test_breakindent.vim @@ -274,7 +274,6 @@ endfunction function Test_breakindent16() " Check that overlong lines are indented correctly. - " TODO: currently it does not fail even when the bug is not fixed. let s:input="" call s:test_windows('setl breakindent briopt=min:0 ts=4') call setline(1, "\t".repeat("1234567890", 10)) @@ -283,16 +282,16 @@ function Test_breakindent16() redraw! let lines=s:screen_lines(1,10) let expect=[ -\ " 123456", \ " 789012", \ " 345678", +\ " 901234", \ ] call s:compare_lines(expect, lines) let lines=s:screen_lines(4,10) let expect=[ -\ " 901234", \ " 567890", \ " 123456", +\ " 7890 ", \ ] call s:compare_lines(expect, lines) call s:close_windows() diff --git a/src/testdir/test_listlbr.vim b/src/testdir/test_listlbr.vim index 71366a161e2ca..7856ee82ab30e 100644 --- a/src/testdir/test_listlbr.vim +++ b/src/testdir/test_listlbr.vim @@ -217,3 +217,19 @@ func Test_list_with_listchars() call s:compare_lines(expect, lines) call s:close_windows() endfunc + +func Test_list_with_tab_and_skipping_first_chars() + call s:test_windows('setl list listchars=tab:>- ts=70 nowrap') + call setline(1, ["iiiiiiiiiiiiiiii\taaaaaaaaaaaaaaaaaa", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\taaaaaaaaaaaaaaaaaa", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\taaaaaaaaaaaaaaaaaa", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\taaaaaaaaaaaaaaaaaa"]) + call cursor(4,64) + norm! 2zl + let lines = s:screen_lines([1, 4], winwidth(0)) + let expect = [ +\ "---------------aaaaa", +\ "---------------aaaaa", +\ "---------------aaaaa", +\ "iiiiiiiii>-----aaaaa", +\ ] + call s:compare_lines(expect, lines) + call s:close_windows() +endfu diff --git a/src/testdir/test_listlbr_utf8.vim b/src/testdir/test_listlbr_utf8.vim index 99db37ee6c027..56a4cc9b311cb 100644 --- a/src/testdir/test_listlbr_utf8.vim +++ b/src/testdir/test_listlbr_utf8.vim @@ -220,3 +220,37 @@ func Test_multibyte_wrap_and_breakat() call s:compare_lines(expect, lines) call s:close_windows('setl brk&vim') endfunc + +func Test_chinese_char_on_wrap_column() + call s:test_windows("setl nolbr wrap sbr=") + syntax off + call setline(1, [ +\ 'aaaaaaaaaaaaaaaaaaa中'. +\ 'aaaaaaaaaaaaaaaaa中'. +\ 'aaaaaaaaaaaaaaaaa中'. +\ 'aaaaaaaaaaaaaaaaa中'. +\ 'aaaaaaaaaaaaaaaaa中'. +\ 'aaaaaaaaaaaaaaaaa中'. +\ 'aaaaaaaaaaaaaaaaa中'. +\ 'aaaaaaaaaaaaaaaaa中'. +\ 'aaaaaaaaaaaaaaaaa中'. +\ 'aaaaaaaaaaaaaaaaa中'. +\ 'hello']) + call cursor(1,1) + norm! $ + redraw! + let expect=[ +\ '中aaaaaaaaaaaaaaaaa>', +\ '中aaaaaaaaaaaaaaaaa>', +\ '中aaaaaaaaaaaaaaaaa>', +\ '中aaaaaaaaaaaaaaaaa>', +\ '中aaaaaaaaaaaaaaaaa>', +\ '中aaaaaaaaaaaaaaaaa>', +\ '中aaaaaaaaaaaaaaaaa>', +\ '中aaaaaaaaaaaaaaaaa>', +\ '中aaaaaaaaaaaaaaaaa>', +\ '中hello '] + let lines = s:screen_lines([1, 10], winwidth(0)) + call s:compare_lines(expect, lines) + call s:close_windows() +endfu diff --git a/src/version.c b/src/version.c index 49e33012e6871..ee828fdc82d5b 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 394, /**/ 393, /**/