]> granicus.if.org Git - vim/commitdiff
patch 8.2.1837: using "gn" after "gN" does not work v8.2.1837
authorBram Moolenaar <Bram@vim.org>
Sun, 11 Oct 2020 18:44:15 +0000 (20:44 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 11 Oct 2020 18:44:15 +0000 (20:44 +0200)
Problem:    Using "gn" after "gN" does not work.
Solution:   Extend the other end of the Visual area. (closes #7109)

src/search.c
src/testdir/test_gn.vim
src/version.c

index 45e4f9c1abe4c32d4cc7dc24a8ba660f832869bc..349eae0352ded981504a39525244a2ffc7b88efa 100644 (file)
@@ -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;
index a2a7ac3f0f6b3f008a2e5fff1843fa9c79357601..eb237a25c594a293a33f1b2c2978a7f8093755ed 100644 (file)
@@ -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, [
index 9f5dbb0cd87e530cc49f8689f7b79dc9516d438b..035ab273dcf39053c30b7365c100bd32cacd6ca6 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1837,
 /**/
     1836,
 /**/