Mercurial > vim
changeset 18677:953e83e09e78 v8.1.2330
patch 8.1.2330: vi' does not always work when 'selection' is exclusive
Commit: https://github.com/vim/vim/commit/94d9f4fa65bce6f116cf89bfdabdf5a06509056f
Author: Bram Moolenaar <Bram@vim.org>
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 21 Nov 2019 21:00:04 +0100 |
parents | fc5d1a4c149c |
children | cb4a4b71df4a |
files | src/search.c src/testdir/test_textobjects.vim src/version.c |
diffstat | 3 files changed, 29 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- 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;
--- 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