updated for version 7.4.052
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.
diff --git a/src/misc1.c b/src/misc1.c
index 0a2d83b..2063d42 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -303,10 +303,18 @@
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 @@
#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.
diff --git a/src/ops.c b/src/ops.c
index b1f75a1..91d3a4b 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -4989,7 +4989,7 @@
/*
* 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 @@
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)
{
diff --git a/src/testdir/test68.in b/src/testdir/test68.in
index e79aed5..ceaf9af 100644
--- a/src/testdir/test68.in
+++ b/src/testdir/test68.in
@@ -62,6 +62,20 @@
}
STARTTEST
+/^{/+3
+:set tw=5 fo=t2a si
+i A_
+ENDTEST
+
+{
+
+ x a
+ b
+ c
+
+}
+
+STARTTEST
/^{/+1
:set tw=5 fo=qn comments=:#
gwap
diff --git a/src/testdir/test68.ok b/src/testdir/test68.ok
index 7ec93e6..b3726a0 100644
--- a/src/testdir/test68.ok
+++ b/src/testdir/test68.ok
@@ -43,6 +43,15 @@
{
+
+ x a
+ b_
+ c
+
+}
+
+
+{
# 1 a
# b
}
diff --git a/src/version.c b/src/version.c
index 8b6ff66..c6b464c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 52,
+/**/
51,
/**/
50,