Patch 7.4.353
Problem:    'breakindent' 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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui