From 2c019c8696ca56d1a9d1bb10fd1411bad14df0c6 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 6 Oct 2013 17:46:56 +0200 Subject: 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. --- src/misc1.c | 22 +++++++++++++++------- src/ops.c | 18 ++++++++++++++++-- src/testdir/test68.in | 14 ++++++++++++++ src/testdir/test68.ok | 9 +++++++++ src/version.c | 2 ++ 5 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/misc1.c b/src/misc1.c index 0a2d83be0..2063d427e 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -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. diff --git a/src/ops.c b/src/ops.c index b1f75a1ea..91d3a4b0f 100644 --- 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) { diff --git a/src/testdir/test68.in b/src/testdir/test68.in index e79aed50d..ceaf9af1a 100644 --- a/src/testdir/test68.in +++ b/src/testdir/test68.in @@ -61,6 +61,20 @@ ENDTEST # 1 a } +STARTTEST +/^{/+3 +:set tw=5 fo=t2a si +i A_ +ENDTEST + +{ + + x a + b + c + +} + STARTTEST /^{/+1 :set tw=5 fo=qn comments=:# diff --git a/src/testdir/test68.ok b/src/testdir/test68.ok index 7ec93e635..b3726a0a2 100644 --- a/src/testdir/test68.ok +++ b/src/testdir/test68.ok @@ -42,6 +42,15 @@ a b } +{ + + x a + b_ + c + +} + + { # 1 a # b diff --git a/src/version.c b/src/version.c index 8b6ff662f..c6b464c74 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 52, /**/ 51, /**/ -- cgit v1.2.1