changeset 3632:7e3fedfc3d08 v7.3.576

updated for version 7.3.576 Problem: Formatting of lists inside comments is not right yet. Solution: Use another solution and add a test. (Tor Perkins)
author Bram Moolenaar <bram@vim.org>
date Fri, 29 Jun 2012 15:04:49 +0200
parents 7a4292517a68
children 79053041fb31
files src/edit.c src/misc1.c src/testdir/test68.in src/version.c
diffstat 4 files changed, 74 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- a/src/edit.c
+++ b/src/edit.c
@@ -6320,14 +6320,15 @@ internal_format(textwidth, second_indent
 	    if (!(flags & INSCHAR_COM_LIST))
 	    {
 		/*
-		 * This section is for numeric lists w/o comments.  If comment
-		 * indents are needed with numeric lists (formatoptions=nq),
-		 * then the INSCHAR_COM_LIST flag will cause the corresponding
-		 * OPENLINE_COM_LIST flag to be passed through to open_line()
-		 * (as seen above)...
+		 * This section is for auto-wrap of numeric lists.  When not
+		 * in insert mode (i.e. format_lines()), the INSCHAR_COM_LIST
+		 * flag will be set and open_line() will handle it (as seen
+		 * above).  The code here (and in get_number_indent()) will
+		 * recognize comments if needed...
 		 */
 		if (second_indent < 0 && has_format_option(FO_Q_NUMBER))
-		    second_indent = get_number_indent(curwin->w_cursor.lnum -1);
+		    second_indent =
+				 get_number_indent(curwin->w_cursor.lnum - 1);
 		if (second_indent >= 0)
 		{
 #ifdef FEAT_VREPLACE
@@ -6336,7 +6337,31 @@ internal_format(textwidth, second_indent
 							    FALSE, NUL, TRUE);
 		    else
 #endif
+#ifdef FEAT_COMMENTS
+			if (leader_len > 0 && second_indent - leader_len > 0)
+		    {
+			int i;
+			int padding = second_indent - leader_len;
+
+			/* We started at the first_line of a numbered list
+			 * that has a comment.  the open_line() function has
+			 * inserted the proper comment leader and positioned
+			 * the cursor at the end of the split line.  Now we
+			 * add the additional whitespace needed after the
+			 * comment leader for the numbered list.  */
+			for (i = 0; i < padding; i++)
+			{
+			    ins_str((char_u *)" ");
+			    changed_bytes(curwin->w_cursor.lnum, leader_len);
+			}
+		    }
+		    else
+		    {
+#endif
 			(void)set_indent(second_indent, SIN_CHANGED);
+#ifdef FEAT_COMMENTS
+		    }
+#endif
 		}
 	    }
 	    first_line = FALSE;
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -424,68 +424,35 @@ get_number_indent(lnum)
     colnr_T	col;
     pos_T	pos;
 
+    regmatch_T	regmatch;
+    int		lead_len = 0;	/* length of comment leader */
+
     if (lnum > curbuf->b_ml.ml_line_count)
 	return -1;
     pos.lnum = 0;
 
 #ifdef FEAT_COMMENTS
-    if (has_format_option(FO_Q_COMS) && has_format_option(FO_Q_NUMBER))
-    {
-	regmatch_T  regmatch;
-	int	    lead_len;	      /* length of comment leader */
-
+    /* In format_lines() (i.e. not insert mode), fo+=q is needed too...  */
+    if ((State & INSERT) || has_format_option(FO_Q_COMS))
 	lead_len = get_leader_len(ml_get(lnum), NULL, FALSE, TRUE);
-	regmatch.regprog = vim_regcomp(curbuf->b_p_flp, RE_MAGIC);
-	if (regmatch.regprog != NULL)
-	{
-	    regmatch.rm_ic = FALSE;
-
-	    /* vim_regexec() expects a pointer to a line.  This lets us
-	     * start matching for the flp beyond any comment leader...  */
-	    if (vim_regexec(&regmatch, ml_get(lnum) + lead_len, (colnr_T)0))
-	    {
-		pos.lnum = lnum;
-		pos.col = (colnr_T)(*regmatch.endp - ml_get(lnum));
+#endif
+    regmatch.regprog = vim_regcomp(curbuf->b_p_flp, RE_MAGIC);
+    if (regmatch.regprog != NULL)
+    {
+	regmatch.rm_ic = FALSE;
+
+	/* vim_regexec() expects a pointer to a line.  This lets us
+	 * start matching for the flp beyond any comment leader...  */
+	if (vim_regexec(&regmatch, ml_get(lnum) + lead_len, (colnr_T)0))
+	{
+	    pos.lnum = lnum;
+	    pos.col = (colnr_T)(*regmatch.endp - ml_get(lnum));
 #ifdef FEAT_VIRTUALEDIT
-		pos.coladd = 0;
-#endif
-	    }
-	}
-	vim_free(regmatch.regprog);
-    }
-    else
-    {
-	/*
-	 * What follows is the orig code that is not "comment aware"...
-	 *
-	 * I'm not sure if regmmatch_T (multi-match) is needed in this case.
-	 * It may be true that this section would work properly using the
-	 * regmatch_T code above, in which case, these two separate sections
-	 * should be consolidated w/ FEAT_COMMENTS making lead_len > 0...
-	 */
-#endif
-	regmmatch_T  regmatch;
-
-	regmatch.regprog = vim_regcomp(curbuf->b_p_flp, RE_MAGIC);
-
-	if (regmatch.regprog != NULL)
-	{
-	    regmatch.rmm_ic = FALSE;
-	    regmatch.rmm_maxcol = 0;
-	    if (vim_regexec_multi(&regmatch, curwin, curbuf,
-						      lnum, (colnr_T)0, NULL))
-	    {
-		pos.lnum = regmatch.endpos[0].lnum + lnum;
-		pos.col = regmatch.endpos[0].col;
-#ifdef FEAT_VIRTUALEDIT
-		pos.coladd = 0;
-#endif
-	    }
-	    vim_free(regmatch.regprog);
-	}
-#ifdef FEAT_COMMENTS
-    }
-#endif
+	    pos.coladd = 0;
+#endif
+	}
+    }
+    vim_free(regmatch.regprog);
 
     if (pos.lnum == 0 || *ml_get_pos(&pos) == NUL)
 	return -1;
--- a/src/testdir/test68.in
+++ b/src/testdir/test68.in
@@ -52,6 +52,17 @@ a b
 
 STARTTEST
 /^{/+1
+:set tw=5 fo=tcn comments=:#
+A bjA b
+ENDTEST
+
+{
+  1 a
+# 1 a
+}
+
+STARTTEST
+/^{/+1
 :set tw=5 fo=qn comments=:#
 gwap
 ENDTEST
@@ -83,6 +94,14 @@ ENDTEST
 }
 
 STARTTEST
+/^#/
+:setl tw=12 fo=tqnc comments=:#
+A foobar
+ENDTEST
+
+# 1 xxxxx
+
+STARTTEST
 :g/^STARTTEST/.,/^ENDTEST/d
 :1;/^Results/,$wq! test.out
 ENDTEST
--- a/src/version.c
+++ b/src/version.c
@@ -715,6 +715,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    576,
+/**/
     575,
 /**/
     574,