summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-07-02 20:00:47 +0200
committerBram Moolenaar <Bram@vim.org>2014-07-02 20:00:47 +0200
commit86b17e914fec6efd3f042090ef9960c35672519c (patch)
tree29506b14ab04f6cef5ae5294ec5bee805c7406fe /src
parentee739b42c08e15bc9dfa5021f7123b4571287720 (diff)
downloadvim-86b17e914fec6efd3f042090ef9960c35672519c.zip
updated for version 7.4.353
Problem: 'breakindent' doesn't work with the 'list' option. Solution: Make it work. (Christian Brabandt)
Diffstat (limited to 'src')
-rw-r--r--src/charset.c1
-rw-r--r--src/screen.c86
-rw-r--r--src/testdir/Make_amiga.mak2
-rw-r--r--src/testdir/Make_dos.mak1
-rw-r--r--src/testdir/Make_ming.mak1
-rw-r--r--src/testdir/Make_os2.mak1
-rw-r--r--src/testdir/Make_vms.mms1
-rw-r--r--src/testdir/Makefile1
-rw-r--r--src/testdir/test_listlbr.in62
-rw-r--r--src/testdir/test_listlbr.ok39
-rw-r--r--src/version.c2
11 files changed, 187 insertions, 10 deletions
diff --git a/src/charset.c b/src/charset.c
index 0b9f4b8d7..83a6850df 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -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
diff --git a/src/screen.c b/src/screen.c
index 65aadc423..5dec4abdd 100644
--- a/src/screen.c
+++ b/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 */
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;
diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak
index d9b061271..1226f83c8 100644
--- a/src/testdir/Make_amiga.mak
+++ b/src/testdir/Make_amiga.mak
@@ -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
diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak
index 59e28bda3..3c0682b7e 100644
--- a/src/testdir/Make_dos.mak
+++ b/src/testdir/Make_dos.mak
@@ -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
diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak
index 02cbfbfc0..603fe8099 100644
--- a/src/testdir/Make_ming.mak
+++ b/src/testdir/Make_ming.mak
@@ -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
diff --git a/src/testdir/Make_os2.mak b/src/testdir/Make_os2.mak
index 129736c7d..3de77d2f7 100644
--- a/src/testdir/Make_os2.mak
+++ b/src/testdir/Make_os2.mak
@@ -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
diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms
index 4a8cfa95b..a506233bf 100644
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -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
diff --git a/src/testdir/Makefile b/src/testdir/Makefile
index a325e4eee..49bd80adb 100644
--- a/src/testdir/Makefile
+++ b/src/testdir/Makefile
@@ -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
diff --git a/src/testdir/test_listlbr.in b/src/testdir/test_listlbr.in
new file mode 100644
index 000000000..0d50d4b06
--- /dev/null
+++ b/src/testdir/test_listlbr.in
@@ -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
diff --git a/src/testdir/test_listlbr.ok b/src/testdir/test_listlbr.ok
new file mode 100644
index 000000000..f391d50ae
--- /dev/null
+++ b/src/testdir/test_listlbr.ok
@@ -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
+~
+~
diff --git a/src/version.c b/src/version.c
index 2fd9dfb49..74b4fadb7 100644
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 353,
+/**/
352,
/**/
351,