| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.576 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.576 |
| Problem: Formatting of lists inside comments is not right yet. |
| Solution: Use another solution and add a test. (Tor Perkins) |
| Files: src/edit.c, src/misc1.c, src/testdir/test68.in, |
| src/testdir/test69.ok |
| |
| |
| |
| |
| |
| *** 6320,6333 **** |
| 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)... |
| */ |
| if (second_indent < 0 && has_format_option(FO_Q_NUMBER)) |
| ! second_indent = get_number_indent(curwin->w_cursor.lnum -1); |
| if (second_indent >= 0) |
| { |
| #ifdef FEAT_VREPLACE |
| --- 6320,6334 ---- |
| if (!(flags & INSCHAR_COM_LIST)) |
| { |
| /* |
| ! * 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); |
| if (second_indent >= 0) |
| { |
| #ifdef FEAT_VREPLACE |
| |
| *** 6336,6342 **** |
| --- 6337,6367 ---- |
| 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; |
| |
| |
| |
| *** 424,491 **** |
| colnr_T col; |
| pos_T pos; |
| |
| 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 */ |
| ! |
| 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)); |
| - #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 |
| |
| if (pos.lnum == 0 || *ml_get_pos(&pos) == NUL) |
| return -1; |
| --- 424,458 ---- |
| 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 |
| ! /* 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); |
| #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); |
| |
| if (pos.lnum == 0 || *ml_get_pos(&pos) == NUL) |
| return -1; |
| |
| |
| |
| *** 52,57 **** |
| --- 52,68 ---- |
| |
| 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,88 **** |
| --- 94,107 ---- |
| } |
| |
| STARTTEST |
| + /^#/ |
| + :setl tw=12 fo=tqnc comments=:# |
| + A foobar |
| + ENDTEST |
| + |
| + # 1 xxxxx |
| + |
| + STARTTEST |
| :g/^STARTTEST/.,/^ENDTEST/d |
| :1;/^Results/,$wq! test.out |
| ENDTEST |
| |
| |
| |
| *** 716,717 **** |
| --- 716,719 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 576, |
| /**/ |
| |
| -- |
| Proof techniques #2: Proof by Oddity. |
| SAMPLE: To prove that horses have an infinite number of legs. |
| (1) Horses have an even number of legs. |
| (2) They have two legs in back and fore legs in front. |
| (3) This makes a total of six legs, which certainly is an odd number of |
| legs for a horse. |
| (4) But the only number that is both odd and even is infinity. |
| (5) Therefore, horses must have an infinite number of legs. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |