summaryrefslogtreecommitdiffstats
path: root/source/ap/vim/patches/7.3.541
diff options
context:
space:
mode:
Diffstat (limited to 'source/ap/vim/patches/7.3.541')
-rw-r--r--source/ap/vim/patches/7.3.5411090
1 files changed, 1090 insertions, 0 deletions
diff --git a/source/ap/vim/patches/7.3.541 b/source/ap/vim/patches/7.3.541
new file mode 100644
index 000000000..133b82dad
--- /dev/null
+++ b/source/ap/vim/patches/7.3.541
@@ -0,0 +1,1090 @@
+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
+
+
+*** ../vim-7.3.540/runtime/doc/change.txt 2011-05-05 14:26:37.000000000 +0200
+--- runtime/doc/change.txt 2012-06-06 13:05:04.000000000 +0200
+***************
+*** 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:
+*** ../vim-7.3.540/src/edit.c 2012-06-01 15:20:49.000000000 +0200
+--- src/edit.c 2012-06-06 13:00:29.000000000 +0200
+***************
+*** 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();
+ }
+*** ../vim-7.3.540/src/ex_docmd.c 2012-04-30 18:48:38.000000000 +0200
+--- src/ex_docmd.c 2012-06-06 13:00:29.000000000 +0200
+***************
+*** 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);
+ }
+*** ../vim-7.3.540/src/misc1.c 2012-06-01 15:20:49.000000000 +0200
+--- src/misc1.c 2012-06-06 13:27:32.000000000 +0200
+***************
+*** 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
+
+*** ../vim-7.3.540/src/normal.c 2012-05-25 13:12:33.000000000 +0200
+--- src/normal.c 2012-06-06 13:00:29.000000000 +0200
+***************
+*** 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);
+ }
+ }
+ }
+*** ../vim-7.3.540/src/ops.c 2012-05-18 12:49:33.000000000 +0200
+--- src/ops.c 2012-06-06 15:43:31.000000000 +0200
+***************
+*** 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;
+
+*** ../vim-7.3.540/src/option.h 2012-02-20 22:18:22.000000000 +0100
+--- src/option.h 2012-06-06 13:00:29.000000000 +0200
+***************
+*** 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 */
+*** ../vim-7.3.540/src/proto/misc1.pro 2010-08-15 21:57:28.000000000 +0200
+--- src/proto/misc1.pro 2012-06-06 13:00:29.000000000 +0200
+***************
+*** 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));
+*** ../vim-7.3.540/src/proto/ops.pro 2010-08-15 21:57:28.000000000 +0200
+--- src/proto/ops.pro 2012-06-06 13:00:29.000000000 +0200
+***************
+*** 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));
+*** ../vim-7.3.540/src/search.c 2012-02-04 23:34:57.000000000 +0100
+--- src/search.c 2012-06-06 13:00:29.000000000 +0200
+***************
+*** 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;
+
+ /*
+*** ../vim-7.3.540/src/testdir/test29.in 2010-08-15 21:57:29.000000000 +0200
+--- src/testdir/test29.in 2012-06-06 15:44:38.000000000 +0200
+***************
+*** 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
+*** ../vim-7.3.540/src/testdir/test29.ok 2010-08-15 21:57:29.000000000 +0200
+--- src/testdir/test29.ok 2012-06-06 13:00:29.000000000 +0200
+***************
+*** 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.
++ }
++
+*** ../vim-7.3.540/src/version.c 2012-06-06 12:06:10.000000000 +0200
+--- src/version.c 2012-06-06 16:10:03.000000000 +0200
+***************
+*** 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 ///