| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.353 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.353 |
| Problem: 'linebreak' doesn't work with the 'list' option. |
| Solution: Make it work. (Christian Brabandt) |
| Files: src/charset.c, src/screen.c, |
| src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak, |
| src/testdir/Make_ming.mak, src/testdir/Make_os2.mak, |
| src/testdir/Make_vms.mms, src/testdir/Makefile, |
| src/testdir/test_listlbr.in, src/testdir/test_listlbr.ok |
| |
| |
| |
| |
| |
| *** 1120,1126 **** |
| 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 |
| --- 1120,1125 ---- |
| |
| |
| |
| *** 2843,2848 **** |
| --- 2843,2849 ---- |
| 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,4058 **** |
| --- 4054,4064 ---- |
| } |
| else |
| { |
| + if (p_extra_free != NULL) |
| + { |
| + vim_free(p_extra_free); |
| + p_extra_free = NULL; |
| + } |
| /* |
| * Get a character from the line itself. |
| */ |
| |
| *** 4424,4431 **** |
| /* |
| * Found last space before word: check for line break. |
| */ |
| ! if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr) |
| ! && !wp->w_p_list) |
| { |
| char_u *p = ptr - ( |
| # ifdef FEAT_MBYTE |
| --- 4430,4436 ---- |
| /* |
| * Found last space before word: check for line break. |
| */ |
| ! if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr)) |
| { |
| char_u *p = ptr - ( |
| # ifdef FEAT_MBYTE |
| |
| *** 4433,4439 **** |
| # endif |
| 1); |
| /* TODO: is passing p for start of the line OK? */ |
| ! n_extra = win_lbr_chartabsize(wp, p, p, (colnr_T)vcol, |
| NULL) - 1; |
| c_extra = ' '; |
| if (vim_iswhite(c)) |
| --- 4438,4444 ---- |
| # endif |
| 1); |
| /* TODO: is passing p for start of the line OK? */ |
| ! n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol, |
| NULL) - 1; |
| c_extra = ' '; |
| if (vim_iswhite(c)) |
| |
| *** 4443,4449 **** |
| /* See "Tab alignment" below. */ |
| FIX_FOR_BOGUSCOLS; |
| #endif |
| ! c = ' '; |
| } |
| } |
| #endif |
| --- 4448,4455 ---- |
| /* See "Tab alignment" below. */ |
| FIX_FOR_BOGUSCOLS; |
| #endif |
| ! if (!wp->w_p_list) |
| ! c = ' '; |
| } |
| } |
| #endif |
| |
| *** 4483,4491 **** |
| */ |
| if (c == TAB && (!wp->w_p_list || lcs_tab1)) |
| { |
| /* tab amount depends on current column */ |
| ! n_extra = (int)wp->w_buffer->b_p_ts |
| - vcol % (int)wp->w_buffer->b_p_ts - 1; |
| #ifdef FEAT_CONCEAL |
| /* Tab alignment should be identical regardless of |
| * 'conceallevel' value. So tab compensates of all |
| --- 4489,4538 ---- |
| */ |
| if (c == TAB && (!wp->w_p_list || lcs_tab1)) |
| { |
| + int tab_len = 0; |
| /* tab amount depends on current column */ |
| ! 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,4508 **** |
| if (wp->w_p_list) |
| { |
| c = lcs_tab1; |
| ! c_extra = lcs_tab2; |
| ! n_attr = n_extra + 1; |
| extra_attr = hl_attr(HLF_8); |
| saved_attr2 = char_attr; /* save current attr */ |
| #ifdef FEAT_MBYTE |
| --- 4548,4560 ---- |
| 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 = tab_len + 1; |
| extra_attr = hl_attr(HLF_8); |
| saved_attr2 = char_attr; /* save current attr */ |
| #ifdef FEAT_MBYTE |
| |
| *** 4598,4606 **** |
| 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++; |
| if (!attr_pri) |
| { |
| n_attr = n_extra + 1; |
| --- 4650,4674 ---- |
| if ((dy_flags & DY_UHEX) && wp->w_p_rl) |
| rl_mirror(p_extra); /* reverse "<12>" */ |
| #endif |
| 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; |
| |
| |
| |
| *** 38,43 **** |
| --- 38,44 ---- |
| 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,169 **** |
| --- 166,171 ---- |
| 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 |
| |
| |
| |
| *** 37,42 **** |
| --- 37,43 ---- |
| test105.out test106.out test107.out\ |
| test_autoformat_join.out \ |
| test_breakindent.out \ |
| + test_listlbr \ |
| test_eval.out \ |
| test_options.out |
| |
| |
| |
| |
| *** 57,62 **** |
| --- 57,63 ---- |
| test105.out test106.out test107.out \ |
| test_autoformat_join.out \ |
| test_breakindent.out \ |
| + test_listlbr.out \ |
| test_eval.out \ |
| test_options.out |
| |
| |
| |
| |
| *** 40,45 **** |
| --- 40,46 ---- |
| test_autoformat_join.out \ |
| test_eval.out \ |
| test_breakindent.out \ |
| + test_listlbr.out \ |
| test_options.out |
| |
| .SUFFIXES: .in .out |
| |
| |
| |
| *** 98,103 **** |
| --- 98,104 ---- |
| test105.out test106.out test107.out \ |
| test_autoformat_join.out \ |
| test_breakindent.out \ |
| + test_listlbr.out \ |
| test_eval.out \ |
| test_options.out |
| |
| |
| |
| |
| *** 35,40 **** |
| --- 35,41 ---- |
| test104.out test105.out test106.out test107.out \ |
| test_autoformat_join.out \ |
| test_breakindent.out \ |
| + test_listlbr.out \ |
| test_eval.out \ |
| test_options.out |
| |
| |
| |
| |
| |
| --- 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 |
| |
| |
| |
| |
| --- 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 |
| + ~ |
| + ~ |
| |
| |
| |
| *** 736,737 **** |
| --- 736,739 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 353, |
| /**/ |
| |
| -- |
| FATHER: You only killed the bride's father - that's all - |
| LAUNCELOT: Oh dear, I didn't really mean to... |
| FATHER: Didn't mean to? You put your sword right through his head! |
| LAUNCELOT: Gosh - Is he all right? |
| "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |