mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	patch 8.2.2542: highlight of char beyond line end is not correct
Problem:    Highlight of char beyond line end is not correct. (Chuan Wei Foo)
Solution:   Fix counting NUL as one cell.  Draw one more character if the EOL
            is part of the match. (closes #7883)
			
			
This commit is contained in:
		
							
								
								
									
										27
									
								
								src/match.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								src/match.c
									
									
									
									
									
								
							| @@ -792,7 +792,15 @@ update_search_hl( | |||||||
| 			// highlight empty match, try again after | 			// highlight empty match, try again after | ||||||
| 			// it | 			// it | ||||||
| 			if (has_mbyte) | 			if (has_mbyte) | ||||||
| 			    shl->endcol += (*mb_ptr2len)(*line + shl->endcol); | 			{ | ||||||
|  | 			    char_u *p = *line + shl->endcol; | ||||||
|  |  | ||||||
|  | 			    if (*p == NUL) | ||||||
|  | 				// consistent with non-mbyte | ||||||
|  | 				++shl->endcol; | ||||||
|  | 			    else | ||||||
|  | 				shl->endcol += (*mb_ptr2len)(p); | ||||||
|  | 			} | ||||||
| 			else | 			else | ||||||
| 			    ++shl->endcol; | 			    ++shl->endcol; | ||||||
| 		    } | 		    } | ||||||
| @@ -842,18 +850,31 @@ get_prevcol_hl_flag(win_T *wp, match_T *search_hl, long curcol) | |||||||
|     int		prevcol_hl_flag = FALSE; |     int		prevcol_hl_flag = FALSE; | ||||||
|     matchitem_T *cur;			// points to the match list |     matchitem_T *cur;			// points to the match list | ||||||
|  |  | ||||||
|  | #if defined(FEAT_PROP_POPUP) | ||||||
|  |     // don't do this in a popup window | ||||||
|  |     if (popup_is_popup(wp)) | ||||||
|  | 	return FALSE; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|     // we're not really at that column when skipping some text |     // we're not really at that column when skipping some text | ||||||
|     if ((long)(wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol) |     if ((long)(wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol) | ||||||
| 	++prevcol; | 	++prevcol; | ||||||
|  |  | ||||||
|     if (!search_hl->is_addpos && prevcol == (long)search_hl->startcol) |     // Highlight a character after the end of the line if the match started | ||||||
|  |     // at the end of the line or when the match continues in the next line | ||||||
|  |     // (match includes the line break). | ||||||
|  |     if (!search_hl->is_addpos && (prevcol == (long)search_hl->startcol | ||||||
|  | 		|| (prevcol > (long)search_hl->startcol | ||||||
|  | 					      && search_hl->endcol == MAXCOL))) | ||||||
| 	prevcol_hl_flag = TRUE; | 	prevcol_hl_flag = TRUE; | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
| 	cur = wp->w_match_head; | 	cur = wp->w_match_head; | ||||||
| 	while (cur != NULL) | 	while (cur != NULL) | ||||||
| 	{ | 	{ | ||||||
| 	    if (!cur->hl.is_addpos && prevcol == (long)cur->hl.startcol) | 	    if (!cur->hl.is_addpos && (prevcol == (long)cur->hl.startcol | ||||||
|  | 			|| (prevcol > (long)cur->hl.startcol | ||||||
|  | 						 && cur->hl.endcol == MAXCOL))) | ||||||
| 	    { | 	    { | ||||||
| 		prevcol_hl_flag = TRUE; | 		prevcol_hl_flag = TRUE; | ||||||
| 		break; | 		break; | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								src/testdir/dumps/Test_hlsearch_1.dump
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/testdir/dumps/Test_hlsearch_1.dump
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | |x+0&#ffff4012@2| | +0&#ffffff0@45 | ||||||
|  | >x+8&#ffff4012@2| | +8&#ffffff0@45 | ||||||
|  | |x+0&#ffff4012@2| | +0&#ffffff0@45 | ||||||
|  | |~+0#4040ff13&| @48 | ||||||
|  | |~| @48 | ||||||
|  | | +0#0000000&@31|2|,|1| @10|A|l@1|  | ||||||
							
								
								
									
										6
									
								
								src/testdir/dumps/Test_hlsearch_2.dump
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/testdir/dumps/Test_hlsearch_2.dump
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | |x+0&#ffff4012@2| | +0&#ffffff0@45 | ||||||
|  | |x+0&#ffff4012@2| | +0&#ffffff0@45 | ||||||
|  | >x+8&#ffff4012@2| | +8&#ffffff0@45 | ||||||
|  | |~+0#4040ff13&| @48 | ||||||
|  | |~| @48 | ||||||
|  | |/+0#0000000&|\|_|.|*| @26|3|,|1| @10|A|l@1|  | ||||||
| @@ -944,6 +944,26 @@ func Test_incsearch_search_dump() | |||||||
|   call delete('Xis_search_script') |   call delete('Xis_search_script') | ||||||
| endfunc | endfunc | ||||||
|  |  | ||||||
|  | func Test_hlsearch_dump() | ||||||
|  |   CheckOption hlsearch | ||||||
|  |   CheckScreendump | ||||||
|  |  | ||||||
|  |   call writefile([ | ||||||
|  | 	\ 'set hlsearch cursorline', | ||||||
|  |         \ 'call setline(1, ["xxx", "xxx", "xxx"])', | ||||||
|  | 	\ '/.*', | ||||||
|  | 	\ '2', | ||||||
|  | 	\ ], 'Xhlsearch_script') | ||||||
|  |   let buf = RunVimInTerminal('-S Xhlsearch_script', {'rows': 6, 'cols': 50}) | ||||||
|  |   call VerifyScreenDump(buf, 'Test_hlsearch_1', {}) | ||||||
|  |  | ||||||
|  |   call term_sendkeys(buf, "/\\_.*\<CR>") | ||||||
|  |   call VerifyScreenDump(buf, 'Test_hlsearch_2', {}) | ||||||
|  |  | ||||||
|  |   call StopVimInTerminal(buf) | ||||||
|  |   call delete('Xhlsearch_script') | ||||||
|  | endfunc | ||||||
|  |  | ||||||
| func Test_incsearch_substitute() | func Test_incsearch_substitute() | ||||||
|   CheckOption incsearch |   CheckOption incsearch | ||||||
|  |  | ||||||
|   | |||||||
| @@ -750,6 +750,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 */ | ||||||
|  | /**/ | ||||||
|  |     2542, | ||||||
| /**/ | /**/ | ||||||
|     2541, |     2541, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user