diff options
author | Bram Moolenaar <Bram@vim.org> | 2015-12-17 21:14:58 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2015-12-17 21:14:58 +0100 |
commit | 9bc01ebb957d2b30d57bd30d7aee6f1df2a336b0 (patch) | |
tree | 422fefc0a324804c737b11d02a308a14280f334e | |
parent | 8def26a0f5f5535e9af64e715cb80845fc8ec322 (diff) | |
download | vim-git-9bc01ebb957d2b30d57bd30d7aee6f1df2a336b0.tar.gz |
patch 7.4.977v7.4.977
Problem: 'linebreak' does not work properly when using "space" in
'listchars'.
Solution: (Hirohito Higashi, Christian Brabandt)
-rw-r--r-- | src/screen.c | 77 | ||||
-rw-r--r-- | src/testdir/test_listlbr.in | 22 | ||||
-rw-r--r-- | src/testdir/test_listlbr.ok | 8 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 73 insertions, 36 deletions
diff --git a/src/screen.c b/src/screen.c index 581638157..5610d8a96 100644 --- a/src/screen.c +++ b/src/screen.c @@ -3345,14 +3345,18 @@ win_line(wp, lnum, startrow, endrow, nochange) } #endif - /* find start of trailing whitespace */ - if (wp->w_p_list && lcs_trail) + if (wp->w_p_list) { - trailcol = (colnr_T)STRLEN(ptr); - while (trailcol > (colnr_T)0 && vim_iswhite(ptr[trailcol - 1])) - --trailcol; - trailcol += (colnr_T) (ptr - line); - extra_check = TRUE; + if (lcs_space || lcs_trail) + extra_check = TRUE; + /* find start of trailing whitespace */ + if (lcs_trail) + { + trailcol = (colnr_T)STRLEN(ptr); + while (trailcol > (colnr_T)0 && vim_iswhite(ptr[trailcol - 1])) + --trailcol; + trailcol += (colnr_T) (ptr - line); + } } /* @@ -4354,35 +4358,6 @@ win_line(wp, lnum, startrow, endrow, nochange) #endif ++ptr; - /* 'list': change char 160 to lcs_nbsp and space to lcs_space. */ - if (wp->w_p_list - && (((c == 160 -#ifdef FEAT_MBYTE - || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f)) -#endif - ) && lcs_nbsp) - || (c == ' ' && lcs_space && ptr - line <= trailcol))) - { - c = (c == ' ') ? lcs_space : lcs_nbsp; - if (area_attr == 0 && search_attr == 0) - { - n_attr = 1; - extra_attr = hl_attr(HLF_8); - saved_attr2 = char_attr; /* save current attr */ - } -#ifdef FEAT_MBYTE - mb_c = c; - if (enc_utf8 && (*mb_char2len)(c) > 1) - { - mb_utf8 = TRUE; - u8cc[0] = 0; - c = 0xc0; - } - else - mb_utf8 = FALSE; -#endif - } - if (extra_check) { #ifdef FEAT_SPELL @@ -4567,6 +4542,36 @@ win_line(wp, lnum, startrow, endrow, nochange) } #endif + /* 'list': change char 160 to lcs_nbsp and space to lcs_space. + */ + if (wp->w_p_list + && (((c == 160 +#ifdef FEAT_MBYTE + || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f)) +#endif + ) && lcs_nbsp) + || (c == ' ' && lcs_space && ptr - line <= trailcol))) + { + c = (c == ' ') ? lcs_space : lcs_nbsp; + if (area_attr == 0 && search_attr == 0) + { + n_attr = 1; + extra_attr = hl_attr(HLF_8); + saved_attr2 = char_attr; /* save current attr */ + } +#ifdef FEAT_MBYTE + mb_c = c; + if (enc_utf8 && (*mb_char2len)(c) > 1) + { + mb_utf8 = TRUE; + u8cc[0] = 0; + c = 0xc0; + } + else + mb_utf8 = FALSE; +#endif + } + if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ') { c = lcs_trail; diff --git a/src/testdir/test_listlbr.in b/src/testdir/test_listlbr.in index 52cbc100c..d51b2f9a5 100644 --- a/src/testdir/test_listlbr.in +++ b/src/testdir/test_listlbr.in @@ -23,20 +23,24 @@ STARTTEST : $put =g:line : wincmd p :endfu +:" :let g:test="Test 1: set linebreak" :redraw! :let line=ScreenChar(winwidth(0)) :call DoRecordScreen() +:" :let g:test="Test 2: set linebreak + set list" :set linebreak list listchars= :redraw! :let line=ScreenChar(winwidth(0)) :call DoRecordScreen() +:" :let g:test ="Test 3: set linebreak nolist" :set nolist linebreak :redraw! :let line=ScreenChar(winwidth(0)) :call DoRecordScreen() +:" :let g:test ="Test 4: set linebreak with tab and 1 line as long as screen: should break!" :set nolist linebreak ts=8 :let line="1\t".repeat('a', winwidth(0)-2) @@ -50,6 +54,7 @@ STARTTEST :$put =line :$ :norm! zt +:" :let g:test ="Test 5: set linebreak with conceal and set list and tab displayed by different char (line may not be truncated)" :set cpo&vim list linebreak conceallevel=2 concealcursor=nv listchars=tab:ab :syn match ConcealVar contained /_/ conceal @@ -57,6 +62,7 @@ STARTTEST :let line=ScreenChar(winwidth(0)) :call DoRecordScreen() :set cpo&vim linebreak +:" :let g:test ="Test 6: set linebreak with visual block mode" :let line="REMOVE: this not" :$put =g:test @@ -66,20 +72,24 @@ STARTTEST :1/^REMOVE: 0jf x:$put :set cpo&vim linebreak +:" :let g:test ="Test 7: set linebreak with visual block mode and v_b_A" :$put =g:test Golong line: 40afoobar aTARGET at end :exe "norm! $3B\<C-v>eAx\<Esc>" :set cpo&vim linebreak sbr= +:" :let g:test ="Test 8: set linebreak with visual char mode and changing block" :$put =g:test Go1111-1111-1111-11-1111-1111-11110f-lv3lc2222bgj. +:" :let g:test ="Test 9: using redo after block visual mode" :$put =g:test Go aaa aaa a2k2j~e. +:" :let g:test ="Test 10: using normal commands after block-visual" :$put =g:test :set linebreak @@ -87,10 +97,22 @@ Go abcd{ef ghijklm no}pqrs2k0f{c% +:" :let g:test ="Test 11: using block replace mode after wrapping" :$put =g:test :set linebreak wrap Go150aayypk147|jr0 +:" +:let g:test ="Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$" +:set list listchars=space:_,trail:-,tab:>-,eol:$ +:$put =g:test +:let line="a aaaaaaaaaaaaaaaaaaaaaa\ta " +:$put =line +:$ +:norm! zt +:redraw! +:let line=ScreenChar(winwidth(0)) +:call DoRecordScreen() :%w! test.out :qa! ENDTEST diff --git a/src/testdir/test_listlbr.ok b/src/testdir/test_listlbr.ok index ff30b46ee..b32a54969 100644 --- a/src/testdir/test_listlbr.ok +++ b/src/testdir/test_listlbr.ok @@ -52,3 +52,11 @@ abcdpqrs Test 11: using block replace mode after wrapping aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aaa +Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$ +a aaaaaaaaaaaaaaaaaaaaaa a + +Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$ +a_ +aaaaaaaaaaaaaaaaaaaa +aa>-----a-$ +~ diff --git a/src/version.c b/src/version.c index e034d450f..8289826b6 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 977, +/**/ 976, /**/ 975, |