To: vim_dev@googlegroups.com Subject: Patch 7.4.353 Fcc: outbox From: Bram Moolenaar 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: runtime/doc/options.txt, 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 *** ../vim-7.4.352/runtime/doc/options.txt 2014-06-25 11:48:40.729960646 +0200 --- runtime/doc/options.txt 2014-07-02 19:47:21.602363892 +0200 *************** *** 1200,1205 **** --- 1200,1237 ---- break if 'linebreak' is on. Only works for ASCII and also for 8-bit characters when 'encoding' is an 8-bit encoding. + *'breakindent'* *'bri'* + 'breakindent' 'bri' boolean (default off) + local to window + {not in Vi} + {not available when compiled without the |+linebreak| + feature} + Every wrapped line will continue visually indented (same amount of + space as the beginning of that line), thus preserving horizontal blocks + of text. + + *'breakindentopt'* *'briopt'* + 'breakindentopt' 'briopt' string (default empty) + local to window + {not in Vi} + {not available when compiled without the |+linebreak| + feature} + Settings for 'breakindent'. It can consist of the following optional + 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', 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 + additional indent. + The default value for min is 20 and shift is 0. + *'browsedir'* *'bsdir'* 'browsedir' 'bsdir' string (default: "last") global *** ../vim-7.4.352/src/charset.c 2014-07-02 19:37:38.462354956 +0200 --- src/charset.c 2014-07-02 19:47:21.602363892 +0200 *************** *** 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 ---- *** ../vim-7.4.352/src/screen.c 2014-07-02 17:16:51.330225522 +0200 --- src/screen.c 2014-07-02 19:51:42.082367883 +0200 *************** *** 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; *** ../vim-7.4.352/src/testdir/Make_amiga.mak 2014-06-25 14:39:35.110348584 +0200 --- src/testdir/Make_amiga.mak 2014-07-02 19:47:21.610363892 +0200 *************** *** 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 *** ../vim-7.4.352/src/testdir/Make_dos.mak 2014-06-25 14:39:35.110348584 +0200 --- src/testdir/Make_dos.mak 2014-07-02 19:47:21.610363892 +0200 *************** *** 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 *** ../vim-7.4.352/src/testdir/Make_ming.mak 2014-06-25 14:39:35.110348584 +0200 --- src/testdir/Make_ming.mak 2014-07-02 19:47:21.610363892 +0200 *************** *** 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 *** ../vim-7.4.352/src/testdir/Make_os2.mak 2014-06-25 14:39:35.114348584 +0200 --- src/testdir/Make_os2.mak 2014-07-02 19:47:21.610363892 +0200 *************** *** 40,45 **** --- 40,46 ---- test_autoformat_join.out \ test_eval.out \ test_breakindent.out \ + test_listlbr.out \ test_options.out .SUFFIXES: .in .out *** ../vim-7.4.352/src/testdir/Make_vms.mms 2014-06-25 14:39:35.114348584 +0200 --- src/testdir/Make_vms.mms 2014-07-02 19:47:21.610363892 +0200 *************** *** 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 *** ../vim-7.4.352/src/testdir/Makefile 2014-06-25 14:39:35.114348584 +0200 --- src/testdir/Makefile 2014-07-02 19:47:21.610363892 +0200 *************** *** 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 *** ../vim-7.4.352/src/testdir/test_listlbr.in 2014-07-02 19:58:25.642374067 +0200 --- src/testdir/test_listlbr.in 2014-07-02 19:47:21.610363892 +0200 *************** *** 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 *** ../vim-7.4.352/src/testdir/test_listlbr.ok 2014-07-02 19:58:25.646374067 +0200 --- src/testdir/test_listlbr.ok 2014-07-02 19:47:21.610363892 +0200 *************** *** 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 + ~ + ~ *** ../vim-7.4.352/src/version.c 2014-07-02 19:37:38.462354956 +0200 --- src/version.c 2014-07-02 19:57:44.066373430 +0200 *************** *** 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 ///