0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

updated for version 7.4.353

Problem:    'breakindent' doesn't work with the 'list' option.
Solution:   Make it work. (Christian Brabandt)
This commit is contained in:
Bram Moolenaar
2014-07-02 20:00:47 +02:00
parent ee739b42c0
commit 86b17e914f
12 changed files with 192 additions and 15 deletions

View File

@@ -1120,7 +1120,6 @@ win_lbr_chartabsize(wp, line, s, col, headp)
if (wp->w_p_lbr
&& vim_isbreak(c)
&& !vim_isbreak(s[1])
&& !wp->w_p_list
&& wp->w_p_wrap
# ifdef FEAT_VERTSPLIT
&& wp->w_width != 0

View File

@@ -2843,6 +2843,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
char_u extra[18]; /* "%ld" and 'fdc' must fit in here */
int n_extra = 0; /* number of extra chars */
char_u *p_extra = NULL; /* string of extra chars, plus NUL */
char_u *p_extra_free = NULL; /* p_extra needs to be freed */
int c_extra = NUL; /* extra chars, all the same */
int extra_attr = 0; /* attributes when n_extra != 0 */
static char_u *at_end_str = (char_u *)""; /* used for p_extra when
@@ -4053,6 +4054,11 @@ win_line(wp, lnum, startrow, endrow, nochange)
}
else
{
if (p_extra_free != NULL)
{
vim_free(p_extra_free);
p_extra_free = NULL;
}
/*
* Get a character from the line itself.
*/
@@ -4424,8 +4430,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
/*
* Found last space before word: check for line break.
*/
if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr)
&& !wp->w_p_list)
if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr))
{
char_u *p = ptr - (
# ifdef FEAT_MBYTE
@@ -4433,7 +4438,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
# endif
1);
/* TODO: is passing p for start of the line OK? */
n_extra = win_lbr_chartabsize(wp, p, p, (colnr_T)vcol,
n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol,
NULL) - 1;
c_extra = ' ';
if (vim_iswhite(c))
@@ -4443,7 +4448,8 @@ win_line(wp, lnum, startrow, endrow, nochange)
/* See "Tab alignment" below. */
FIX_FOR_BOGUSCOLS;
#endif
c = ' ';
if (!wp->w_p_list)
c = ' ';
}
}
#endif
@@ -4483,9 +4489,50 @@ win_line(wp, lnum, startrow, endrow, nochange)
*/
if (c == TAB && (!wp->w_p_list || lcs_tab1))
{
int tab_len = 0;
/* tab amount depends on current column */
n_extra = (int)wp->w_buffer->b_p_ts
tab_len = (int)wp->w_buffer->b_p_ts
- vcol % (int)wp->w_buffer->b_p_ts - 1;
#ifdef FEAT_LINEBREAK
if (!wp->w_p_lbr)
#endif
/* tab amount depends on current column */
n_extra = tab_len;
#ifdef FEAT_LINEBREAK
else
{
char_u *p;
int len = n_extra;
int i;
int saved_nextra = n_extra;
/* if n_extra > 0, it gives the number of chars, to
* use for a tab, else we need to calculate the width
* for a tab */
#ifdef FEAT_MBYTE
len = (tab_len * mb_char2len(lcs_tab2));
if (n_extra > 0)
len += n_extra - tab_len;
#endif
c = lcs_tab1;
p = alloc((unsigned)(len + 1));
vim_memset(p, ' ', len);
p[len] = NUL;
p_extra_free = p;
for (i = 0; i < tab_len; i++)
{
#ifdef FEAT_MBYTE
mb_char2bytes(lcs_tab2, p);
p += mb_char2len(lcs_tab2);
n_extra += mb_char2len(lcs_tab2)
- (saved_nextra > 0 ? 1 : 0);
#else
p[i] = lcs_tab2;
#endif
}
p_extra = p_extra_free;
}
#endif
#ifdef FEAT_CONCEAL
/* Tab alignment should be identical regardless of
* 'conceallevel' value. So tab compensates of all
@@ -4501,8 +4548,13 @@ win_line(wp, lnum, startrow, endrow, nochange)
if (wp->w_p_list)
{
c = lcs_tab1;
c_extra = lcs_tab2;
n_attr = n_extra + 1;
#ifdef FEAT_LINEBREAK
if (wp->w_p_lbr)
c_extra = NUL; /* using p_extra from above */
else
#endif
c_extra = lcs_tab2;
n_attr = tab_len + 1;
extra_attr = hl_attr(HLF_8);
saved_attr2 = char_attr; /* save current attr */
#ifdef FEAT_MBYTE
@@ -4598,9 +4650,25 @@ win_line(wp, lnum, startrow, endrow, nochange)
if ((dy_flags & DY_UHEX) && wp->w_p_rl)
rl_mirror(p_extra); /* reverse "<12>" */
#endif
n_extra = byte2cells(c) - 1;
c_extra = NUL;
c = *p_extra++;
#ifdef FEAT_LINEBREAK
if (wp->w_p_lbr)
{
char_u *p;
c = *p_extra;
p = alloc((unsigned)n_extra + 1);
vim_memset(p, ' ', n_extra);
STRNCPY(p, p_extra + 1, STRLEN(p_extra) - 1);
p[n_extra] = NUL;
p_extra_free = p_extra = p;
}
else
#endif
{
n_extra = byte2cells(c) - 1;
c = *p_extra++;
}
if (!attr_pri)
{
n_attr = n_extra + 1;

View File

@@ -38,6 +38,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
test104.out test105.out test106.out test107.out \
test_autoformat_join.out \
test_breakindent.out \
test_listlbr.out \
test_eval.out \
test_options.out
@@ -165,5 +166,6 @@ test106.out: test106.in
test107.out: test107.in
test_autoformat_join.out: test_autoformat_join.in
test_breakindent.out: test_breakindent.in
test_listlbr.out: test_listlbr.in
test_eval.out: test_eval.in
test_options.out: test_options.in

View File

@@ -37,6 +37,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
test105.out test106.out test107.out\
test_autoformat_join.out \
test_breakindent.out \
test_listlbr \
test_eval.out \
test_options.out

View File

@@ -57,6 +57,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
test105.out test106.out test107.out \
test_autoformat_join.out \
test_breakindent.out \
test_listlbr.out \
test_eval.out \
test_options.out

View File

@@ -40,6 +40,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
test_autoformat_join.out \
test_eval.out \
test_breakindent.out \
test_listlbr.out \
test_options.out
.SUFFIXES: .in .out

View File

@@ -98,6 +98,7 @@ SCRIPT = test1.out test2.out test3.out test4.out test5.out \
test105.out test106.out test107.out \
test_autoformat_join.out \
test_breakindent.out \
test_listlbr.out \
test_eval.out \
test_options.out

View File

@@ -35,6 +35,7 @@ SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
test104.out test105.out test106.out test107.out \
test_autoformat_join.out \
test_breakindent.out \
test_listlbr.out \
test_eval.out \
test_options.out

View File

@@ -0,0 +1,62 @@
Test for linebreak and list option
STARTTEST
:so small.vim
:if !exists("+linebreak") | e! test.ok | w! test.out | qa! | endif
:10new|:vsp|:vert resize 20
:put =\"\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP \"
:norm! zt
:set ts=4 sw=4 sts=4 linebreak sbr=+ wrap
:fu! ScreenChar(width)
: let c=''
: for j in range(1,4)
: for i in range(1,a:width)
: let c.=nr2char(screenchar(j, i))
: endfor
: let c.="\n"
: endfor
: return c
:endfu
:fu! DoRecordScreen()
: wincmd l
: $put =printf(\"\n%s\", g:test)
: $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 + set list + fancy listchars"
:exe "set linebreak list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6"
:redraw!
:let line=ScreenChar(winwidth(0))
:call DoRecordScreen()
:let g:test ="Test 4: set linebreak nolist"
:set nolist linebreak
:redraw!
:let line=ScreenChar(winwidth(0))
:call DoRecordScreen()
:let g:test ="Test 5: set nolinebreak list"
:set list nolinebreak
:redraw!
:let line=ScreenChar(winwidth(0))
:call DoRecordScreen()
:let g:test ="Test 6: 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)
:$put =line
:$
:norm! zt
:redraw!
:let line=ScreenChar(winwidth(0))
:call DoRecordScreen()
:%w! test.out
:qa!
ENDTEST
dummy text

View File

@@ -0,0 +1,39 @@
abcdef hijklmn pqrstuvwxyz 1060ABCDEFGHIJKLMNOP
Test 1: set linebreak
abcdef
+hijklmn
+pqrstuvwxyz 1060ABC
+DEFGHIJKLMNOP
Test 2: set linebreak + set list
^Iabcdef hijklmn^I
+pqrstuvwxyz 1060ABC
+DEFGHIJKLMNOP
Test 3: set linebreak + set list + fancy listchars
▕———abcdef
+hijklmn▕———
+pqrstuvwxyz␣1060ABC
+DEFGHIJKLMNOPˑ¶
Test 4: set linebreak nolist
abcdef
+hijklmn
+pqrstuvwxyz 1060ABC
+DEFGHIJKLMNOP
Test 5: set nolinebreak list
▕———abcdef hijklmn▕—
+pqrstuvwxyz␣1060ABC
+DEFGHIJKLMNOPˑ¶
1 aaaaaaaaaaaaaaaaaa
Test 6: set linebreak with tab and 1 line as long as screen: should break!
1
+aaaaaaaaaaaaaaaaaa
~
~

View File

@@ -734,6 +734,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
353,
/**/
352,
/**/