summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-10-11 20:44:15 +0200
committerBram Moolenaar <Bram@vim.org>2020-10-11 20:44:15 +0200
commitc07b7f701fb30d26112051e4ec737c7e3db72357 (patch)
tree03f08a9ee105be8c855e5c3c97b42e1c9d6fac6d /src
parent62cd26a2294b7a5eead7c145e9bbc7c75f3bb801 (diff)
patch 8.2.1837: using "gn" after "gN" does not workv8.2.1837
Problem: Using "gn" after "gN" does not work. Solution: Extend the other end of the Visual area. (closes #7109)
Diffstat (limited to 'src')
-rw-r--r--src/search.c23
-rw-r--r--src/testdir/test_gn.vim16
-rw-r--r--src/version.c2
3 files changed, 38 insertions, 3 deletions
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
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1837,
+/**/
1836,
/**/
1835,