diff src/search.c @ 15930:e580c9d75443 v8.1.0971

patch 8.1.0971: failure for selecting quoted text object moves cursor commit https://github.com/vim/vim/commit/55d3bdbbe2bfc7a78b4aa17763788dbddf87cab0 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Feb 22 15:04:17 2019 +0100 patch 8.1.0971: failure for selecting quoted text object moves cursor Problem: Failure for selecting quoted text object moves cursor. Solution: Restore the Visual selection on failure. (Christian Brabandt, closes #4024)
author Bram Moolenaar <Bram@vim.org>
date Fri, 22 Feb 2019 15:15:05 +0100
parents 7fad90423bd2
children ced614446eaa
line wrap: on
line diff
--- a/src/search.c
+++ b/src/search.c
@@ -4359,11 +4359,12 @@ current_quote(
     int		col_end;
     int		col_start = curwin->w_cursor.col;
     int		inclusive = FALSE;
-    int		vis_empty = TRUE;	/* Visual selection <= 1 char */
-    int		vis_bef_curs = FALSE;	/* Visual starts before cursor */
-    int		inside_quotes = FALSE;	/* Looks like "i'" done before */
-    int		selected_quote = FALSE;	/* Has quote inside selection */
+    int		vis_empty = TRUE;	// Visual selection <= 1 char
+    int		vis_bef_curs = FALSE;	// Visual starts before cursor
+    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". */
     if (VIsual_active)
@@ -4377,12 +4378,13 @@ current_quote(
 	{
 	    if (!vis_bef_curs)
 	    {
-		/* VIsual needs to be start of Visual selection. */
+		// VIsual needs to be the start of Visual selection.
 		pos_T t = curwin->w_cursor;
 
 		curwin->w_cursor = VIsual;
 		VIsual = t;
 		vis_bef_curs = TRUE;
+		restore_vis_bef = TRUE;
 	    }
 	    dec_cursor();
 	}
@@ -4431,7 +4433,7 @@ current_quote(
 	     * opening quote. */
 	    col_start = find_next_quote(line, col_start + 1, quotechar, NULL);
 	    if (col_start < 0)
-		return FALSE;
+		goto abort_search;
 	    col_end = find_next_quote(line, col_start + 1, quotechar,
 							      curbuf->b_p_qe);
 	    if (col_end < 0)
@@ -4445,7 +4447,7 @@ current_quote(
 	{
 	    col_end = find_prev_quote(line, col_start, quotechar, NULL);
 	    if (line[col_end] != quotechar)
-		return FALSE;
+		goto abort_search;
 	    col_start = find_prev_quote(line, col_end, quotechar,
 							      curbuf->b_p_qe);
 	    if (line[col_start] != quotechar)
@@ -4480,12 +4482,12 @@ current_quote(
 	    /* Find open quote character. */
 	    col_start = find_next_quote(line, col_start, quotechar, NULL);
 	    if (col_start < 0 || col_start > first_col)
-		return FALSE;
+		goto abort_search;
 	    /* Find close quote character. */
 	    col_end = find_next_quote(line, col_start + 1, quotechar,
 							      curbuf->b_p_qe);
 	    if (col_end < 0)
-		return FALSE;
+		goto abort_search;
 	    /* If is cursor between start and end quote character, it is
 	     * target text object. */
 	    if (col_start <= first_col && first_col <= col_end)
@@ -4502,14 +4504,14 @@ current_quote(
 	    /* No quote before the cursor, look after the cursor. */
 	    col_start = find_next_quote(line, col_start, quotechar, NULL);
 	    if (col_start < 0)
-		return FALSE;
+		goto abort_search;
 	}
 
 	/* Find close quote character. */
 	col_end = find_next_quote(line, col_start + 1, quotechar,
 							      curbuf->b_p_qe);
 	if (col_end < 0)
-	    return FALSE;
+	    goto abort_search;
     }
 
     /* When "include" is TRUE, include spaces after closing quote or before
@@ -4596,6 +4598,20 @@ current_quote(
     }
 
     return OK;
+
+abort_search:
+    if (VIsual_active && *p_sel == 'e')
+    {
+	inc_cursor();
+	if (restore_vis_bef)
+	{
+	    pos_T t = curwin->w_cursor;
+
+	    curwin->w_cursor = VIsual;
+	    VIsual = t;
+	}
+    }
+    return FALSE;
 }
 
 #endif /* FEAT_TEXTOBJ */