summaryrefslogtreecommitdiff
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
parentee739b42c08e15bc9dfa5021f7123b4571287720 (diff)
downloadvim-git-86b17e914fec6efd3f042090ef9960c35672519c.tar.gz
updated for version 7.4.353v7.4.353
Problem: 'breakindent' doesn't work with the 'list' option. Solution: Make it work. (Christian Brabandt)
-rw-r--r--runtime/doc/options.txt10
-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
12 files changed, 192 insertions, 15 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 20391406f..e1e1154a0 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1217,15 +1217,15 @@ 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
- characters. It permits dynamic French paragraph
+ 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).
sbr Display the 'showbreak' value before applying the
@@ -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.
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,