]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.353 v7.4.353
authorBram Moolenaar <Bram@vim.org>
Wed, 2 Jul 2014 18:00:47 +0000 (20:00 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 2 Jul 2014 18:00:47 +0000 (20:00 +0200)
Problem:    'breakindent' doesn't work with the 'list' option.
Solution:   Make it work. (Christian Brabandt)

12 files changed:
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 [new file with mode: 0644]
src/testdir/test_listlbr.ok [new file with mode: 0644]
src/version.c

index 20391406fed60195a3f1241a8f8f94cea356e9fb..e1e1154a0385c2c734c790ad17b568f8ceba7df4 100644 (file)
@@ -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.
 
index 0b9f4b8d7730c11e8f6399db44139f30d563ae79..83a6850df2914e5fb18981badc89140d0815ba2b 100644 (file)
@@ -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
index 65aadc4235205f66f9743837e11f452d4fd8f86e..5dec4abdd11207d62582d796365dc83392d28968 100644 (file)
@@ -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;
index d9b06127191370e9e07ed9889389f76d9916b5d5..1226f83c81ff96015c8e7834e30cdf63e4d311f8 100644 (file)
@@ -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
index 59e28bda3363aa013d3a0360b767cae5b9ac4bab..3c0682b7ebb71284b8193ce5b357709ea1ad154b 100644 (file)
@@ -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
 
index 02cbfbfc00f9da93f2f4ce6317eec026705f054e..603fe8099888563a3ae042fc3613595926a6b69d 100644 (file)
@@ -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
 
index 129736c7dbe53b2a266adc1b835dbdbffe386e93..3de77d2f7bc999f85cd5b8e08f88227b6178c0c9 100644 (file)
@@ -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
index 4a8cfa95bb000bb478a1ffabdda5d53613770208..a506233bf58d7df5d59306e4365ff546ddcaa5c1 100644 (file)
@@ -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
 
index a325e4eee9fa9c3caa55319be83963641a8777a1..49bd80adbfd6641e5a50b220b149c6c106ced8b6 100644 (file)
@@ -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 (file)
index 0000000..0d50d4b
--- /dev/null
@@ -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 (file)
index 0000000..f391d50
--- /dev/null
@@ -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 
+~                   
+~                   
index 2fd9dfb4935585488c55439a636a90b5f59a1b00..74b4fadb72c9f25419824c3d767b31a0d4a4aa6f 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    353,
 /**/
     352,
 /**/