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 -- [email protected] -- 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    ///

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui