mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	patch 8.0.0622: selecting quoted text fails with 'selection' "exclusive"
Problem:    Using a text object to select quoted text fails when 'selection'
            is set to "exclusive". (Guraga)
Solution:   Swap cursor and visual start position. (Christian Brabandt,
            closes #1687)
			
			
This commit is contained in:
		
							
								
								
									
										15
									
								
								src/search.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								src/search.c
									
									
									
									
									
								
							| @@ -4364,7 +4364,7 @@ current_quote( | |||||||
|     int		selected_quote = FALSE;	/* Has quote inside selection */ |     int		selected_quote = FALSE;	/* Has quote inside selection */ | ||||||
|     int		i; |     int		i; | ||||||
|  |  | ||||||
|     /* Correct cursor when 'selection' is exclusive */ |     /* Correct cursor when 'selection' is "exclusive". */ | ||||||
|     if (VIsual_active) |     if (VIsual_active) | ||||||
|     { |     { | ||||||
| 	/* this only works within one line */ | 	/* this only works within one line */ | ||||||
| @@ -4372,8 +4372,19 @@ current_quote( | |||||||
| 	    return FALSE; | 	    return FALSE; | ||||||
|  |  | ||||||
| 	vis_bef_curs = LT_POS(VIsual, curwin->w_cursor); | 	vis_bef_curs = LT_POS(VIsual, curwin->w_cursor); | ||||||
| 	if (*p_sel == 'e' && vis_bef_curs) | 	if (*p_sel == 'e') | ||||||
|  | 	{ | ||||||
|  | 	    if (!vis_bef_curs) | ||||||
|  | 	    { | ||||||
|  | 		/* VIsual needs to be start of Visual selection. */ | ||||||
|  | 		pos_T t = curwin->w_cursor; | ||||||
|  |  | ||||||
|  | 		curwin->w_cursor = VIsual; | ||||||
|  | 		VIsual = t; | ||||||
|  | 		vis_bef_curs = TRUE; | ||||||
|  | 	    } | ||||||
| 	    dec_cursor(); | 	    dec_cursor(); | ||||||
|  | 	} | ||||||
| 	vis_empty = EQUAL_POS(VIsual, curwin->w_cursor); | 	vis_empty = EQUAL_POS(VIsual, curwin->w_cursor); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ if !has('textobjects') | |||||||
| endif | endif | ||||||
|  |  | ||||||
| set belloff=all | set belloff=all | ||||||
| function! CpoM(line, useM, expected) | func CpoM(line, useM, expected) | ||||||
|   new |   new | ||||||
|  |  | ||||||
|   if a:useM |   if a:useM | ||||||
| @@ -29,16 +29,26 @@ function! CpoM(line, useM, expected) | |||||||
|   call assert_equal(getreg('"'), a:expected[2]) |   call assert_equal(getreg('"'), a:expected[2]) | ||||||
|  |  | ||||||
|   q! |   q! | ||||||
| endfunction | endfunc | ||||||
|  |  | ||||||
| function! Test_inner_block_without_cpo_M() | func Test_inner_block_without_cpo_M() | ||||||
|   call CpoM('(red \(blue) green)', 0, ['red \(blue', 'red \(blue', '']) |   call CpoM('(red \(blue) green)', 0, ['red \(blue', 'red \(blue', '']) | ||||||
| endfunction | endfunc | ||||||
|  |  | ||||||
| function! Test_inner_block_with_cpo_M_left_backslash() | func Test_inner_block_with_cpo_M_left_backslash() | ||||||
|   call CpoM('(red \(blue) green)', 1, ['red \(blue) green', 'blue', 'red \(blue) green']) |   call CpoM('(red \(blue) green)', 1, ['red \(blue) green', 'blue', 'red \(blue) green']) | ||||||
| endfunction | endfunc | ||||||
|  |  | ||||||
| function! Test_inner_block_with_cpo_M_right_backslash() | func Test_inner_block_with_cpo_M_right_backslash() | ||||||
|   call CpoM('(red (blue\) green)', 1, ['red (blue\) green', 'blue\', 'red (blue\) green']) |   call CpoM('(red (blue\) green)', 1, ['red (blue\) green', 'blue\', 'red (blue\) green']) | ||||||
| endfunction | endfunc | ||||||
|  |  | ||||||
|  | func Test_quote_selection_selection_exclusive() | ||||||
|  |   new | ||||||
|  |   call setline(1, "a 'bcde' f") | ||||||
|  |   set selection=exclusive | ||||||
|  |   exe "norm! fdvhi'y" | ||||||
|  |   call assert_equal('bcde', @") | ||||||
|  |   set selection&vim | ||||||
|  |   bw! | ||||||
|  | endfunc | ||||||
|   | |||||||
| @@ -764,6 +764,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     622, | ||||||
| /**/ | /**/ | ||||||
|     621, |     621, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user