# HG changeset patch # User Bram Moolenaar # Date 1340975089 -7200 # Node ID 7e3fedfc3d08d020e3ce047ec1a1cfd195af9ed7 # Parent 7a4292517a68fd116bb555c691bd450011fbec7e updated for version 7.3.576 Problem: Formatting of lists inside comments is not right yet. Solution: Use another solution and add a test. (Tor Perkins) diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -6320,14 +6320,15 @@ internal_format(textwidth, second_indent if (!(flags & INSCHAR_COM_LIST)) { /* - * This section is for numeric lists w/o comments. If comment - * indents are needed with numeric lists (formatoptions=nq), - * then the INSCHAR_COM_LIST flag will cause the corresponding - * OPENLINE_COM_LIST flag to be passed through to open_line() - * (as seen above)... + * This section is for auto-wrap of numeric lists. When not + * in insert mode (i.e. format_lines()), the INSCHAR_COM_LIST + * flag will be set and open_line() will handle it (as seen + * above). The code here (and in get_number_indent()) will + * recognize comments if needed... */ if (second_indent < 0 && has_format_option(FO_Q_NUMBER)) - second_indent = get_number_indent(curwin->w_cursor.lnum -1); + second_indent = + get_number_indent(curwin->w_cursor.lnum - 1); if (second_indent >= 0) { #ifdef FEAT_VREPLACE @@ -6336,7 +6337,31 @@ internal_format(textwidth, second_indent FALSE, NUL, TRUE); else #endif +#ifdef FEAT_COMMENTS + if (leader_len > 0 && second_indent - leader_len > 0) + { + int i; + int padding = second_indent - leader_len; + + /* We started at the first_line of a numbered list + * that has a comment. the open_line() function has + * inserted the proper comment leader and positioned + * the cursor at the end of the split line. Now we + * add the additional whitespace needed after the + * comment leader for the numbered list. */ + for (i = 0; i < padding; i++) + { + ins_str((char_u *)" "); + changed_bytes(curwin->w_cursor.lnum, leader_len); + } + } + else + { +#endif (void)set_indent(second_indent, SIN_CHANGED); +#ifdef FEAT_COMMENTS + } +#endif } } first_line = FALSE; diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -424,68 +424,35 @@ get_number_indent(lnum) colnr_T col; pos_T pos; + regmatch_T regmatch; + int lead_len = 0; /* length of comment leader */ + if (lnum > curbuf->b_ml.ml_line_count) return -1; pos.lnum = 0; #ifdef FEAT_COMMENTS - if (has_format_option(FO_Q_COMS) && has_format_option(FO_Q_NUMBER)) - { - regmatch_T regmatch; - int lead_len; /* length of comment leader */ - + /* In format_lines() (i.e. not insert mode), fo+=q is needed too... */ + if ((State & INSERT) || has_format_option(FO_Q_COMS)) lead_len = get_leader_len(ml_get(lnum), NULL, FALSE, TRUE); - regmatch.regprog = vim_regcomp(curbuf->b_p_flp, RE_MAGIC); - if (regmatch.regprog != NULL) - { - regmatch.rm_ic = FALSE; - - /* vim_regexec() expects a pointer to a line. This lets us - * start matching for the flp beyond any comment leader... */ - if (vim_regexec(®match, ml_get(lnum) + lead_len, (colnr_T)0)) - { - pos.lnum = lnum; - pos.col = (colnr_T)(*regmatch.endp - ml_get(lnum)); +#endif + regmatch.regprog = vim_regcomp(curbuf->b_p_flp, RE_MAGIC); + if (regmatch.regprog != NULL) + { + regmatch.rm_ic = FALSE; + + /* vim_regexec() expects a pointer to a line. This lets us + * start matching for the flp beyond any comment leader... */ + if (vim_regexec(®match, ml_get(lnum) + lead_len, (colnr_T)0)) + { + pos.lnum = lnum; + pos.col = (colnr_T)(*regmatch.endp - ml_get(lnum)); #ifdef FEAT_VIRTUALEDIT - pos.coladd = 0; -#endif - } - } - vim_free(regmatch.regprog); - } - else - { - /* - * What follows is the orig code that is not "comment aware"... - * - * I'm not sure if regmmatch_T (multi-match) is needed in this case. - * It may be true that this section would work properly using the - * regmatch_T code above, in which case, these two separate sections - * should be consolidated w/ FEAT_COMMENTS making lead_len > 0... - */ -#endif - regmmatch_T regmatch; - - regmatch.regprog = vim_regcomp(curbuf->b_p_flp, RE_MAGIC); - - if (regmatch.regprog != NULL) - { - regmatch.rmm_ic = FALSE; - regmatch.rmm_maxcol = 0; - if (vim_regexec_multi(®match, curwin, curbuf, - lnum, (colnr_T)0, NULL)) - { - pos.lnum = regmatch.endpos[0].lnum + lnum; - pos.col = regmatch.endpos[0].col; -#ifdef FEAT_VIRTUALEDIT - pos.coladd = 0; -#endif - } - vim_free(regmatch.regprog); - } -#ifdef FEAT_COMMENTS - } -#endif + pos.coladd = 0; +#endif + } + } + vim_free(regmatch.regprog); if (pos.lnum == 0 || *ml_get_pos(&pos) == NUL) return -1; diff --git a/src/testdir/test68.in b/src/testdir/test68.in --- a/src/testdir/test68.in +++ b/src/testdir/test68.in @@ -52,6 +52,17 @@ a b STARTTEST /^{/+1 +:set tw=5 fo=tcn comments=:# +A bjA b +ENDTEST + +{ + 1 a +# 1 a +} + +STARTTEST +/^{/+1 :set tw=5 fo=qn comments=:# gwap ENDTEST @@ -83,6 +94,14 @@ ENDTEST } STARTTEST +/^#/ +:setl tw=12 fo=tqnc comments=:# +A foobar +ENDTEST + +# 1 xxxxx + +STARTTEST :g/^STARTTEST/.,/^ENDTEST/d :1;/^Results/,$wq! test.out ENDTEST diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 576, +/**/ 575, /**/ 574,