summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-03-12 20:37:21 +0100
committerBram Moolenaar <Bram@vim.org>2017-03-12 20:37:21 +0100
commit025a6b708a9bff54c73fb9c641b980da19e943a9 (patch)
tree9d1534b7d2637c7ef6c851a158c2eb99becefbfd
parent1c46544412382db8b3203d6c78e550df885540bd (diff)
downloadvim-025a6b708a9bff54c73fb9c641b980da19e943a9.zip
patch 8.0.0453: adding fold marker creates new comment
Problem: Adding fold marker creates new comment. Solution: Use an existing comment if possible. (LemonBoy, closes #1549)
-rw-r--r--src/fold.c8
-rw-r--r--src/ops.c5
-rw-r--r--src/proto/ops.pro1
-rw-r--r--src/testdir/test_fold.vim16
-rw-r--r--src/version.c2
5 files changed, 27 insertions, 5 deletions
diff --git a/src/fold.c b/src/fold.c
index a186bef4d..826ad5c8d 100644
--- a/src/fold.c
+++ b/src/fold.c
@@ -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
{
diff --git a/src/ops.c b/src/ops.c
index 053aeca91..d3e97f07f 100644
--- 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,
diff --git a/src/proto/ops.pro b/src/proto/ops.pro
index ef044e7ab..0740ddad3 100644
--- a/src/proto/ops.pro
+++ b/src/proto/ops.pro
@@ -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);
diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim
index 3c27f4f70..f10480bb4 100644
--- a/src/testdir/test_fold.vim
+++ b/src/testdir/test_fold.vim
@@ -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'
diff --git a/src/version.c b/src/version.c
index 1574f9cbd..28c929429 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 453,
+/**/
452,
/**/
451,