mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	patch 9.1.1136: Match highlighting marks a buffer region as changed
Problem:  Match highlighting marks a buffer region to be redrawn as if
          its buffer text was changed, unnecessarily invoking syntax code.
Solution: Set the `w_redraw_top/bot` variables instead of the b_mod_* ones
          (Luuk van Baal)
closes: #16697
Signed-off-by: Luuk van Baal <luukvbaal@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
			
			
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							bf595ae4ac
						
					
				
				
					commit
					7bbb0f357e
				
			| @@ -3365,9 +3365,21 @@ redrawWinline( | |||||||
|     win_T	*wp, |     win_T	*wp, | ||||||
|     linenr_T	lnum) |     linenr_T	lnum) | ||||||
| { | { | ||||||
|     if (wp->w_redraw_top == 0 || wp->w_redraw_top > lnum) |     redraw_win_range_later(wp, lnum, lnum); | ||||||
| 	wp->w_redraw_top = lnum; | } | ||||||
|     if (wp->w_redraw_bot == 0 || wp->w_redraw_bot < lnum) |  | ||||||
| 	wp->w_redraw_bot = lnum; |     void | ||||||
|     redraw_win_later(wp, UPD_VALID); | redraw_win_range_later( | ||||||
|  |     win_T	*wp, | ||||||
|  |     linenr_T	first, | ||||||
|  |     linenr_T	last) | ||||||
|  | { | ||||||
|  |     if (last >= wp->w_topline && first < wp->w_botline) | ||||||
|  |     { | ||||||
|  | 	if (wp->w_redraw_top == 0 || wp->w_redraw_top > first) | ||||||
|  | 	    wp->w_redraw_top = first; | ||||||
|  | 	if (wp->w_redraw_bot == 0 || wp->w_redraw_bot < last) | ||||||
|  | 	    wp->w_redraw_bot = last; | ||||||
|  | 	redraw_win_later(wp, UPD_VALID); | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2384,12 +2384,7 @@ foldUpdateIEMS(win_T *wp, linenr_T top, linenr_T bot) | |||||||
|     // this in other situations, the changed lines will be redrawn anyway and |     // this in other situations, the changed lines will be redrawn anyway and | ||||||
|     // this method can cause the whole window to be updated. |     // this method can cause the whole window to be updated. | ||||||
|     if (end != bot) |     if (end != bot) | ||||||
|     { | 	redraw_win_range_later(wp, top, end); | ||||||
| 	if (wp->w_redraw_top == 0 || wp->w_redraw_top > top) |  | ||||||
| 	    wp->w_redraw_top = top; |  | ||||||
| 	if (wp->w_redraw_bot < end) |  | ||||||
| 	    wp->w_redraw_bot = end; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     invalid_top = (linenr_T)0; |     invalid_top = (linenr_T)0; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								src/match.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								src/match.c
									
									
									
									
									
								
							| @@ -187,20 +187,7 @@ match_add( | |||||||
| 	// Calculate top and bottom lines for redrawing area | 	// Calculate top and bottom lines for redrawing area | ||||||
| 	if (toplnum != 0) | 	if (toplnum != 0) | ||||||
| 	{ | 	{ | ||||||
| 	    if (wp->w_buffer->b_mod_set) | 	    redraw_win_range_later(wp, toplnum, botlnum); | ||||||
| 	    { |  | ||||||
| 		if (wp->w_buffer->b_mod_top > toplnum) |  | ||||||
| 		    wp->w_buffer->b_mod_top = toplnum; |  | ||||||
| 		if (wp->w_buffer->b_mod_bot < botlnum) |  | ||||||
| 		    wp->w_buffer->b_mod_bot = botlnum; |  | ||||||
| 	    } |  | ||||||
| 	    else |  | ||||||
| 	    { |  | ||||||
| 		wp->w_buffer->b_mod_set = TRUE; |  | ||||||
| 		wp->w_buffer->b_mod_top = toplnum; |  | ||||||
| 		wp->w_buffer->b_mod_bot = botlnum; |  | ||||||
| 		wp->w_buffer->b_mod_xlines = 0; |  | ||||||
| 	    } |  | ||||||
| 	    m->mit_toplnum = toplnum; | 	    m->mit_toplnum = toplnum; | ||||||
| 	    m->mit_botlnum = botlnum; | 	    m->mit_botlnum = botlnum; | ||||||
| 	    rtype = UPD_VALID; | 	    rtype = UPD_VALID; | ||||||
| @@ -269,20 +256,7 @@ match_delete(win_T *wp, int id, int perr) | |||||||
|     vim_free(cur->mit_pattern); |     vim_free(cur->mit_pattern); | ||||||
|     if (cur->mit_toplnum != 0) |     if (cur->mit_toplnum != 0) | ||||||
|     { |     { | ||||||
| 	if (wp->w_buffer->b_mod_set) | 	redraw_win_range_later(wp, cur->mit_toplnum, cur->mit_botlnum); | ||||||
| 	{ |  | ||||||
| 	    if (wp->w_buffer->b_mod_top > cur->mit_toplnum) |  | ||||||
| 		wp->w_buffer->b_mod_top = cur->mit_toplnum; |  | ||||||
| 	    if (wp->w_buffer->b_mod_bot < cur->mit_botlnum) |  | ||||||
| 		wp->w_buffer->b_mod_bot = cur->mit_botlnum; |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 	    wp->w_buffer->b_mod_set = TRUE; |  | ||||||
| 	    wp->w_buffer->b_mod_top = cur->mit_toplnum; |  | ||||||
| 	    wp->w_buffer->b_mod_bot = cur->mit_botlnum; |  | ||||||
| 	    wp->w_buffer->b_mod_xlines = 0; |  | ||||||
| 	} |  | ||||||
| 	rtype = UPD_VALID; | 	rtype = UPD_VALID; | ||||||
|     } |     } | ||||||
|     vim_free(cur->mit_pos_array); |     vim_free(cur->mit_pos_array); | ||||||
|   | |||||||
| @@ -24,4 +24,5 @@ void status_redraw_curbuf(void); | |||||||
| void redraw_statuslines(void); | void redraw_statuslines(void); | ||||||
| void win_redraw_last_status(frame_T *frp); | void win_redraw_last_status(frame_T *frp); | ||||||
| void redrawWinline(win_T *wp, linenr_T lnum); | void redrawWinline(win_T *wp, linenr_T lnum); | ||||||
|  | void redraw_win_range_later(win_T *wp, linenr_T first, linenr_T last); | ||||||
| /* vim: set ft=c : */ | /* vim: set ft=c : */ | ||||||
|   | |||||||
| @@ -704,6 +704,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 */ | ||||||
|  | /**/ | ||||||
|  |     1136, | ||||||
| /**/ | /**/ | ||||||
|     1135, |     1135, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user