From 94d9f4fa65bce6f116cf89bfdabdf5a06509056f Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 21 Nov 2019 20:55:26 +0100 Subject: patch 8.1.2330: vi' does not always work when 'selection' is exclusive Problem: vi' does not always work when 'selection' is exclusive. Solution: Adjust start position. --- src/search.c | 27 ++++++++++++++++++++------- src/testdir/test_textobjects.vim | 7 +++++++ src/version.c | 2 ++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/search.c b/src/search.c index f7c7eca38f..5949116669 100644 --- a/src/search.c +++ b/src/search.c @@ -4412,8 +4412,8 @@ find_prev_quote( current_quote( oparg_T *oap, long count, - int include, /* TRUE == include quote char */ - int quotechar) /* Quote character */ + int include, // TRUE == include quote char + int quotechar) // Quote character { char_u *line = ml_get_curline(); int col_end; @@ -4421,12 +4421,15 @@ current_quote( int inclusive = FALSE; int vis_empty = TRUE; // Visual selection <= 1 char int vis_bef_curs = FALSE; // Visual starts before cursor + int did_exclusive_adj = FALSE; // adjusted pos for 'selection' int inside_quotes = FALSE; // Looks like "i'" done before int selected_quote = FALSE; // Has quote inside selection int i; int restore_vis_bef = FALSE; // restore VIsual on abort - /* Correct cursor when 'selection' is "exclusive". */ + // When 'selection' is "exclusive" move the cursor to where it would be + // with 'selection' "inclusive", so that the logic is the same for both. + // The cursor then is moved forward after adjusting the area. if (VIsual_active) { /* this only works within one line */ @@ -4437,6 +4440,17 @@ current_quote( vis_empty = EQUAL_POS(VIsual, curwin->w_cursor); if (*p_sel == 'e') { + if (vis_bef_curs) + { + dec_cursor(); + did_exclusive_adj = TRUE; + } + else if (!vis_empty) + { + dec(&VIsual); + did_exclusive_adj = TRUE; + } + vis_empty = EQUAL_POS(VIsual, curwin->w_cursor); if (!vis_bef_curs && !vis_empty) { // VIsual needs to be the start of Visual selection. @@ -4447,8 +4461,6 @@ current_quote( vis_bef_curs = TRUE; restore_vis_bef = TRUE; } - dec_cursor(); - vis_empty = EQUAL_POS(VIsual, curwin->w_cursor); } } @@ -4626,7 +4638,7 @@ current_quote( { if (vis_empty || vis_bef_curs) { - /* decrement cursor when 'selection' is not exclusive */ + // decrement cursor when 'selection' is not exclusive if (*p_sel != 'e') dec_cursor(); } @@ -4663,7 +4675,8 @@ current_quote( abort_search: if (VIsual_active && *p_sel == 'e') { - inc_cursor(); + if (did_exclusive_adj) + inc_cursor(); if (restore_vis_bef) { pos_T t = curwin->w_cursor; diff --git a/src/testdir/test_textobjects.vim b/src/testdir/test_textobjects.vim index 5702a6ad8a..042c534218 100644 --- a/src/testdir/test_textobjects.vim +++ b/src/testdir/test_textobjects.vim @@ -45,11 +45,18 @@ func Test_quote_selection_selection_exclusive() new call setline(1, "a 'bcde' f") set selection=exclusive + exe "norm! fdvhi'y" call assert_equal('bcde', @") + let @"='dummy' exe "norm! $gevi'y" call assert_equal('bcde', @") + + let @"='dummy' + exe "norm! 0fbhvi'y" + call assert_equal('bcde', @") + set selection&vim bw! endfunc diff --git a/src/version.c b/src/version.c index 76e3f1b3ea..41bd4cc6a4 100644 --- a/src/version.c +++ b/src/version.c @@ -737,6 +737,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2330, /**/ 2329, /**/ -- cgit v1.2.3