]> granicus.if.org Git - vim/commitdiff
patch 8.0.0453: adding fold marker creates new comment v8.0.0453
authorBram Moolenaar <Bram@vim.org>
Sun, 12 Mar 2017 19:37:21 +0000 (20:37 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 12 Mar 2017 19:37:21 +0000 (20:37 +0100)
Problem:    Adding fold marker creates new comment.
Solution:   Use an existing comment if possible. (LemonBoy, closes #1549)

src/fold.c
src/ops.c
src/proto/ops.pro
src/testdir/test_fold.vim
src/version.c

index a186bef4d77fe0823f40aba559fef9a9d6e0d2e2..826ad5c8dcf3542c3826817e4fbccfc40cad571b 100644 (file)
@@ -1760,6 +1760,7 @@ foldAddMarker(linenr_T lnum, char_u *marker, int markerlen)
     int                line_len;
     char_u     *newline;
     char_u     *p = (char_u *)strstr((char *)curbuf->b_p_cms, "%s");
+    int                line_is_comment = FALSE;
 
     /* Allocate a new line: old-line + 'cms'-start + marker + 'cms'-end */
     line = ml_get(lnum);
@@ -1767,11 +1768,16 @@ foldAddMarker(linenr_T lnum, char_u *marker, int markerlen)
 
     if (u_save(lnum - 1, lnum + 1) == OK)
     {
+#if defined(FEAT_COMMENTS)
+       /* Check if the line ends with an unclosed comment */
+       (void)skip_comment(line, FALSE, FALSE, &line_is_comment);
+#endif
        newline = alloc((unsigned)(line_len + markerlen + STRLEN(cms) + 1));
        if (newline == NULL)
            return;
        STRCPY(newline, line);
-       if (p == NULL)
+       /* Append the marker to the end of the line */
+       if (p == NULL || line_is_comment)
            vim_strncpy(newline + line_len, marker, markerlen);
        else
        {
index 053aeca9111754cfa90f4038c32dec3a9ba79c6f..d3e97f07f01c99ea0d01524db358d3df03386faa 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -113,9 +113,6 @@ static void copy_yank_reg(yankreg_T *reg);
 static void    may_set_selection(void);
 #endif
 static void    dis_msg(char_u *p, int skip_esc);
-#if defined(FEAT_COMMENTS) || defined(PROTO)
-static char_u  *skip_comment(char_u *line, int process, int include_space, int *is_comment);
-#endif
 static void    block_prep(oparg_T *oap, struct block_def *, linenr_T, int);
 static int     do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1);
 #if defined(FEAT_CLIPBOARD) || defined(FEAT_EVAL)
@@ -4301,7 +4298,7 @@ dis_msg(
  * is_comment - will indicate whether the current line ends with an unclosed
  *             comment.
  */
-    static char_u *
+    char_u *
 skip_comment(
     char_u   *line,
     int      process,
index ef044e7abad27900959ec0e8cc8ebe36169bb574..0740ddad3db95b10c76058f686891852d4b5b117 100644 (file)
@@ -38,6 +38,7 @@ void adjust_cursor_eol(void);
 int preprocs_left(void);
 int get_register_name(int num);
 void ex_display(exarg_T *eap);
+char_u *skip_comment(char_u *line, int process, int include_space, int *is_comment);
 int do_join(long count, int insert_space, int save_undo, int use_formatoptions, int setmark);
 void op_format(oparg_T *oap, int keep_cursor);
 void op_formatexpr(oparg_T *oap);
index 3c27f4f70099bb3f239a08a8f4fe86b7cad9a4a1..f10480bb4fd903708b00bd0d5aeb2f442583d173 100644 (file)
@@ -168,6 +168,22 @@ func Test_combining_folds_marker()
   bwipe!
 endfunc
 
+func Test_folds_marker_in_comment()
+  new
+  call setline(1, ['" foo', 'bar', 'baz'])
+  setl fen fdm=marker
+  setl com=sO:\"\ -,mO:\"\ \ ,eO:\"\",:\" cms=\"%s
+  norm! zf2j
+  setl nofen
+  :1y
+  call assert_equal(['" foo{{{'], getreg(0,1,1))
+  :+2y
+  call assert_equal(['baz"}}}'], getreg(0,1,1))
+
+  set foldmethod&
+  bwipe!
+endfunc
+
 func s:TestFoldExpr(lnum)
   let thisline = getline(a:lnum)
   if thisline == 'a'
index 1574f9cbdf7f74daecc2282026f57adb2832f6d7..28c929429c8aef19bcb084712498c52175778e6c 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    453,
 /**/
     452,
 /**/