summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-03-01 18:04:05 +0100
committerBram Moolenaar <Bram@vim.org>2017-03-01 18:04:05 +0100
commitabc39ab642791ae3d22a524516eeedb673a95d9d (patch)
tree6a6bed7722af11198e5912daca94de5c9be60170
parent98e83b295628bc29bc67bcc1adb8ae75d01b8e07 (diff)
downloadvim-git-abc39ab642791ae3d22a524516eeedb673a95d9d.tar.gz
patch 8.0.0394: tabs are not aligned when scrolling horizontallyv8.0.0394
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.
-rw-r--r--src/ex_docmd.c1
-rw-r--r--src/screen.c7
-rw-r--r--src/testdir/test_breakindent.vim5
-rw-r--r--src/testdir/test_listlbr.vim16
-rw-r--r--src/testdir/test_listlbr_utf8.vim34
-rw-r--r--src/version.c2
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,