diff options
author | Bram Moolenaar <Bram@vim.org> | 2014-07-02 20:00:47 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2014-07-02 20:00:47 +0200 |
commit | 86b17e914fec6efd3f042090ef9960c35672519c (patch) | |
tree | 29506b14ab04f6cef5ae5294ec5bee805c7406fe /src | |
parent | ee739b42c08e15bc9dfa5021f7123b4571287720 (diff) | |
download | vim-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.c | 1 | ||||
-rw-r--r-- | src/screen.c | 86 | ||||
-rw-r--r-- | src/testdir/Make_amiga.mak | 2 | ||||
-rw-r--r-- | src/testdir/Make_dos.mak | 1 | ||||
-rw-r--r-- | src/testdir/Make_ming.mak | 1 | ||||
-rw-r--r-- | src/testdir/Make_os2.mak | 1 | ||||
-rw-r--r-- | src/testdir/Make_vms.mms | 1 | ||||
-rw-r--r-- | src/testdir/Makefile | 1 | ||||
-rw-r--r-- | src/testdir/test_listlbr.in | 62 | ||||
-rw-r--r-- | src/testdir/test_listlbr.ok | 39 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |