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 /src/search.c | |
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.
Diffstat (limited to 'src/search.c')
-rw-r--r-- | src/search.c | 27 |
1 files changed, 20 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; |