To: vim_dev@googlegroups.com Subject: Patch 8.2.4093 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4093 Problem: Cached breakindent values not initialized properly. Solution: Initialize and cache formatlistpat. (Christian Brabandt, closes #9526, closes #9512) Files: runtime/doc/options.txt, src/indent.c, src/option.c, src/proto/option.pro, src/testdir/test_breakindent.vim *** ../vim-8.2.4092/runtime/doc/options.txt 2021-12-26 12:07:24.798944010 +0000 --- runtime/doc/options.txt 2022-01-15 09:50:48.197456124 +0000 *************** *** 1370,1375 **** --- 1370,1376 ---- text should normally be narrower. This prevents text indented almost to the right window border occupying lot of vertical space when broken. + (default: 20) shift:{n} After applying 'breakindent', the wrapped line's beginning will be shifted by the given number of characters. It permits dynamic French paragraph *** ../vim-8.2.4092/src/indent.c 2022-01-07 16:55:27.112417600 +0000 --- src/indent.c 2022-01-15 10:00:12.996681829 +0000 *************** *** 924,929 **** --- 924,931 ---- # endif static int prev_list = 0; // cached list value static int prev_listopt = 0; // cached w_p_briopt_list value + // cached formatlistpat value + static char_u *prev_flp = NULL; int bri = 0; // window width minus window margin space, i.e. what rests for text const int eff_wwidth = wp->w_width *************** *** 931,940 **** && (vim_strchr(p_cpo, CPO_NUMCOL) == NULL) ? number_width(wp) + 1 : 0); ! // used cached indent, unless line, 'tabstop' or briopt_list changed if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts || prev_tick != CHANGEDTICK(wp->w_buffer) || prev_listopt != wp->w_briopt_list # ifdef FEAT_VARTABS || prev_vts != wp->w_buffer->b_p_vts_array # endif --- 933,948 ---- && (vim_strchr(p_cpo, CPO_NUMCOL) == NULL) ? number_width(wp) + 1 : 0); ! // used cached indent, unless ! // - line pointer changed ! // - 'tabstop' changed ! // - 'briopt_list changed' changed or ! // - 'formatlistpattern' changed if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts || prev_tick != CHANGEDTICK(wp->w_buffer) || prev_listopt != wp->w_briopt_list + || (prev_flp == NULL + || (STRCMP(prev_flp, get_flp_value(wp->w_buffer)) != 0)) # ifdef FEAT_VARTABS || prev_vts != wp->w_buffer->b_p_vts_array # endif *************** *** 953,965 **** (int)wp->w_buffer->b_p_ts, wp->w_p_list); # endif prev_listopt = wp->w_briopt_list; // 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) { --- 961,976 ---- (int)wp->w_buffer->b_p_ts, wp->w_p_list); # endif prev_listopt = wp->w_briopt_list; + prev_list = 0; + vim_free(prev_flp); + prev_flp = vim_strsave(get_flp_value(wp->w_buffer)); // add additional indent for numbered lists if (wp->w_briopt_list != 0) { regmatch_T regmatch; ! regmatch.regprog = vim_regcomp(prev_flp, ! RE_MAGIC + RE_STRING + RE_AUTO + RE_STRICT); if (regmatch.regprog != NULL) { *** ../vim-8.2.4092/src/option.c 2022-01-08 12:41:12.208795550 +0000 --- src/option.c 2022-01-15 09:50:48.197456124 +0000 *************** *** 7053,7058 **** --- 7053,7070 ---- } /* + * Get the local or global value of 'formatlistpat'. + */ + char_u * + get_flp_value(buf_T *buf) + { + return buf->b_p_flp ? buf->b_p_flp : p_flp; + if (buf->b_p_flp == NULL || *buf->b_p_flp == NUL) + return p_flp; + return buf->b_p_flp; + } + + /* * Get the local or global value of the 'virtualedit' flags. */ unsigned int *** ../vim-8.2.4092/src/proto/option.pro 2021-12-06 11:03:50.950900210 +0000 --- src/proto/option.pro 2022-01-15 09:50:48.197456124 +0000 *************** *** 73,78 **** --- 73,79 ---- long get_scrolloff_value(void); long get_sidescrolloff_value(void); unsigned int get_bkc_value(buf_T *buf); + char_u *get_flp_value(buf_T *buf); unsigned int get_ve_flags(void); char_u *get_showbreak_value(win_T *win); dict_T *get_winbuf_options(int bufopt); *** ../vim-8.2.4092/src/testdir/test_breakindent.vim 2021-09-02 19:05:22.925120220 +0100 --- src/testdir/test_breakindent.vim 2022-01-15 09:50:48.197456124 +0000 *************** *** 849,852 **** --- 849,909 ---- %bw! endfunc + func Test_no_spurious_match() + let s:input = printf('- y %s y %s', repeat('x', 50), repeat('x', 50)) + call s:test_windows('setl breakindent breakindentopt=list:-1 formatlistpat=^- hls') + let @/ = '\%>3v[y]' + redraw! + call searchcount().total->assert_equal(1) + " cleanup + set hls&vim + let s:input = "\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP" + bwipeout! + endfunc + + func Test_no_extra_indent() + call s:test_windows('setl breakindent breakindentopt=list:-1,min:10') + %d + let &l:formatlistpat='^\s*\d\+\.\s\+' + let text = 'word ' + let len = text->strcharlen() + let line1 = text->repeat((winwidth(0) / len) * 2) + let line2 = repeat(' ', 2) .. '1. ' .. line1 + call setline(1, [line2]) + redraw! + " 1) matches formatlist pattern, so indent + let expect = [ + \ " 1. word word word ", + \ " word word word ", + \ " word word ", + \ "~ ", + \ ] + let lines = s:screen_lines2(1, 4, 20) + call s:compare_lines(expect, lines) + " 2) change formatlist pattern + " -> indent adjusted + let &l:formatlistpat='^\s*\d\+\.' + let expect = [ + \ " 1. word word word ", + \ " word word word ", + \ " word word ", + \ "~ ", + \ ] + let lines = s:screen_lines2(1, 4, 20) + " 3) add something in front, no additional indent + norm! gg0 + exe ":norm! 5iword \" + redraw! + let expect = [ + \ "word word word word ", + \ "word 1. word word ", + \ "word word word word ", + \ "word word ", + \ "~ ", + \ ] + let lines = s:screen_lines2(1, 5, 20) + call s:compare_lines(expect, lines) + bwipeout! + endfunc + " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.4092/src/version.c 2022-01-14 21:28:55.580849073 +0000 --- src/version.c 2022-01-15 09:56:29.829032222 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4093, /**/ -- PRINCE: He's come to rescue me, father. LAUNCELOT: (embarrassed) Well, let's not jump to conclusions ... "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/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///