diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-03-01 18:04:05 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-03-01 18:04:05 +0100 |
commit | abc39ab642791ae3d22a524516eeedb673a95d9d (patch) | |
tree | 6a6bed7722af11198e5912daca94de5c9be60170 /src | |
parent | 98e83b295628bc29bc67bcc1adb8ae75d01b8e07 (diff) | |
download | vim-abc39ab642791ae3d22a524516eeedb673a95d9d.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_docmd.c | 1 | ||||
-rw-r--r-- | src/screen.c | 7 | ||||
-rw-r--r-- | src/testdir/test_breakindent.vim | 5 | ||||
-rw-r--r-- | src/testdir/test_listlbr.vim | 16 | ||||
-rw-r--r-- | src/testdir/test_listlbr_utf8.vim | 34 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 60 insertions, 5 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 4c52cdf80..0bf940f31 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 8514f3e38..20a778a68 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 8721b35cd..7deffbe45 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 71366a161..7856ee82a 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 99db37ee6..56a4cc9b3 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 49e33012e..ee828fdc8 100644 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 394, +/**/ 393, /**/ 392, |