0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -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

@@ -1217,14 +1217,14 @@ A jump table for the options with a short description can be found at |Q_op|.
{not available when compiled without the |+linebreak|
feature}
Settings for 'breakindent'. It can consist of the following optional
items and must be seperated by a comma:
items and must be separated by a comma:
min:{n} Minimum text width that will be kept after
applying 'breakindent', even if the resulting
text should normally be narrower. This prevents
text indented almost to the right window border
occupying lot of vertical space when broken.
shift:{n} After applying 'breakindent', wrapped line
beginning will be shift by given number of
shift:{n} After applying 'breakindent', the wrapped line's
beginning will be shifted by the given number of
characters. It permits dynamic French paragraph
indentation (negative) or emphasizing the line
continuation (positive).
@@ -4613,7 +4613,7 @@ A jump table for the options with a short description can be found at |Q_op|.
it only affects the way the file is displayed, not its contents.
If 'breakindent' is set, line is visually indented. Then, the value
of 'showbreak' is used to put in front of wrapped lines. This option
is not used when the 'wrap' option is off or 'list' is on.
is not used when the 'wrap' option is off.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.

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,6 +4448,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
/* See "Tab alignment" below. */
FIX_FOR_BOGUSCOLS;
#endif
if (!wp->w_p_list)
c = ' ';
}
}
@@ -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;
#ifdef FEAT_LINEBREAK
if (wp->w_p_lbr)
c_extra = NUL; /* using p_extra from above */
else
#endif
c_extra = lcs_tab2;
n_attr = n_extra + 1;
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;
#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,
/**/