changeset 11010:c004e17fa36b v8.0.0394

patch 8.0.0394: tabs are not aligned when scrolling horizontally commit https://github.com/vim/vim/commit/abc39ab642791ae3d22a524516eeedb673a95d9d Author: Bram Moolenaar <Bram@vim.org> Date: Wed Mar 1 18:04:05 2017 +0100 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.
author Christian Brabandt <cb@256bit.org>
date Wed, 01 Mar 2017 18:15:04 +0100
parents 1a8893be0bea
children f96919bba9cc
files src/ex_docmd.c src/screen.c src/testdir/test_breakindent.vim src/testdir/test_listlbr.vim src/testdir/test_listlbr_utf8.vim src/version.c
diffstat 6 files changed, 62 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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
--- a/src/screen.c
+++ b/src/screen.c
@@ -3429,10 +3429,13 @@ win_line(
 #else
 	    --ptr;
 #endif
-#ifdef FEAT_MBYTE
-           /* character fits on the screen, don't need to skip it */
-           if ((*mb_ptr2cells)(ptr) >= c && col == 0)
-#endif
+	    /* If the character fits on the screen, don't need to skip it.
+	     * Except for a TAB. */
+	    if ((
+#ifdef FEAT_MBYTE
+			(*mb_ptr2cells)(ptr) >= c ||
+#endif
+		       *ptr == TAB) && col == 0)
 	       n_skip = v - vcol;
 	}
 
--- 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()
--- 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
--- 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
--- 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,