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
--- 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,