| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.541 |
| 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.541 |
| Problem: When joining lines comment leaders need to be removed manually. |
| Solution: Add the 'j' flag to 'formatoptions'. (Lech Lorens) |
| Files: runtime/doc/change.txt, src/edit.c, src/ex_docmd.c, src/misc1.c, |
| src/normal.c, src/ops.c, src/option.h, src/proto/misc1.pro, |
| src/proto/ops.pro, src/search.c, src/testdir/test29.in, |
| src/testdir/test29.ok |
| |
| |
| |
| |
| |
| *** 1495,1500 **** |
| --- 1522,1533 ---- |
| characters. Overruled by the 'M' flag. |
| 1 Don't break a line after a one-letter word. It's broken before it |
| instead (if possible). |
| + j Where it makes sense, remove a comment leader when joining lines. For |
| + example, joining: |
| + int i; // the index ~ |
| + // in the list ~ |
| + Becomes: |
| + int i; // the index in the list ~ |
| |
| |
| With 't' and 'c' you can specify when Vim performs auto-wrapping: |
| |
| |
| |
| *** 5847,5853 **** |
| * Need to remove existing (middle) comment leader and insert end |
| * comment leader. First, check what comment leader we can find. |
| */ |
| ! i = get_leader_len(line = ml_get_curline(), &p, FALSE); |
| if (i > 0 && vim_strchr(p, COM_MIDDLE) != NULL) /* Just checking */ |
| { |
| /* Skip middle-comment string */ |
| --- 5847,5853 ---- |
| * Need to remove existing (middle) comment leader and insert end |
| * comment leader. First, check what comment leader we can find. |
| */ |
| ! i = get_leader_len(line = ml_get_curline(), &p, FALSE, TRUE); |
| if (i > 0 && vim_strchr(p, COM_MIDDLE) != NULL) /* Just checking */ |
| { |
| /* Skip middle-comment string */ |
| |
| *** 6085,6091 **** |
| |
| /* Don't break until after the comment leader */ |
| if (do_comments) |
| ! leader_len = get_leader_len(ml_get_curline(), NULL, FALSE); |
| else |
| leader_len = 0; |
| |
| --- 6085,6091 ---- |
| |
| /* Don't break until after the comment leader */ |
| if (do_comments) |
| ! leader_len = get_leader_len(ml_get_curline(), NULL, FALSE, TRUE); |
| else |
| leader_len = 0; |
| |
| |
| *** 6411,6417 **** |
| /* With the 'c' flag in 'formatoptions' and 't' missing: only format |
| * comments. */ |
| if (has_format_option(FO_WRAP_COMS) && !has_format_option(FO_WRAP) |
| ! && get_leader_len(old, NULL, FALSE) == 0) |
| return; |
| #endif |
| |
| --- 6411,6417 ---- |
| /* With the 'c' flag in 'formatoptions' and 't' missing: only format |
| * comments. */ |
| if (has_format_option(FO_WRAP_COMS) && !has_format_option(FO_WRAP) |
| ! && get_leader_len(old, NULL, FALSE, TRUE) == 0) |
| return; |
| #endif |
| |
| |
| *** 8565,8571 **** |
| { |
| temp = curwin->w_cursor.col; |
| if (!can_bs(BS_EOL) /* only if "eol" included */ |
| ! || do_join(2, FALSE, TRUE) == FAIL) |
| vim_beep(); |
| else |
| curwin->w_cursor.col = temp; |
| --- 8565,8571 ---- |
| { |
| temp = curwin->w_cursor.col; |
| if (!can_bs(BS_EOL) /* only if "eol" included */ |
| ! || do_join(2, FALSE, TRUE, FALSE) == FAIL) |
| vim_beep(); |
| else |
| curwin->w_cursor.col = temp; |
| |
| *** 8746,8752 **** |
| ptr[len - 1] = NUL; |
| } |
| |
| ! (void)do_join(2, FALSE, FALSE); |
| if (temp == NUL && gchar_cursor() != NUL) |
| inc_cursor(); |
| } |
| --- 8746,8752 ---- |
| ptr[len - 1] = NUL; |
| } |
| |
| ! (void)do_join(2, FALSE, FALSE, FALSE); |
| if (temp == NUL && gchar_cursor() != NUL) |
| inc_cursor(); |
| } |
| |
| |
| |
| *** 8545,8551 **** |
| } |
| ++eap->line2; |
| } |
| ! (void)do_join(eap->line2 - eap->line1 + 1, !eap->forceit, TRUE); |
| beginline(BL_WHITE | BL_FIX); |
| ex_may_print(eap); |
| } |
| --- 8545,8551 ---- |
| } |
| ++eap->line2; |
| } |
| ! (void)do_join(eap->line2 - eap->line1 + 1, !eap->forceit, TRUE, TRUE); |
| beginline(BL_WHITE | BL_FIX); |
| ex_may_print(eap); |
| } |
| |
| |
| |
| *** 671,677 **** |
| ptr = saved_line; |
| # ifdef FEAT_COMMENTS |
| if (flags & OPENLINE_DO_COM) |
| ! lead_len = get_leader_len(ptr, NULL, FALSE); |
| else |
| lead_len = 0; |
| # endif |
| --- 671,677 ---- |
| ptr = saved_line; |
| # ifdef FEAT_COMMENTS |
| if (flags & OPENLINE_DO_COM) |
| ! lead_len = get_leader_len(ptr, NULL, FALSE, TRUE); |
| else |
| lead_len = 0; |
| # endif |
| |
| *** 693,699 **** |
| } |
| # ifdef FEAT_COMMENTS |
| if (flags & OPENLINE_DO_COM) |
| ! lead_len = get_leader_len(ptr, NULL, FALSE); |
| else |
| lead_len = 0; |
| if (lead_len > 0) |
| --- 693,699 ---- |
| } |
| # ifdef FEAT_COMMENTS |
| if (flags & OPENLINE_DO_COM) |
| ! lead_len = get_leader_len(ptr, NULL, FALSE, TRUE); |
| else |
| lead_len = 0; |
| if (lead_len > 0) |
| |
| *** 836,842 **** |
| */ |
| end_comment_pending = NUL; |
| if (flags & OPENLINE_DO_COM) |
| ! lead_len = get_leader_len(saved_line, &lead_flags, dir == BACKWARD); |
| else |
| lead_len = 0; |
| if (lead_len > 0) |
| --- 836,842 ---- |
| */ |
| end_comment_pending = NUL; |
| if (flags & OPENLINE_DO_COM) |
| ! lead_len = get_leader_len(saved_line, &lead_flags, dir == BACKWARD, TRUE); |
| else |
| lead_len = 0; |
| if (lead_len > 0) |
| |
| *** 1548,1561 **** |
| * When "flags" is not NULL, it is set to point to the flags of the recognized |
| * comment leader. |
| * "backward" must be true for the "O" command. |
| */ |
| int |
| ! get_leader_len(line, flags, backward) |
| char_u *line; |
| char_u **flags; |
| int backward; |
| { |
| int i, j; |
| int got_com = FALSE; |
| int found_one; |
| char_u part_buf[COM_MAX_LEN]; /* buffer for one option part */ |
| --- 1548,1565 ---- |
| * When "flags" is not NULL, it is set to point to the flags of the recognized |
| * comment leader. |
| * "backward" must be true for the "O" command. |
| + * If "include_space" is set, include trailing whitespace while calculating the |
| + * length. |
| */ |
| int |
| ! get_leader_len(line, flags, backward, include_space) |
| char_u *line; |
| char_u **flags; |
| int backward; |
| + int include_space; |
| { |
| int i, j; |
| + int result; |
| int got_com = FALSE; |
| int found_one; |
| char_u part_buf[COM_MAX_LEN]; /* buffer for one option part */ |
| |
| *** 1565,1571 **** |
| char_u *prev_list; |
| char_u *saved_flags = NULL; |
| |
| ! i = 0; |
| while (vim_iswhite(line[i])) /* leading white space is ignored */ |
| ++i; |
| |
| --- 1569,1575 ---- |
| char_u *prev_list; |
| char_u *saved_flags = NULL; |
| |
| ! result = i = 0; |
| while (vim_iswhite(line[i])) /* leading white space is ignored */ |
| ++i; |
| |
| |
| *** 1668,1684 **** |
| if (!found_one) |
| break; |
| |
| /* Include any trailing white space. */ |
| while (vim_iswhite(line[i])) |
| ++i; |
| |
| /* If this comment doesn't nest, stop here. */ |
| got_com = TRUE; |
| if (vim_strchr(part_buf, COM_NEST) == NULL) |
| break; |
| } |
| |
| ! return (got_com ? i : 0); |
| } |
| #endif |
| |
| --- 1672,1838 ---- |
| if (!found_one) |
| break; |
| |
| + result = i; |
| + |
| /* Include any trailing white space. */ |
| while (vim_iswhite(line[i])) |
| ++i; |
| |
| + if (include_space) |
| + result = i; |
| + |
| /* If this comment doesn't nest, stop here. */ |
| got_com = TRUE; |
| if (vim_strchr(part_buf, COM_NEST) == NULL) |
| break; |
| } |
| + return result; |
| + } |
| + |
| + /* |
| + * Return the offset at which the last comment in line starts. If there is no |
| + * comment in the whole line, -1 is returned. |
| + * |
| + * When "flags" is not null, it is set to point to the flags describing the |
| + * recognized comment leader. |
| + */ |
| + int |
| + get_last_leader_offset(line, flags) |
| + char_u *line; |
| + char_u **flags; |
| + { |
| + int result = -1; |
| + int i, j; |
| + int lower_check_bound = 0; |
| + char_u *string; |
| + char_u *com_leader; |
| + char_u *com_flags; |
| + char_u *list; |
| + int found_one; |
| + char_u part_buf[COM_MAX_LEN]; /* buffer for one option part */ |
| + |
| + /* |
| + * Repeat to match several nested comment strings. |
| + */ |
| + i = (int)STRLEN(line); |
| + while (--i >= lower_check_bound) |
| + { |
| + /* |
| + * scan through the 'comments' option for a match |
| + */ |
| + found_one = FALSE; |
| + for (list = curbuf->b_p_com; *list; ) |
| + { |
| + char_u *flags_save = list; |
| + |
| + /* |
| + * Get one option part into part_buf[]. Advance list to next one. |
| + * put string at start of string. |
| + */ |
| + (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ","); |
| + string = vim_strchr(part_buf, ':'); |
| + if (string == NULL) /* If everything is fine, this cannot actually |
| + * happen. */ |
| + { |
| + continue; |
| + } |
| + *string++ = NUL; /* Isolate flags from string. */ |
| + com_leader = string; |
| + |
| + /* |
| + * Line contents and string must match. |
| + * When string starts with white space, must have some white space |
| + * (but the amount does not need to match, there might be a mix of |
| + * TABs and spaces). |
| + */ |
| + if (vim_iswhite(string[0])) |
| + { |
| + if (i == 0 || !vim_iswhite(line[i - 1])) |
| + continue; |
| + while (vim_iswhite(string[0])) |
| + ++string; |
| + } |
| + for (j = 0; string[j] != NUL && string[j] == line[i + j]; ++j) |
| + /* do nothing */; |
| + if (string[j] != NUL) |
| + continue; |
| + |
| + /* |
| + * When 'b' flag used, there must be white space or an |
| + * end-of-line after the string in the line. |
| + */ |
| + if (vim_strchr(part_buf, COM_BLANK) != NULL |
| + && !vim_iswhite(line[i + j]) && line[i + j] != NUL) |
| + { |
| + continue; |
| + } |
| + |
| + /* |
| + * We have found a match, stop searching. |
| + */ |
| + found_one = TRUE; |
| + |
| + if (flags) |
| + *flags = flags_save; |
| + com_flags = flags_save; |
| + |
| + break; |
| + } |
| |
| ! if (found_one) |
| ! { |
| ! char_u part_buf2[COM_MAX_LEN]; /* buffer for one option part */ |
| ! int len1, len2, off; |
| ! |
| ! result = i; |
| ! /* |
| ! * If this comment nests, continue searching. |
| ! */ |
| ! if (vim_strchr(part_buf, COM_NEST) != NULL) |
| ! continue; |
| ! |
| ! lower_check_bound = i; |
| ! |
| ! /* Let's verify whether the comment leader found is a substring |
| ! * of other comment leaders. If it is, let's adjust the |
| ! * lower_check_bound so that we make sure that we have determined |
| ! * the comment leader correctly. |
| ! */ |
| ! |
| ! while (vim_iswhite(*com_leader)) |
| ! ++com_leader; |
| ! len1 = (int)STRLEN(com_leader); |
| ! |
| ! for (list = curbuf->b_p_com; *list; ) |
| ! { |
| ! char_u *flags_save = list; |
| ! |
| ! (void)copy_option_part(&list, part_buf2, COM_MAX_LEN, ","); |
| ! if (flags_save == com_flags) |
| ! continue; |
| ! string = vim_strchr(part_buf2, ':'); |
| ! ++string; |
| ! while (vim_iswhite(*string)) |
| ! ++string; |
| ! len2 = (int)STRLEN(string); |
| ! if (len2 == 0) |
| ! continue; |
| ! |
| ! /* Now we have to verify whether string ends with a substring |
| ! * beginning the com_leader. */ |
| ! for (off = (len2 > i ? i : len2); off > 0 && off + len1 > len2;) |
| ! { |
| ! --off; |
| ! if (!STRNCMP(string + off, com_leader, len2 - off)) |
| ! { |
| ! if (i - off < lower_check_bound) |
| ! lower_check_bound = i - off; |
| ! } |
| ! } |
| ! } |
| ! } |
| ! } |
| ! return result; |
| } |
| #endif |
| |
| |
| |
| |
| *** 1968,1974 **** |
| beep_flush(); |
| else |
| { |
| ! (void)do_join(oap->line_count, oap->op_type == OP_JOIN, TRUE); |
| auto_format(FALSE, TRUE); |
| } |
| break; |
| --- 1968,1974 ---- |
| beep_flush(); |
| else |
| { |
| ! (void)do_join(oap->line_count, oap->op_type == OP_JOIN, TRUE, TRUE); |
| auto_format(FALSE, TRUE); |
| } |
| break; |
| |
| *** 4426,4432 **** |
| break; |
| } |
| #ifdef FEAT_COMMENTS |
| ! if (get_leader_len(ml_get_curline(), NULL, FALSE) > 0) |
| { |
| /* Ignore this line, continue at start of next line. */ |
| ++curwin->w_cursor.lnum; |
| --- 4426,4432 ---- |
| break; |
| } |
| #ifdef FEAT_COMMENTS |
| ! if (get_leader_len(ml_get_curline(), NULL, FALSE, TRUE) > 0) |
| { |
| /* Ignore this line, continue at start of next line. */ |
| ++curwin->w_cursor.lnum; |
| |
| *** 9324,9330 **** |
| { |
| prep_redo(cap->oap->regname, cap->count0, |
| NUL, cap->cmdchar, NUL, NUL, cap->nchar); |
| ! (void)do_join(cap->count0, cap->nchar == NUL, TRUE); |
| } |
| } |
| } |
| --- 9324,9330 ---- |
| { |
| prep_redo(cap->oap->regname, cap->count0, |
| NUL, cap->cmdchar, NUL, NUL, cap->nchar); |
| ! (void)do_join(cap->count0, cap->nchar == NUL, TRUE, TRUE); |
| } |
| } |
| } |
| |
| |
| |
| *** 112,117 **** |
| --- 112,120 ---- |
| # endif |
| #endif |
| static void dis_msg __ARGS((char_u *p, int skip_esc)); |
| + #if defined(FEAT_COMMENTS) || defined(PROTO) |
| + static char_u *skip_comment __ARGS((char_u *line, int process, int include_space, int *is_comment)); |
| + #endif |
| #ifdef FEAT_VISUAL |
| static void block_prep __ARGS((oparg_T *oap, struct block_def *, linenr_T, int)); |
| #endif |
| |
| *** 1987,1993 **** |
| curwin->w_cursor = curpos; /* restore curwin->w_cursor */ |
| } |
| if (curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) |
| ! (void)do_join(2, FALSE, FALSE); |
| } |
| } |
| |
| --- 1990,1996 ---- |
| curwin->w_cursor = curpos; /* restore curwin->w_cursor */ |
| } |
| if (curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) |
| ! (void)do_join(2, FALSE, FALSE, FALSE); |
| } |
| } |
| |
| |
| *** 4197,4213 **** |
| ui_breakcheck(); |
| } |
| |
| /* |
| * Join 'count' lines (minimal 2) at cursor position. |
| * When "save_undo" is TRUE save lines for undo first. |
| * |
| * return FAIL for failure, OK otherwise |
| */ |
| int |
| ! do_join(count, insert_space, save_undo) |
| long count; |
| int insert_space; |
| int save_undo; |
| { |
| char_u *curr = NULL; |
| char_u *curr_start = NULL; |
| --- 4200,4297 ---- |
| ui_breakcheck(); |
| } |
| |
| + #if defined(FEAT_COMMENTS) || defined(PROTO) |
| + /* |
| + * If "process" is TRUE and the line begins with a comment leader (possibly |
| + * after some white space), return a pointer to the text after it. Put a boolean |
| + * value indicating whether the line ends with an unclosed comment in |
| + * "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) |
| + char_u *line; |
| + int process; |
| + int include_space; |
| + int *is_comment; |
| + { |
| + char_u *comment_flags = NULL; |
| + int lead_len; |
| + int leader_offset = get_last_leader_offset(line, &comment_flags); |
| + |
| + *is_comment = FALSE; |
| + if (leader_offset != -1) |
| + { |
| + /* Let's check whether the line ends with an unclosed comment. |
| + * If the last comment leader has COM_END in flags, there's no comment. |
| + */ |
| + while (*comment_flags) |
| + { |
| + if (*comment_flags == COM_END |
| + || *comment_flags == ':') |
| + break; |
| + ++comment_flags; |
| + } |
| + if (*comment_flags != COM_END) |
| + *is_comment = TRUE; |
| + } |
| + |
| + if (process == FALSE) |
| + return line; |
| + |
| + lead_len = get_leader_len(line, &comment_flags, FALSE, include_space); |
| + |
| + if (lead_len == 0) |
| + return line; |
| + |
| + /* Find: |
| + * - COM_START, |
| + * - COM_END, |
| + * - colon, |
| + * whichever comes first. |
| + */ |
| + while (*comment_flags) |
| + { |
| + if (*comment_flags == COM_START |
| + || *comment_flags == COM_END |
| + || *comment_flags == ':') |
| + { |
| + break; |
| + } |
| + ++comment_flags; |
| + } |
| + |
| + /* If we found a colon, it means that we are not processing a line |
| + * starting with an opening or a closing part of a three-part |
| + * comment. That's good, because we don't want to remove those as |
| + * this would be annoying. |
| + */ |
| + if (*comment_flags == ':' || *comment_flags == NUL) |
| + line += lead_len; |
| + |
| + return line; |
| + } |
| + #endif |
| + |
| /* |
| * Join 'count' lines (minimal 2) at cursor position. |
| * When "save_undo" is TRUE save lines for undo first. |
| + * Set "use_formatoptions" to FALSE when e.g. processing |
| + * backspace and comment leaders should not be removed. |
| * |
| * return FAIL for failure, OK otherwise |
| */ |
| int |
| ! do_join(count, insert_space, save_undo, use_formatoptions) |
| long count; |
| int insert_space; |
| int save_undo; |
| + int use_formatoptions UNUSED; |
| { |
| char_u *curr = NULL; |
| char_u *curr_start = NULL; |
| |
| *** 4221,4226 **** |
| --- 4305,4317 ---- |
| linenr_T t; |
| colnr_T col = 0; |
| int ret = OK; |
| + #if defined(FEAT_COMMENTS) || defined(PROTO) |
| + int *comments; |
| + int remove_comments = (use_formatoptions == TRUE) |
| + && has_format_option(FO_REMOVE_COMS); |
| + int prev_was_comment; |
| + #endif |
| + |
| |
| if (save_undo && u_save((linenr_T)(curwin->w_cursor.lnum - 1), |
| (linenr_T)(curwin->w_cursor.lnum + count)) == FAIL) |
| |
| *** 4232,4237 **** |
| --- 4323,4339 ---- |
| spaces = lalloc_clear((long_u)count, TRUE); |
| if (spaces == NULL) |
| return FAIL; |
| + #if defined(FEAT_COMMENTS) || defined(PROTO) |
| + if (remove_comments) |
| + { |
| + comments = (int *)lalloc_clear((long_u)count * sizeof(int), TRUE); |
| + if (comments == NULL) |
| + { |
| + vim_free(spaces); |
| + return FAIL; |
| + } |
| + } |
| + #endif |
| |
| /* |
| * Don't move anything, just compute the final line length |
| |
| *** 4240,4245 **** |
| --- 4342,4366 ---- |
| for (t = 0; t < count; ++t) |
| { |
| curr = curr_start = ml_get((linenr_T)(curwin->w_cursor.lnum + t)); |
| + #if defined(FEAT_COMMENTS) || defined(PROTO) |
| + if (remove_comments) |
| + { |
| + /* We don't want to remove the comment leader if the |
| + * previous line is not a comment. */ |
| + if (t > 0 && prev_was_comment) |
| + { |
| + |
| + char_u *new_curr = skip_comment(curr, TRUE, insert_space, |
| + &prev_was_comment); |
| + comments[t] = new_curr - curr; |
| + curr = new_curr; |
| + } |
| + else |
| + curr = skip_comment(curr, FALSE, insert_space, |
| + &prev_was_comment); |
| + } |
| + #endif |
| + |
| if (insert_space && t > 0) |
| { |
| curr = skipwhite(curr); |
| |
| *** 4327,4332 **** |
| --- 4448,4457 ---- |
| if (t == 0) |
| break; |
| curr = curr_start = ml_get((linenr_T)(curwin->w_cursor.lnum + t - 1)); |
| + #if defined(FEAT_COMMENTS) || defined(PROTO) |
| + if (remove_comments) |
| + curr += comments[t - 1]; |
| + #endif |
| if (insert_space && t > 1) |
| curr = skipwhite(curr); |
| currsize = (int)STRLEN(curr); |
| |
| *** 4364,4369 **** |
| --- 4489,4498 ---- |
| |
| theend: |
| vim_free(spaces); |
| + #if defined(FEAT_COMMENTS) || defined(PROTO) |
| + if (remove_comments) |
| + vim_free(comments); |
| + #endif |
| return ret; |
| } |
| |
| |
| *** 4788,4794 **** |
| (long)-next_leader_len); |
| #endif |
| curwin->w_cursor.lnum--; |
| ! if (do_join(2, TRUE, FALSE) == FAIL) |
| { |
| beep_flush(); |
| break; |
| --- 4917,4923 ---- |
| (long)-next_leader_len); |
| #endif |
| curwin->w_cursor.lnum--; |
| ! if (do_join(2, TRUE, FALSE, FALSE) == FAIL) |
| { |
| beep_flush(); |
| break; |
| |
| *** 4844,4850 **** |
| |
| ptr = ml_get(lnum); |
| if (do_comments) |
| ! *leader_len = get_leader_len(ptr, leader_flags, FALSE); |
| else |
| *leader_len = 0; |
| |
| --- 4973,4979 ---- |
| |
| ptr = ml_get(lnum); |
| if (do_comments) |
| ! *leader_len = get_leader_len(ptr, leader_flags, FALSE, TRUE); |
| else |
| *leader_len = 0; |
| |
| |
| |
| |
| *** 104,113 **** |
| #define FO_ONE_LETTER '1' |
| #define FO_WHITE_PAR 'w' /* trailing white space continues paragr. */ |
| #define FO_AUTO 'a' /* automatic formatting */ |
| |
| #define DFLT_FO_VI "vt" |
| #define DFLT_FO_VIM "tcq" |
| ! #define FO_ALL "tcroq2vlb1mMBn,aw" /* for do_set() */ |
| |
| /* characters for the p_cpo option: */ |
| #define CPO_ALTREAD 'a' /* ":read" sets alternate file name */ |
| --- 104,114 ---- |
| #define FO_ONE_LETTER '1' |
| #define FO_WHITE_PAR 'w' /* trailing white space continues paragr. */ |
| #define FO_AUTO 'a' /* automatic formatting */ |
| + #define FO_REMOVE_COMS 'j' /* remove comment leaders when joining lines */ |
| |
| #define DFLT_FO_VI "vt" |
| #define DFLT_FO_VIM "tcq" |
| ! #define FO_ALL "tcroq2vlb1mMBn,awj" /* for do_set() */ |
| |
| /* characters for the p_cpo option: */ |
| #define CPO_ALTREAD 'a' /* ":read" sets alternate file name */ |
| |
| |
| |
| *** 6,12 **** |
| int set_indent __ARGS((int size, int flags)); |
| int get_number_indent __ARGS((linenr_T lnum)); |
| int open_line __ARGS((int dir, int flags, int old_indent)); |
| ! int get_leader_len __ARGS((char_u *line, char_u **flags, int backward)); |
| int plines __ARGS((linenr_T lnum)); |
| int plines_win __ARGS((win_T *wp, linenr_T lnum, int winheight)); |
| int plines_nofill __ARGS((linenr_T lnum)); |
| --- 6,13 ---- |
| int set_indent __ARGS((int size, int flags)); |
| int get_number_indent __ARGS((linenr_T lnum)); |
| int open_line __ARGS((int dir, int flags, int old_indent)); |
| ! int get_leader_len __ARGS((char_u *line, char_u **flags, int backward, int do_skip_space)); |
| ! int get_last_leader_offset __ARGS((char_u *line, char_u **flags)); |
| int plines __ARGS((linenr_T lnum)); |
| int plines_win __ARGS((win_T *wp, linenr_T lnum, int winheight)); |
| int plines_nofill __ARGS((linenr_T lnum)); |
| |
| |
| |
| *** 36,42 **** |
| int preprocs_left __ARGS((void)); |
| int get_register_name __ARGS((int num)); |
| void ex_display __ARGS((exarg_T *eap)); |
| ! int do_join __ARGS((long count, int insert_space, int save_undo)); |
| void op_format __ARGS((oparg_T *oap, int keep_cursor)); |
| void op_formatexpr __ARGS((oparg_T *oap)); |
| int fex_format __ARGS((linenr_T lnum, long count, int c)); |
| --- 36,42 ---- |
| int preprocs_left __ARGS((void)); |
| int get_register_name __ARGS((int num)); |
| void ex_display __ARGS((exarg_T *eap)); |
| ! int do_join __ARGS((long count, int insert_space, int save_undo, int use_formatoptions)); |
| void op_format __ARGS((oparg_T *oap, int keep_cursor)); |
| void op_formatexpr __ARGS((oparg_T *oap)); |
| int fex_format __ARGS((linenr_T lnum, long count, int c)); |
| |
| |
| |
| *** 1548,1554 **** |
| int len; |
| int stop = TRUE; |
| #ifdef FEAT_MBYTE |
| ! static char_u bytes[MB_MAXBYTES]; |
| static int bytelen = 1; /* >1 for multi-byte char */ |
| #endif |
| |
| --- 1548,1554 ---- |
| int len; |
| int stop = TRUE; |
| #ifdef FEAT_MBYTE |
| ! static char_u bytes[MB_MAXBYTES + 1]; |
| static int bytelen = 1; /* >1 for multi-byte char */ |
| #endif |
| |
| |
| *** 4901,4907 **** |
| #ifdef FEAT_COMMENTS |
| if ((*line != '#' || |
| STRNCMP(skipwhite(line + 1), "define", 6) != 0) |
| ! && get_leader_len(line, NULL, FALSE)) |
| matched = FALSE; |
| |
| /* |
| --- 4901,4907 ---- |
| #ifdef FEAT_COMMENTS |
| if ((*line != '#' || |
| STRNCMP(skipwhite(line + 1), "define", 6) != 0) |
| ! && get_leader_len(line, NULL, FALSE, TRUE)) |
| matched = FALSE; |
| |
| /* |
| |
| |
| |
| *** 4,19 **** |
| and with 'cpoptions' flag 'j' set or not |
| |
| STARTTEST |
| :set nocompatible viminfo+=nviminfo |
| :set nojoinspaces |
| :set cpoptions-=j |
| /firstline/ |
| ! j"tdGpJjJjJjJjJjJjJjJjJjJjJjJjJjJj05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p:set cpoptions+=j |
| j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p:set cpoptions-=j joinspaces |
| j"tpJjJjJjJjJjJjJjJjJjJjJjJjJjJj05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p:set cpoptions+=j |
| j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p:set cpoptions-=j nojoinspaces compatible |
| ! j"tpJjJjJjJjJjJjJjJjJjJjJjJjJjJj4Jy3l$pjdG:?firstline?+1,$w! test.out |
| ! :qa! |
| ENDTEST |
| |
| firstline |
| --- 4,20 ---- |
| and with 'cpoptions' flag 'j' set or not |
| |
| STARTTEST |
| + :so small.vim |
| :set nocompatible viminfo+=nviminfo |
| :set nojoinspaces |
| :set cpoptions-=j |
| /firstline/ |
| ! j"td/^STARTTEST/-1 |
| ! PJjJjJjJjJjJjJjJjJjJjJjJjJjJj05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p:set cpoptions+=j |
| j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p:set cpoptions-=j joinspaces |
| j"tpJjJjJjJjJjJjJjJjJjJjJjJjJjJj05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p:set cpoptions+=j |
| j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p:set cpoptions-=j nojoinspaces compatible |
| ! j"tpJjJjJjJjJjJjJjJjJjJjJjJjJjJj4Jy3l$pjd/STARTTEST/-2 |
| ENDTEST |
| |
| firstline |
| |
| *** 54,56 **** |
| --- 55,181 ---- |
| hjkl iop! |
| ert |
| |
| + STARTTEST |
| + /^{/+1 |
| + :set comments=s1:/*,mb:*,ex:*/,:// |
| + :set nojoinspaces fo=j |
| + :set backspace=eol,start |
| + :.,+3join |
| + j4J |
| + :.,+2join |
| + j3J |
| + :.,+2join |
| + j3J |
| + :.,+2join |
| + jj3J |
| + ENDTEST |
| + |
| + { |
| + |
| + /* |
| + * Make sure the previous comment leader is not removed. |
| + */ |
| + |
| + /* |
| + * Make sure the previous comment leader is not removed. |
| + */ |
| + |
| + // Should the next comment leader be left alone? |
| + // Yes. |
| + |
| + // Should the next comment leader be left alone? |
| + // Yes. |
| + |
| + /* Here the comment leader should be left intact. */ |
| + // And so should this one. |
| + |
| + /* Here the comment leader should be left intact. */ |
| + // And so should this one. |
| + |
| + if (condition) // Remove the next comment leader! |
| + // OK, I will. |
| + action(); |
| + |
| + if (condition) // Remove the next comment leader! |
| + // OK, I will. |
| + action(); |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set comments=s1:/*,mb:*,ex:*/,:// |
| + :set comments+=s1:>#,mb:#,ex:#<,:< |
| + :set cpoptions-=j joinspaces fo=j |
| + :set backspace=eol,start |
| + :.,+3join |
| + j4J |
| + :.,+2join |
| + j3J |
| + :.,+2join |
| + j3J |
| + :.,+2join |
| + jj3J |
| + j:.,+2join |
| + jj3J |
| + j:.,+5join |
| + j6J |
| + oSome code! |
| // Make sure backspacing does not remove this comment leader.0i |
| + ENDTEST |
| + |
| + { |
| + |
| + /* |
| + * Make sure the previous comment leader is not removed. |
| + */ |
| + |
| + /* |
| + * Make sure the previous comment leader is not removed. |
| + */ |
| + |
| + // Should the next comment leader be left alone? |
| + // Yes. |
| + |
| + // Should the next comment leader be left alone? |
| + // Yes. |
| + |
| + /* Here the comment leader should be left intact. */ |
| + // And so should this one. |
| + |
| + /* Here the comment leader should be left intact. */ |
| + // And so should this one. |
| + |
| + if (condition) // Remove the next comment leader! |
| + // OK, I will. |
| + action(); |
| + |
| + if (condition) // Remove the next comment leader! |
| + // OK, I will. |
| + action(); |
| + |
| + int i = 7 /* foo *// 3 |
| + // comment |
| + ; |
| + |
| + int i = 7 /* foo *// 3 |
| + // comment |
| + ; |
| + |
| + ># Note that the last character of the ending comment leader (left angle |
| + # bracket) is a comment leader itself. Make sure that this comment leader is |
| + # not removed from the next line #< |
| + < On this line a new comment is opened which spans 2 lines. This comment should |
| + < retain its comment leader. |
| + |
| + ># Note that the last character of the ending comment leader (left angle |
| + # bracket) is a comment leader itself. Make sure that this comment leader is |
| + # not removed from the next line #< |
| + < On this line a new comment is opened which spans 2 lines. This comment should |
| + < retain its comment leader. |
| + |
| + } |
| + |
| + STARTTEST |
| + :g/^STARTTEST/.,/^ENDTEST/d |
| + :?firstline?+1,$w! test.out |
| + :qa! |
| + ENDTEST |
| |
| |
| |
| *** 47,49 **** |
| --- 47,86 ---- |
| asdfasdf asdf |
| asdfasdf asdf |
| zx cvn. as dfg? hjkl iop! ert a |
| + |
| + |
| + { |
| + /* Make sure the previous comment leader is not removed. */ |
| + /* Make sure the previous comment leader is not removed. */ |
| + // Should the next comment leader be left alone? Yes. |
| + // Should the next comment leader be left alone? Yes. |
| + /* Here the comment leader should be left intact. */ // And so should this one. |
| + /* Here the comment leader should be left intact. */ // And so should this one. |
| + if (condition) // Remove the next comment leader! OK, I will. |
| + action(); |
| + if (condition) // Remove the next comment leader! OK, I will. |
| + action(); |
| + } |
| + |
| + |
| + { |
| + /* Make sure the previous comment leader is not removed. */ |
| + /* Make sure the previous comment leader is not removed. */ |
| + // Should the next comment leader be left alone? Yes. |
| + // Should the next comment leader be left alone? Yes. |
| + /* Here the comment leader should be left intact. */ // And so should this one. |
| + /* Here the comment leader should be left intact. */ // And so should this one. |
| + if (condition) // Remove the next comment leader! OK, I will. |
| + action(); |
| + if (condition) // Remove the next comment leader! OK, I will. |
| + action(); |
| + int i = 7 /* foo *// 3 // comment |
| + ; |
| + int i = 7 /* foo *// 3 // comment |
| + ; |
| + ># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader. |
| + ># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader. |
| + |
| + Some code!// Make sure backspacing does not remove this comment leader. |
| + } |
| + |
| |
| |
| |
| *** 716,717 **** |
| --- 716,719 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 541, |
| /**/ |
| |
| -- |
| I have a drinking problem -- I don't have a drink! |
| |
| /// 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 /// |