From c07b7f701fb30d26112051e4ec737c7e3db72357 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 11 Oct 2020 20:44:15 +0200 Subject: patch 8.2.1837: using "gn" after "gN" does not work Problem: Using "gn" after "gN" does not work. Solution: Extend the other end of the Visual area. (closes #7109) --- src/search.c | 23 ++++++++++++++++++++--- src/testdir/test_gn.vim | 16 ++++++++++++++++ src/version.c | 2 ++ 3 files changed, 38 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/search.c b/src/search.c index 45e4f9c1ab..349eae0352 100644 --- a/src/search.c +++ b/src/search.c @@ -2961,11 +2961,17 @@ current_search( int flags = 0; pos_T save_VIsual = VIsual; int zero_width; + int skip_first_backward; // Correct cursor when 'selection' is exclusive if (VIsual_active && *p_sel == 'e' && LT_POS(VIsual, curwin->w_cursor)) dec_cursor(); + // When searching forward and the cursor is at the start of the Visual + // area, skip the first search backward, otherwise it doesn't move. + skip_first_backward = forward && VIsual_active + && LT_POS(curwin->w_cursor, VIsual); + orig_pos = pos = curwin->w_cursor; if (VIsual_active) { @@ -2984,12 +2990,16 @@ current_search( /* * The trick is to first search backwards and then search forward again, * so that a match at the current cursor position will be correctly - * captured. + * captured. When "forward" is false do it the other way around. */ for (i = 0; i < 2; i++) { if (forward) + { + if (i == 0 && skip_first_backward) + continue; dir = i; + } else dir = !i; @@ -3043,10 +3053,17 @@ current_search( if (!VIsual_active) VIsual = start_pos; - // put cursor on last character of match + // put the cursor after the match curwin->w_cursor = end_pos; if (LT_POS(VIsual, end_pos) && forward) - dec_cursor(); + { + if (skip_first_backward) + // put the cursor on the start of the match + curwin->w_cursor = pos; + else + // put the cursor on last character of match + dec_cursor(); + } else if (VIsual_active && LT_POS(curwin->w_cursor, VIsual) && forward) curwin->w_cursor = pos; // put the cursor on the start of the match VIsual_active = TRUE; diff --git a/src/testdir/test_gn.vim b/src/testdir/test_gn.vim index a2a7ac3f0f..eb237a25c5 100644 --- a/src/testdir/test_gn.vim +++ b/src/testdir/test_gn.vim @@ -183,6 +183,22 @@ func Test_gN_repeat() bwipe! endfunc +func Test_gN_then_gn() + new + + call setline(1, 'this list is a list with a list of a last.') + /l.st + normal $gNgNgnx + call assert_equal('last', @") + + call setline(1, 'this list is a list with a lust of a last.') + /l.st + normal $gNgNgNgnx + call assert_equal('lust of a last', @") + + bwipe! +endfunc + func Test_gn_multi_line() new call setline(1, [ diff --git a/src/version.c b/src/version.c index 9f5dbb0cd8..035ab273dc 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1837, /**/ 1836, /**/ -- cgit v1.2.3