]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.052 v7.4.052
authorBram Moolenaar <Bram@vim.org>
Sun, 6 Oct 2013 15:46:56 +0000 (17:46 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 6 Oct 2013 15:46:56 +0000 (17:46 +0200)
Problem:    With 'fo' set to "a2" inserting a space in the first column may
            cause the cursor to jump to the previous line.
Solution:   Handle the case when there is no comment leader properly. (Tor
            Perkins)  Also fix that cursor is in the wrong place when spaces
            get replaced with a Tab.

src/misc1.c
src/ops.c
src/testdir/test68.in
src/testdir/test68.ok
src/version.c

index 0a2d83be03a38a9a880c25f6c70b580f89cb4f80..2063d427e321fa5999aae1d5bdc178cd9b193b49 100644 (file)
@@ -303,10 +303,18 @@ set_indent(size, flags)
        ml_replace(curwin->w_cursor.lnum, newline, FALSE);
        if (flags & SIN_CHANGED)
            changed_bytes(curwin->w_cursor.lnum, 0);
-       /* Correct saved cursor position if it's after the indent. */
-       if (saved_cursor.lnum == curwin->w_cursor.lnum
-                               && saved_cursor.col >= (colnr_T)(p - oldline))
-           saved_cursor.col += ind_len - (colnr_T)(p - oldline);
+       /* Correct saved cursor position if it is in this line. */
+       if (saved_cursor.lnum == curwin->w_cursor.lnum)
+       {
+           if (saved_cursor.col >= (colnr_T)(p - oldline))
+               /* cursor was after the indent, adjust for the number of
+                * bytes added/removed */
+               saved_cursor.col += ind_len - (colnr_T)(p - oldline);
+           else if (saved_cursor.col >= (colnr_T)(s - newline))
+               /* cursor was in the indent, and is now after it, put it back
+                * at the start of the indent (replacing spaces with TAB) */
+               saved_cursor.col = (colnr_T)(s - newline);
+       }
        retval = TRUE;
     }
     else
@@ -1581,9 +1589,9 @@ theend:
 
 #if defined(FEAT_COMMENTS) || defined(PROTO)
 /*
- * get_leader_len() returns the length of the prefix of the given string
- * which introduces a comment. If this string is not a comment then 0 is
- * returned.
+ * get_leader_len() returns the length in bytes of the prefix of the given
+ * string which introduces a comment.  If this string is not a comment then
+ * 0 is returned.
  * 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.
index b1f75a1eab6c0f2bd236acdee0cac6d8c171cd78..91d3a4b0ff32900111bc83283b2e55f81b5a68d3 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -4989,7 +4989,7 @@ format_lines(line_count, avoid_fex)
 
            /*
             * When still in same paragraph, join the lines together.  But
-            * first delete the comment leader from the second line.
+            * first delete the leader from the second line.
             */
            if (!is_end_par)
            {
@@ -4999,11 +4999,25 @@ format_lines(line_count, avoid_fex)
                if (line_count < 0 && u_save_cursor() == FAIL)
                    break;
 #ifdef FEAT_COMMENTS
-               (void)del_bytes((long)next_leader_len, FALSE, FALSE);
                if (next_leader_len > 0)
+               {
+                   (void)del_bytes((long)next_leader_len, FALSE, FALSE);
                    mark_col_adjust(curwin->w_cursor.lnum, (colnr_T)0, 0L,
                                                      (long)-next_leader_len);
+               } else
 #endif
+                   if (second_indent > 0)  /* the "leader" for FO_Q_SECOND */
+               {
+                   char_u *p = ml_get_curline();
+                   int indent = skipwhite(p) - p;
+
+                   if (indent > 0)
+                   {
+                       (void)del_bytes(indent, FALSE, FALSE);
+                       mark_col_adjust(curwin->w_cursor.lnum,
+                                              (colnr_T)0, 0L, (long)-indent);
+                     }
+               }
                curwin->w_cursor.lnum--;
                if (do_join(2, TRUE, FALSE, FALSE) == FAIL)
                {
index e79aed50d02fda603f7a7d1e15b755d16bbd131f..ceaf9af1ab600a4023af786c94ab9f4380e9ea44 100644 (file)
@@ -61,6 +61,20 @@ ENDTEST
 # 1 a
 }
 
+STARTTEST
+/^{/+3
+:set tw=5 fo=t2a si
+i  \eA_\e
+ENDTEST
+
+{
+
+  x a
+  b
+ c
+
+}
+
 STARTTEST
 /^{/+1
 :set tw=5 fo=qn comments=:#
index 7ec93e6358a70bdfaade7025d0e63cf97b945a5f..b3726a0a27ce1c71a964711031cc4ee71b2db8c6 100644 (file)
@@ -42,6 +42,15 @@ a b
 }
 
 
+{
+
+  x a
+    b_
+    c
+
+}
+
+
 {
 # 1 a
 #   b
index 8b6ff662fc17337a685436f33a0d7eeb2d63a465..c6b464c74645dcb0c511e69704e3f426263bc295 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    52,
 /**/
     51,
 /**/