diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-11-21 20:55:26 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-11-21 20:55:26 +0100 |
commit | 94d9f4fa65bce6f116cf89bfdabdf5a06509056f (patch) | |
tree | c71357635f104aa77f3aa70772a729195c82b4ba | |
parent | 44f0bd878ab6525eb50f2e05a13c0854164cdec2 (diff) | |
download | vim-git-94d9f4fa65bce6f116cf89bfdabdf5a06509056f.tar.gz |
patch 8.1.2330: vi' does not always work when 'selection' is exclusivev8.1.2330
Problem: vi' does not always work when 'selection' is exclusive.
Solution: Adjust start position.
-rw-r--r-- | src/search.c | 27 | ||||
-rw-r--r-- | src/testdir/test_textobjects.vim | 7 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 29 insertions, 7 deletions
diff --git a/src/search.c b/src/search.c index f7c7eca38..594911666 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 5702a6ad8..042c53421 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 76e3f1b3e..41bd4cc6a 100644 --- 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, |