Patch 8.2.3160

2 views
Skip to first unread message

Bram Moolenaar

unread,
Jul 14, 2021, 2:01:14 PM7/14/21
to vim...@googlegroups.com

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 -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
Reply all
Reply to author
Forward
0 new messages