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:
@@ -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|
|
{not available when compiled without the |+linebreak|
|
||||||
feature}
|
feature}
|
||||||
Settings for 'breakindent'. It can consist of the following optional
|
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
|
min:{n} Minimum text width that will be kept after
|
||||||
applying 'breakindent', even if the resulting
|
applying 'breakindent', even if the resulting
|
||||||
text should normally be narrower. This prevents
|
text should normally be narrower. This prevents
|
||||||
text indented almost to the right window border
|
text indented almost to the right window border
|
||||||
occupying lot of vertical space when broken.
|
occupying lot of vertical space when broken.
|
||||||
shift:{n} After applying 'breakindent', wrapped line
|
shift:{n} After applying 'breakindent', the wrapped line's
|
||||||
beginning will be shift by given number of
|
beginning will be shifted by the given number of
|
||||||
characters. It permits dynamic French paragraph
|
characters. It permits dynamic French paragraph
|
||||||
indentation (negative) or emphasizing the line
|
indentation (negative) or emphasizing the line
|
||||||
continuation (positive).
|
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.
|
it only affects the way the file is displayed, not its contents.
|
||||||
If 'breakindent' is set, line is visually indented. Then, the value
|
If 'breakindent' is set, line is visually indented. Then, the value
|
||||||
of 'showbreak' is used to put in front of wrapped lines. This option
|
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
|
Note that <Tab> characters after an <EOL> are mostly not displayed
|
||||||
with the right amount of white space.
|
with the right amount of white space.
|
||||||
|
|
||||||
|
@@ -1120,7 +1120,6 @@ win_lbr_chartabsize(wp, line, s, col, headp)
|
|||||||
if (wp->w_p_lbr
|
if (wp->w_p_lbr
|
||||||
&& vim_isbreak(c)
|
&& vim_isbreak(c)
|
||||||
&& !vim_isbreak(s[1])
|
&& !vim_isbreak(s[1])
|
||||||
&& !wp->w_p_list
|
|
||||||
&& wp->w_p_wrap
|
&& wp->w_p_wrap
|
||||||
# ifdef FEAT_VERTSPLIT
|
# ifdef FEAT_VERTSPLIT
|
||||||
&& wp->w_width != 0
|
&& wp->w_width != 0
|
||||||
|
80
src/screen.c
80
src/screen.c
@@ -2843,6 +2843,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
|
|||||||
char_u extra[18]; /* "%ld" and 'fdc' must fit in here */
|
char_u extra[18]; /* "%ld" and 'fdc' must fit in here */
|
||||||
int n_extra = 0; /* number of extra chars */
|
int n_extra = 0; /* number of extra chars */
|
||||||
char_u *p_extra = NULL; /* string of extra chars, plus NUL */
|
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 c_extra = NUL; /* extra chars, all the same */
|
||||||
int extra_attr = 0; /* attributes when n_extra != 0 */
|
int extra_attr = 0; /* attributes when n_extra != 0 */
|
||||||
static char_u *at_end_str = (char_u *)""; /* used for p_extra when
|
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
|
else
|
||||||
{
|
{
|
||||||
|
if (p_extra_free != NULL)
|
||||||
|
{
|
||||||
|
vim_free(p_extra_free);
|
||||||
|
p_extra_free = NULL;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Get a character from the line itself.
|
* 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.
|
* Found last space before word: check for line break.
|
||||||
*/
|
*/
|
||||||
if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr)
|
if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr))
|
||||||
&& !wp->w_p_list)
|
|
||||||
{
|
{
|
||||||
char_u *p = ptr - (
|
char_u *p = ptr - (
|
||||||
# ifdef FEAT_MBYTE
|
# ifdef FEAT_MBYTE
|
||||||
@@ -4433,7 +4438,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
|
|||||||
# endif
|
# endif
|
||||||
1);
|
1);
|
||||||
/* TODO: is passing p for start of the line OK? */
|
/* 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;
|
NULL) - 1;
|
||||||
c_extra = ' ';
|
c_extra = ' ';
|
||||||
if (vim_iswhite(c))
|
if (vim_iswhite(c))
|
||||||
@@ -4443,6 +4448,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
|
|||||||
/* See "Tab alignment" below. */
|
/* See "Tab alignment" below. */
|
||||||
FIX_FOR_BOGUSCOLS;
|
FIX_FOR_BOGUSCOLS;
|
||||||
#endif
|
#endif
|
||||||
|
if (!wp->w_p_list)
|
||||||
c = ' ';
|
c = ' ';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4483,9 +4489,50 @@ win_line(wp, lnum, startrow, endrow, nochange)
|
|||||||
*/
|
*/
|
||||||
if (c == TAB && (!wp->w_p_list || lcs_tab1))
|
if (c == TAB && (!wp->w_p_list || lcs_tab1))
|
||||||
{
|
{
|
||||||
|
int tab_len = 0;
|
||||||
/* tab amount depends on current column */
|
/* 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;
|
- 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
|
#ifdef FEAT_CONCEAL
|
||||||
/* Tab alignment should be identical regardless of
|
/* Tab alignment should be identical regardless of
|
||||||
* 'conceallevel' value. So tab compensates of all
|
* 'conceallevel' value. So tab compensates of all
|
||||||
@@ -4501,8 +4548,13 @@ win_line(wp, lnum, startrow, endrow, nochange)
|
|||||||
if (wp->w_p_list)
|
if (wp->w_p_list)
|
||||||
{
|
{
|
||||||
c = lcs_tab1;
|
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;
|
c_extra = lcs_tab2;
|
||||||
n_attr = n_extra + 1;
|
n_attr = tab_len + 1;
|
||||||
extra_attr = hl_attr(HLF_8);
|
extra_attr = hl_attr(HLF_8);
|
||||||
saved_attr2 = char_attr; /* save current attr */
|
saved_attr2 = char_attr; /* save current attr */
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
@@ -4598,9 +4650,25 @@ win_line(wp, lnum, startrow, endrow, nochange)
|
|||||||
if ((dy_flags & DY_UHEX) && wp->w_p_rl)
|
if ((dy_flags & DY_UHEX) && wp->w_p_rl)
|
||||||
rl_mirror(p_extra); /* reverse "<12>" */
|
rl_mirror(p_extra); /* reverse "<12>" */
|
||||||
#endif
|
#endif
|
||||||
n_extra = byte2cells(c) - 1;
|
|
||||||
c_extra = NUL;
|
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++;
|
c = *p_extra++;
|
||||||
|
}
|
||||||
if (!attr_pri)
|
if (!attr_pri)
|
||||||
{
|
{
|
||||||
n_attr = n_extra + 1;
|
n_attr = n_extra + 1;
|
||||||
|
@@ -38,6 +38,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
|
|||||||
test104.out test105.out test106.out test107.out \
|
test104.out test105.out test106.out test107.out \
|
||||||
test_autoformat_join.out \
|
test_autoformat_join.out \
|
||||||
test_breakindent.out \
|
test_breakindent.out \
|
||||||
|
test_listlbr.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_options.out
|
test_options.out
|
||||||
|
|
||||||
@@ -165,5 +166,6 @@ test106.out: test106.in
|
|||||||
test107.out: test107.in
|
test107.out: test107.in
|
||||||
test_autoformat_join.out: test_autoformat_join.in
|
test_autoformat_join.out: test_autoformat_join.in
|
||||||
test_breakindent.out: test_breakindent.in
|
test_breakindent.out: test_breakindent.in
|
||||||
|
test_listlbr.out: test_listlbr.in
|
||||||
test_eval.out: test_eval.in
|
test_eval.out: test_eval.in
|
||||||
test_options.out: test_options.in
|
test_options.out: test_options.in
|
||||||
|
@@ -37,6 +37,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
|
|||||||
test105.out test106.out test107.out\
|
test105.out test106.out test107.out\
|
||||||
test_autoformat_join.out \
|
test_autoformat_join.out \
|
||||||
test_breakindent.out \
|
test_breakindent.out \
|
||||||
|
test_listlbr \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_options.out
|
test_options.out
|
||||||
|
|
||||||
|
@@ -57,6 +57,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
|
|||||||
test105.out test106.out test107.out \
|
test105.out test106.out test107.out \
|
||||||
test_autoformat_join.out \
|
test_autoformat_join.out \
|
||||||
test_breakindent.out \
|
test_breakindent.out \
|
||||||
|
test_listlbr.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_options.out
|
test_options.out
|
||||||
|
|
||||||
|
@@ -40,6 +40,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
|
|||||||
test_autoformat_join.out \
|
test_autoformat_join.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_breakindent.out \
|
test_breakindent.out \
|
||||||
|
test_listlbr.out \
|
||||||
test_options.out
|
test_options.out
|
||||||
|
|
||||||
.SUFFIXES: .in .out
|
.SUFFIXES: .in .out
|
||||||
|
@@ -98,6 +98,7 @@ SCRIPT = test1.out test2.out test3.out test4.out test5.out \
|
|||||||
test105.out test106.out test107.out \
|
test105.out test106.out test107.out \
|
||||||
test_autoformat_join.out \
|
test_autoformat_join.out \
|
||||||
test_breakindent.out \
|
test_breakindent.out \
|
||||||
|
test_listlbr.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_options.out
|
test_options.out
|
||||||
|
|
||||||
|
@@ -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 \
|
test104.out test105.out test106.out test107.out \
|
||||||
test_autoformat_join.out \
|
test_autoformat_join.out \
|
||||||
test_breakindent.out \
|
test_breakindent.out \
|
||||||
|
test_listlbr.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_options.out
|
test_options.out
|
||||||
|
|
||||||
|
62
src/testdir/test_listlbr.in
Normal file
62
src/testdir/test_listlbr.in
Normal 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
|
39
src/testdir/test_listlbr.ok
Normal file
39
src/testdir/test_listlbr.ok
Normal 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
|
||||||
|
~
|
||||||
|
~
|
@@ -734,6 +734,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 */
|
||||||
|
/**/
|
||||||
|
353,
|
||||||
/**/
|
/**/
|
||||||
352,
|
352,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user