# HG changeset patch # User Bram Moolenaar # Date 1574366404 -3600 # Node ID 953e83e09e7847b87f1538e82e505b37ae73af1b # Parent fc5d1a4c149cd33fbe1e823c342a774f94b161d9 patch 8.1.2330: vi' does not always work when 'selection' is exclusive Commit: https://github.com/vim/vim/commit/94d9f4fa65bce6f116cf89bfdabdf5a06509056f Author: Bram Moolenaar Date: Thu Nov 21 20:55:26 2019 +0100 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. diff --git a/src/search.c b/src/search.c --- 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 --- a/src/testdir/test_textobjects.vim +++ b/src/testdir/test_textobjects.vim @@ -45,11 +45,18 @@ func Test_quote_selection_selection_excl 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 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2330, +/**/ 2329, /**/ 2328,