mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
patch 7.4.977
Problem: 'linebreak' does not work properly when using "space" in 'listchars'. Solution: (Hirohito Higashi, Christian Brabandt)
This commit is contained in:
77
src/screen.c
77
src/screen.c
@@ -3345,14 +3345,18 @@ win_line(wp, lnum, startrow, endrow, nochange)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* find start of trailing whitespace */
|
if (wp->w_p_list)
|
||||||
if (wp->w_p_list && lcs_trail)
|
|
||||||
{
|
{
|
||||||
trailcol = (colnr_T)STRLEN(ptr);
|
if (lcs_space || lcs_trail)
|
||||||
while (trailcol > (colnr_T)0 && vim_iswhite(ptr[trailcol - 1]))
|
extra_check = TRUE;
|
||||||
--trailcol;
|
/* find start of trailing whitespace */
|
||||||
trailcol += (colnr_T) (ptr - line);
|
if (lcs_trail)
|
||||||
extra_check = TRUE;
|
{
|
||||||
|
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
|
#endif
|
||||||
++ptr;
|
++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)
|
if (extra_check)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_SPELL
|
#ifdef FEAT_SPELL
|
||||||
@@ -4567,6 +4542,36 @@ win_line(wp, lnum, startrow, endrow, nochange)
|
|||||||
}
|
}
|
||||||
#endif
|
#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 == ' ')
|
if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ')
|
||||||
{
|
{
|
||||||
c = lcs_trail;
|
c = lcs_trail;
|
||||||
|
@@ -23,20 +23,24 @@ STARTTEST
|
|||||||
: $put =g:line
|
: $put =g:line
|
||||||
: wincmd p
|
: wincmd p
|
||||||
:endfu
|
:endfu
|
||||||
|
:"
|
||||||
:let g:test="Test 1: set linebreak"
|
:let g:test="Test 1: set linebreak"
|
||||||
:redraw!
|
:redraw!
|
||||||
:let line=ScreenChar(winwidth(0))
|
:let line=ScreenChar(winwidth(0))
|
||||||
:call DoRecordScreen()
|
:call DoRecordScreen()
|
||||||
|
:"
|
||||||
:let g:test="Test 2: set linebreak + set list"
|
:let g:test="Test 2: set linebreak + set list"
|
||||||
:set linebreak list listchars=
|
:set linebreak list listchars=
|
||||||
:redraw!
|
:redraw!
|
||||||
:let line=ScreenChar(winwidth(0))
|
:let line=ScreenChar(winwidth(0))
|
||||||
:call DoRecordScreen()
|
:call DoRecordScreen()
|
||||||
|
:"
|
||||||
:let g:test ="Test 3: set linebreak nolist"
|
:let g:test ="Test 3: set linebreak nolist"
|
||||||
:set nolist linebreak
|
:set nolist linebreak
|
||||||
:redraw!
|
:redraw!
|
||||||
:let line=ScreenChar(winwidth(0))
|
:let line=ScreenChar(winwidth(0))
|
||||||
:call DoRecordScreen()
|
:call DoRecordScreen()
|
||||||
|
:"
|
||||||
:let g:test ="Test 4: set linebreak with tab and 1 line as long as screen: should break!"
|
:let g:test ="Test 4: set linebreak with tab and 1 line as long as screen: should break!"
|
||||||
:set nolist linebreak ts=8
|
:set nolist linebreak ts=8
|
||||||
:let line="1\t".repeat('a', winwidth(0)-2)
|
:let line="1\t".repeat('a', winwidth(0)-2)
|
||||||
@@ -50,6 +54,7 @@ STARTTEST
|
|||||||
:$put =line
|
:$put =line
|
||||||
:$
|
:$
|
||||||
:norm! zt
|
: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)"
|
: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
|
:set cpo&vim list linebreak conceallevel=2 concealcursor=nv listchars=tab:ab
|
||||||
:syn match ConcealVar contained /_/ conceal
|
:syn match ConcealVar contained /_/ conceal
|
||||||
@@ -57,6 +62,7 @@ STARTTEST
|
|||||||
:let line=ScreenChar(winwidth(0))
|
:let line=ScreenChar(winwidth(0))
|
||||||
:call DoRecordScreen()
|
:call DoRecordScreen()
|
||||||
:set cpo&vim linebreak
|
:set cpo&vim linebreak
|
||||||
|
:"
|
||||||
:let g:test ="Test 6: set linebreak with visual block mode"
|
:let g:test ="Test 6: set linebreak with visual block mode"
|
||||||
:let line="REMOVE: this not"
|
:let line="REMOVE: this not"
|
||||||
:$put =g:test
|
:$put =g:test
|
||||||
@@ -66,20 +72,24 @@ STARTTEST
|
|||||||
:1/^REMOVE:
|
:1/^REMOVE:
|
||||||
0jf x:$put
|
0jf x:$put
|
||||||
:set cpo&vim linebreak
|
:set cpo&vim linebreak
|
||||||
|
:"
|
||||||
:let g:test ="Test 7: set linebreak with visual block mode and v_b_A"
|
:let g:test ="Test 7: set linebreak with visual block mode and v_b_A"
|
||||||
:$put =g:test
|
:$put =g:test
|
||||||
Golong line: 40afoobar aTARGET at end
|
Golong line: 40afoobar aTARGET at end
|
||||||
:exe "norm! $3B\<C-v>eAx\<Esc>"
|
:exe "norm! $3B\<C-v>eAx\<Esc>"
|
||||||
:set cpo&vim linebreak sbr=
|
:set cpo&vim linebreak sbr=
|
||||||
|
:"
|
||||||
:let g:test ="Test 8: set linebreak with visual char mode and changing block"
|
:let g:test ="Test 8: set linebreak with visual char mode and changing block"
|
||||||
:$put =g:test
|
:$put =g:test
|
||||||
Go1111-1111-1111-11-1111-1111-11110f-lv3lc2222bgj.
|
Go1111-1111-1111-11-1111-1111-11110f-lv3lc2222bgj.
|
||||||
|
:"
|
||||||
:let g:test ="Test 9: using redo after block visual mode"
|
:let g:test ="Test 9: using redo after block visual mode"
|
||||||
:$put =g:test
|
:$put =g:test
|
||||||
Go
|
Go
|
||||||
aaa
|
aaa
|
||||||
aaa
|
aaa
|
||||||
a2k2j~e.
|
a2k2j~e.
|
||||||
|
:"
|
||||||
:let g:test ="Test 10: using normal commands after block-visual"
|
:let g:test ="Test 10: using normal commands after block-visual"
|
||||||
:$put =g:test
|
:$put =g:test
|
||||||
:set linebreak
|
:set linebreak
|
||||||
@@ -87,10 +97,22 @@ Go
|
|||||||
abcd{ef
|
abcd{ef
|
||||||
ghijklm
|
ghijklm
|
||||||
no}pqrs2k0f{c%
|
no}pqrs2k0f{c%
|
||||||
|
:"
|
||||||
:let g:test ="Test 11: using block replace mode after wrapping"
|
:let g:test ="Test 11: using block replace mode after wrapping"
|
||||||
:$put =g:test
|
:$put =g:test
|
||||||
:set linebreak wrap
|
:set linebreak wrap
|
||||||
Go150aayypk147|jr0
|
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
|
:%w! test.out
|
||||||
:qa!
|
:qa!
|
||||||
ENDTEST
|
ENDTEST
|
||||||
|
@@ -52,3 +52,11 @@ abcdpqrs
|
|||||||
Test 11: using block replace mode after wrapping
|
Test 11: using block replace mode after wrapping
|
||||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aaa
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aaa
|
||||||
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-$
|
||||||
|
~
|
||||||
|
@@ -741,6 +741,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
977,
|
||||||
/**/
|
/**/
|
||||||
976,
|
976,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user