]> granicus.if.org Git - vim/commitdiff
patch 8.1.2330: vi' does not always work when 'selection' is exclusive v8.1.2330
authorBram Moolenaar <Bram@vim.org>
Thu, 21 Nov 2019 19:55:26 +0000 (20:55 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 21 Nov 2019 19:55:26 +0000 (20:55 +0100)
Problem:    vi' does not always work when 'selection' is exclusive.
Solution:   Adjust start position.

src/search.c
src/testdir/test_textobjects.vim
src/version.c

index f7c7eca38fcb5adb1107b721edbe31f13719d62d..59491166692f17f2b0b8a2201c61cfd4d0c92287 100644 (file)
@@ -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;
index 5702a6ad8ad012d0c4bcdb3423477543682b822f..042c5342185ad467e28c8b5b9a0d51a9ac51f531 100644 (file)
@@ -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
index 76e3f1b3ea438cb6347caa1cf445396cc0367ab2..41bd4cc6a428924ac2f069174e0c00886920049a 100644 (file)
@@ -737,6 +737,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2330,
 /**/
     2329,
 /**/