Patch 8.2.3160
Problem:    'breakindent' does not work well for bulleted and numbered lists.
Solution:   Add the "list" entry to 'breakindentopt'. (Christian Brabandt,
            closes #8564, closes #1661)
Files:      runtime/doc/options.txt, src/indent.c, src/structs.h,
            src/testdir/test_breakindent.vim


*** ../vim-8.2.3159/runtime/doc/options.txt     2021-06-30 20:54:30.692546348 
+0200
--- runtime/doc/options.txt     2021-07-14 19:56:29.274055598 +0200
***************
*** 1326,1332 ****
                            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")
--- 1326,1335 ----
                            continuation (positive).
                sbr         Display the 'showbreak' value before applying the
                            additional indent.
!               list:{n}    Adds an additional indent for lines that match a 
!                           numbered or bulleted list (using the
!                           'formatlistpat' setting).
!       The default value for min is 20, shift and list is 0.
  
                                                *'browsedir'* *'bsdir'*
  'browsedir' 'bsdir'   string  (default: "last")
*** ../vim-8.2.3159/src/indent.c        2021-06-27 22:03:28.641707728 +0200
--- src/indent.c        2021-07-14 19:58:16.197889863 +0200
***************
*** 854,859 ****
--- 854,860 ----
      int               bri_shift = 0;
      long      bri_min = 20;
      int               bri_sbr = FALSE;
+     int               bri_list = 0;
  
      p = wp->w_p_briopt;
      while (*p != NUL)
***************
*** 874,879 ****
--- 875,885 ----
            p += 3;
            bri_sbr = TRUE;
        }
+       else if (STRNCMP(p, "list:", 5) == 0)
+       {
+           p += 5;
+           bri_list = getdigits(&p);
+       }
        if (*p != ',' && *p != NUL)
            return FAIL;
        if (*p == ',')
***************
*** 883,888 ****
--- 889,895 ----
      wp->w_briopt_shift = bri_shift;
      wp->w_briopt_min   = bri_min;
      wp->w_briopt_sbr   = bri_sbr;
+     wp->w_briopt_list  = bri_list;
  
      return OK;
  }
***************
*** 941,949 ****
--- 948,972 ----
      // Add offset for number column, if 'n' is in 'cpoptions'
      bri += win_col_off2(wp);
  
+     // add additional indent for numbered lists
+     if (wp->w_briopt_list > 0)
+     {
+       regmatch_T          regmatch;
+ 
+       regmatch.regprog = vim_regcomp(curbuf->b_p_flp,
+                                  RE_MAGIC + RE_STRING + RE_AUTO + RE_STRICT);
+       if (regmatch.regprog != NULL)
+       {
+           if (vim_regexec(&regmatch, line, 0))
+               bri += wp->w_briopt_list;
+           vim_regfree(regmatch.regprog);
+       }
+     }
+ 
      // never indent past left window margin
      if (bri < 0)
        bri = 0;
+ 
      // always leave at least bri_min characters on the left,
      // if text width is sufficient
      else if (bri > eff_wwidth - wp->w_briopt_min)
*** ../vim-8.2.3159/src/structs.h       2021-07-04 14:47:27.451118495 +0200
--- src/structs.h       2021-07-14 19:53:26.922336166 +0200
***************
*** 3671,3676 ****
--- 3671,3677 ----
      int               w_briopt_min;       // minimum width for breakindent
      int               w_briopt_shift;     // additional shift for breakindent
      int               w_briopt_sbr;       // sbr in 'briopt'
+     int               w_briopt_list;      // additional indent for lists
  #endif
  
      // transform a pointer to a "onebuf" option into a "allbuf" option
*** ../vim-8.2.3159/src/testdir/test_breakindent.vim    2021-02-10 
21:20:21.969294832 +0100
--- src/testdir/test_breakindent.vim    2021-07-14 19:53:26.922336166 +0200
***************
*** 15,20 ****
--- 15,24 ----
    return ScreenLines([a:lnum, a:lnum + 2], a:width)
  endfunc
  
+ func s:screen_lines2(lnums, lnume, width) abort
+   return ScreenLines([a:lnums, a:lnume], a:width)
+ endfunc
+ 
  func s:compare_lines(expect, actual)
    call assert_equal(join(a:expect, "\n"), join(a:actual, "\n"))
  endfunc
***************
*** 708,711 ****
--- 712,781 ----
    call s:close_windows('set breakindent& briopt& cpo& number&')
  endfunc
  
+ func Test_breakindent20_list()
+   call s:test_windows('setl breakindent breakindentopt= linebreak')
+   " default:
+   call setline(1, ['  1.  Congress shall make no law',
+         \ '  2.) Congress shall make no law',
+         \ '  3.] Congress shall make no law'])
+   norm! 1gg
+   redraw!
+   let lines = s:screen_lines2(1, 6, 20)
+   let expect = [
+       \ "  1.  Congress      ",
+       \ "shall make no law   ",
+       \ "  2.) Congress      ",
+       \ "shall make no law   ",
+       \ "  3.] Congress      ",
+       \ "shall make no law   ",
+       \ ]
+   call s:compare_lines(expect, lines)
+   " set mininum indent
+   setl briopt=min:5
+   redraw!
+   let lines = s:screen_lines2(1, 6, 20)
+   let expect = [
+       \ "  1.  Congress      ",
+       \ "  shall make no law ",
+       \ "  2.) Congress      ",
+       \ "  shall make no law ",
+       \ "  3.] Congress      ",
+       \ "  shall make no law ",
+       \ ]
+   call s:compare_lines(expect, lines)
+   " set additional handing indent
+   setl briopt+=list:4
+   redraw!
+   let expect = [
+       \ "  1.  Congress      ",
+       \ "      shall make no ",
+       \ "      law           ",
+       \ "  2.) Congress      ",
+       \ "      shall make no ",
+       \ "      law           ",
+       \ "  3.] Congress      ",
+       \ "      shall make no ",
+       \ "      law           ",
+       \ ]
+   let lines = s:screen_lines2(1, 9, 20)
+   call s:compare_lines(expect, lines)
+   " reset linebreak option
+   " Note: it indents by one additional
+   " space, because of the leading space.
+   setl linebreak&vim list listchars=eol:$,space:_
+   redraw!
+   let expect = [
+       \ "__1.__Congress_shall",
+       \ "      _make_no_law$ ",
+       \ "__2.)_Congress_shall",
+       \ "      _make_no_law$ ",
+       \ "__3.]_Congress_shall",
+       \ "      _make_no_law$ ",
+       \ ]
+   let lines = s:screen_lines2(1, 6, 20)
+   call s:compare_lines(expect, lines)
+ 
+   call s:close_windows('set breakindent& briopt& linebreak& list& listchars&')
+ endfunc
+ 
  " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.3159/src/version.c       2021-07-13 22:21:39.581467722 +0200
--- src/version.c       2021-07-14 19:56:14.882077835 +0200
***************
*** 757,758 ****
--- 757,760 ----
  {   /* Add new patch number below this line */
+ /**/
+     3160,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
137. You decide to stay in college for an additional year or two,
     just so you can have the free Internet access.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202107141801.16EI151i1677063%40masaka.moolenaar.net.

Raspunde prin e-mail lui