Mercurial > vim
changeset 22578:381bd66762ea v8.2.1837
patch 8.2.1837: using "gn" after "gN" does not work
Commit: https://github.com/vim/vim/commit/c07b7f701fb30d26112051e4ec737c7e3db72357
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Oct 11 20:44:15 2020 +0200
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 https://github.com/vim/vim/issues/7109)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 11 Oct 2020 20:45:03 +0200 |
parents | edd77da575f0 |
children | 837d354b2c0b |
files | src/search.c src/testdir/test_gn.vim src/version.c |
diffstat | 3 files changed, 38 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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;
--- 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, [