diff --git a/7.3.552 b/7.3.552 new file mode 100644 index 0000000..e9a560e --- /dev/null +++ b/7.3.552 @@ -0,0 +1,582 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.552 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.552 +Problem: Formatting inside comments does not use the "2" flag in + 'formatoptions'. +Solution: Support the "2" flag. (Tor Perkins) +Files: src/vim.h, src/ops.c, src/edit.c, src/misc1.c, + src/testdir/test68.in, src/testdir/test68.ok + + +*** ../vim-7.3.551/src/vim.h 2012-06-06 18:03:01.000000000 +0200 +--- src/vim.h 2012-06-13 16:07:27.000000000 +0200 +*************** +*** 1072,1083 **** +--- 1072,1085 ---- + #define INSCHAR_DO_COM 2 /* format comments */ + #define INSCHAR_CTRLV 4 /* char typed just after CTRL-V */ + #define INSCHAR_NO_FEX 8 /* don't use 'formatexpr' */ ++ #define INSCHAR_COM_LIST 16 /* format comments with list/2nd line indent */ + + /* flags for open_line() */ + #define OPENLINE_DELSPACES 1 /* delete spaces after cursor */ + #define OPENLINE_DO_COM 2 /* format comments */ + #define OPENLINE_KEEPTRAIL 4 /* keep trailing spaces */ + #define OPENLINE_MARKFIX 8 /* fix mark positions */ ++ #define OPENLINE_COM_LIST 16 /* format comments with list/2nd line indent */ + + /* + * There are four history tables: +*** ../vim-7.3.551/src/ops.c 2012-06-13 14:01:36.000000000 +0200 +--- src/ops.c 2012-06-13 16:53:44.000000000 +0200 +*************** +*** 1727,1734 **** + * and the delete is within one line. */ + if (( + #ifdef FEAT_CLIPBOARD +! ((clip_unnamed & CLIP_UNNAMED) && oap->regname == '*') || +! ((clip_unnamed & CLIP_UNNAMED_PLUS) && oap->regname == '+') || + #endif + oap->regname == 0) && oap->motion_type != MLINE + && oap->line_count == 1) +--- 1727,1734 ---- + * and the delete is within one line. */ + if (( + #ifdef FEAT_CLIPBOARD +! ((clip_unnamed & CLIP_UNNAMED) && oap->regname == '*') || +! ((clip_unnamed & CLIP_UNNAMED_PLUS) && oap->regname == '+') || + #endif + oap->regname == 0) && oap->motion_type != MLINE + && oap->line_count == 1) +*************** +*** 4208,4217 **** + * "is_comment". + * line - line to be processed, + * process - if FALSE, will only check whether the line ends with an unclosed +! * comment, + * include_space - whether to also skip space following the comment leader, + * is_comment - will indicate whether the current line ends with an unclosed +! * comment. + */ + static char_u * + skip_comment(line, process, include_space, is_comment) +--- 4208,4217 ---- + * "is_comment". + * line - line to be processed, + * process - if FALSE, will only check whether the line ends with an unclosed +! * comment, + * include_space - whether to also skip space following the comment leader, + * is_comment - will indicate whether the current line ends with an unclosed +! * comment. + */ + static char_u * + skip_comment(line, process, include_space, is_comment) +*************** +*** 4723,4731 **** + char_u *leader_flags = NULL; /* flags for leader of current line */ + char_u *next_leader_flags; /* flags for leader of next line */ + int do_comments; /* format comments */ + #endif + int advance = TRUE; +! int second_indent = -1; + int do_second_indent; + int do_number_indent; + int do_trail_white; +--- 4723,4733 ---- + char_u *leader_flags = NULL; /* flags for leader of current line */ + char_u *next_leader_flags; /* flags for leader of next line */ + int do_comments; /* format comments */ ++ int do_comments_list = 0; /* format comments with 'n' or '2' */ + #endif + int advance = TRUE; +! int second_indent = -1; /* indent for second line (comment +! * aware) */ + int do_second_indent; + int do_number_indent; + int do_trail_white; +*************** +*** 4828,4845 **** + if (first_par_line + && (do_second_indent || do_number_indent) + && prev_is_end_par +! && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count + #ifdef FEAT_COMMENTS +! && leader_len == 0 +! && next_leader_len == 0 + #endif +! ) +! { +! if (do_second_indent +! && !lineempty(curwin->w_cursor.lnum + 1)) +! second_indent = get_indent_lnum(curwin->w_cursor.lnum + 1); + else if (do_number_indent) +! second_indent = get_number_indent(curwin->w_cursor.lnum); + } + + /* +--- 4830,4875 ---- + if (first_par_line + && (do_second_indent || do_number_indent) + && prev_is_end_par +! && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) +! { +! if (do_second_indent && !lineempty(curwin->w_cursor.lnum + 1)) +! { + #ifdef FEAT_COMMENTS +! if (leader_len == 0 && next_leader_len == 0) +! { +! /* no comment found */ + #endif +! second_indent = +! get_indent_lnum(curwin->w_cursor.lnum + 1); +! #ifdef FEAT_COMMENTS +! } +! else +! { +! second_indent = next_leader_len; +! do_comments_list = 1; +! } +! #endif +! } + else if (do_number_indent) +! { +! #ifdef FEAT_COMMENTS +! if (leader_len == 0 && next_leader_len == 0) +! { +! /* no comment found */ +! #endif +! second_indent = +! get_number_indent(curwin->w_cursor.lnum); +! #ifdef FEAT_COMMENTS +! } +! else +! { +! /* get_number_indent() is now "comment aware"... */ +! second_indent = +! get_number_indent(curwin->w_cursor.lnum); +! do_comments_list = 1; +! } +! #endif +! } + } + + /* +*************** +*** 4878,4883 **** +--- 4908,4915 ---- + insertchar(NUL, INSCHAR_FORMAT + #ifdef FEAT_COMMENTS + + (do_comments ? INSCHAR_DO_COM : 0) ++ + (do_comments && do_comments_list ++ ? INSCHAR_COM_LIST : 0) + #endif + + (avoid_fex ? INSCHAR_NO_FEX : 0), second_indent); + State = old_State; +*** ../vim-7.3.551/src/edit.c 2012-06-06 16:12:54.000000000 +0200 +--- src/edit.c 2012-06-13 16:54:10.000000000 +0200 +*************** +*** 1463,1469 **** + * what check_abbr() expects. */ + (has_mbyte && c >= 0x100) ? (c + ABBR_OFF) : + #endif +! c) && c != Ctrl_RSB)) + { + insert_special(c, FALSE, FALSE); + #ifdef FEAT_RIGHTLEFT +--- 1463,1469 ---- + * what check_abbr() expects. */ + (has_mbyte && c >= 0x100) ? (c + ABBR_OFF) : + #endif +! c) && c != Ctrl_RSB)) + { + insert_special(c, FALSE, FALSE); + #ifdef FEAT_RIGHTLEFT +*************** +*** 5769,5774 **** +--- 5769,5784 ---- + # define WHITECHAR(cc) vim_iswhite(cc) + #endif + ++ /* ++ * "flags": INSCHAR_FORMAT - force formatting ++ * INSCHAR_CTRLV - char typed just after CTRL-V ++ * INSCHAR_NO_FEX - don't use 'formatexpr' ++ * ++ * NOTE: passes the flags value straight through to internal_format() which, ++ * beside INSCHAR_FORMAT (above), is also looking for these: ++ * INSCHAR_DO_COM - format comments ++ * INSCHAR_COM_LIST - format comments with num list or 2nd line indent ++ */ + void + insertchar(c, flags, second_indent) + int c; /* character to insert or NUL */ +*************** +*** 6011,6016 **** +--- 6021,6029 ---- + + /* + * Format text at the current insert position. ++ * ++ * If the INSCHAR_COM_LIST flag is present, then the value of second_indent ++ * will be the comment leader length sent to open_line(). + */ + static void + internal_format(textwidth, second_indent, flags, format_only, c) +*************** +*** 6289,6311 **** + + (fo_white_par ? OPENLINE_KEEPTRAIL : 0) + #ifdef FEAT_COMMENTS + + (do_comments ? OPENLINE_DO_COM : 0) + #endif +! , old_indent); +! old_indent = 0; + + replace_offset = 0; + if (first_line) + { +! 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 +! if (State & VREPLACE_FLAG) +! change_indent(INDENT_SET, second_indent, FALSE, NUL, TRUE); +! else + #endif +! (void)set_indent(second_indent, SIN_CHANGED); + } + first_line = FALSE; + } +--- 6302,6337 ---- + + (fo_white_par ? OPENLINE_KEEPTRAIL : 0) + #ifdef FEAT_COMMENTS + + (do_comments ? OPENLINE_DO_COM : 0) ++ + ((flags & INSCHAR_COM_LIST) ? OPENLINE_COM_LIST : 0) + #endif +! , ((flags & INSCHAR_COM_LIST) ? second_indent : old_indent)); +! if (!(flags & INSCHAR_COM_LIST)) +! old_indent = 0; + + replace_offset = 0; + if (first_line) + { +! 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 +! if (State & VREPLACE_FLAG) +! change_indent(INDENT_SET, second_indent, +! FALSE, NUL, TRUE); +! else + #endif +! (void)set_indent(second_indent, SIN_CHANGED); +! } + } + first_line = FALSE; + } +*** ../vim-7.3.551/src/misc1.c 2012-06-13 13:40:45.000000000 +0200 +--- src/misc1.c 2012-06-13 16:54:59.000000000 +0200 +*************** +*** 423,449 **** + { + colnr_T col; + pos_T pos; +- regmmatch_T regmatch; + + if (lnum > curbuf->b_ml.ml_line_count) + return -1; + pos.lnum = 0; +! 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); + } + + if (pos.lnum == 0 || *ml_get_pos(&pos) == NUL) + return -1; +--- 423,492 ---- + { + 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 = *regmatch.endp - (ml_get(lnum) + lead_len); +! pos.col += lead_len; + #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 seperate 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; +*************** +*** 502,515 **** + * OPENLINE_DO_COM format comments + * OPENLINE_KEEPTRAIL keep trailing spaces + * OPENLINE_MARKFIX adjust mark positions after the line break + * + * Return TRUE for success, FALSE for failure + */ + int +! open_line(dir, flags, old_indent) + int dir; /* FORWARD or BACKWARD */ + int flags; +! int old_indent; /* indent for after ^^D in Insert mode */ + { + char_u *saved_line; /* copy of the original line */ + char_u *next_line = NULL; /* copy of the next line */ +--- 545,562 ---- + * OPENLINE_DO_COM format comments + * OPENLINE_KEEPTRAIL keep trailing spaces + * OPENLINE_MARKFIX adjust mark positions after the line break ++ * OPENLINE_COM_LIST format comments with list or 2nd line indent ++ * ++ * "second_line_indent": indent for after ^^D in Insert mode or if flag ++ * OPENLINE_COM_LIST + * + * Return TRUE for success, FALSE for failure + */ + int +! open_line(dir, flags, second_line_indent) + int dir; /* FORWARD or BACKWARD */ + int flags; +! int second_line_indent; + { + char_u *saved_line; /* copy of the original line */ + char_u *next_line = NULL; /* copy of the next line */ +*************** +*** 650,657 **** + * count white space on current line + */ + newindent = get_indent_str(saved_line, (int)curbuf->b_p_ts); +! if (newindent == 0) +! newindent = old_indent; /* for ^^D command in insert mode */ + + #ifdef FEAT_SMARTINDENT + /* +--- 697,704 ---- + * count white space on current line + */ + newindent = get_indent_str(saved_line, (int)curbuf->b_p_ts); +! if (newindent == 0 && !(flags & OPENLINE_COM_LIST)) +! newindent = second_line_indent; /* for ^^D command in insert mode */ + + #ifdef FEAT_SMARTINDENT + /* +*************** +*** 1008,1015 **** + if (lead_len) + { + /* allocate buffer (may concatenate p_exta later) */ +! leader = alloc(lead_len + lead_repl_len + extra_space + +! extra_len + 1); + allocated = leader; /* remember to free it later */ + + if (leader == NULL) +--- 1055,1062 ---- + if (lead_len) + { + /* allocate buffer (may concatenate p_exta later) */ +! leader = alloc(lead_len + lead_repl_len + extra_space + extra_len +! + (second_line_indent > 0 ? second_line_indent : 0)); + allocated = leader; /* remember to free it later */ + + if (leader == NULL) +*************** +*** 1304,1309 **** +--- 1351,1370 ---- + /* concatenate leader and p_extra, if there is a leader */ + if (lead_len) + { ++ if (flags & OPENLINE_COM_LIST && second_line_indent > 0) ++ { ++ int i; ++ int padding = second_line_indent - (newindent + STRLEN(leader)); ++ ++ /* Here whitespace is inserted after the comment char. ++ * Below, set_indent(newindent, SIN_INSERT) will insert the ++ * whitespace needed before the comment char. */ ++ for (i = 0; i < padding; i++) ++ { ++ STRCAT(leader, " "); ++ newcol++; ++ } ++ } + STRCAT(leader, p_extra); + p_extra = leader; + did_ai = TRUE; /* So truncating blanks works with comments */ +*************** +*** 4966,4973 **** + char_u * + FullName_save(fname, force) + char_u *fname; +! int force; /* force expansion, even when it already looks +! like a full path name */ + { + char_u *buf; + char_u *new_fname = NULL; +--- 5027,5034 ---- + char_u * + FullName_save(fname, force) + char_u *fname; +! int force; /* force expansion, even when it already looks +! * like a full path name */ + { + char_u *buf; + char_u *new_fname = NULL; +*** ../vim-7.3.551/src/testdir/test68.in 2010-10-09 17:21:42.000000000 +0200 +--- src/testdir/test68.in 2012-06-13 15:49:38.000000000 +0200 +*************** +*** 51,56 **** +--- 51,77 ---- + } + + STARTTEST ++ /^{/+1 ++ :set tw=5 fo=qn comments=:# ++ gwap ++ ENDTEST ++ ++ { ++ # 1 a b ++ } ++ ++ STARTTEST ++ /^{/+1 ++ :set tw=5 fo=q2 comments=:# ++ gwap ++ ENDTEST ++ ++ { ++ # x ++ # a b ++ } ++ ++ STARTTEST + /^{/+2 + :set tw& fo=a + I^^ +*** ../vim-7.3.551/src/testdir/test68.ok 2010-10-09 17:21:42.000000000 +0200 +--- src/testdir/test68.ok 2012-06-13 15:49:38.000000000 +0200 +*************** +*** 34,38 **** +--- 34,50 ---- + } + + ++ { ++ # 1 a ++ # b ++ } ++ ++ ++ { ++ # x a ++ # b ++ } ++ ++ + { 1aa ^^2bb } + +*** ../vim-7.3.551/src/version.c 2012-06-13 14:28:16.000000000 +0200 +--- src/version.c 2012-06-13 16:36:14.000000000 +0200 +*************** +*** 716,717 **** +--- 716,719 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 552, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +31. You code your homework in HTML and give your instructor the URL. + + /// 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 ///