mirror of
				https://github.com/zsh-users/zsh-syntax-highlighting.git
				synced 2025-10-31 10:04:31 +00:00 
			
		
		
		
	'main': optimization that in my tests shows 2.7s -> 2.2s
Consider indexing long buffers (say 300 chars). E.g. following line:
      integer offset=${${buf[start_pos+1,len]}[(i)$needle]}
will gradually go into large indices for first index [a,] and be kept
at large index for second index [,b]. Instead, we can remove already
processed characters from buf:
    proc_buf="${proc_buf[offset + $#arg + 1,-1]}"
$offset and $#arg are small, first index will not be large. $proc_buf
will be smaller and smaller and the second index [,-1] will run shorter
and shorter.
			
			
This commit is contained in:
		
							parent
							
								
									2176692704
								
							
						
					
					
						commit
						02229ebd63
					
				| @ -199,6 +199,8 @@ _zsh_highlight_main_highlighter() | |||||||
|   # |   # | ||||||
|   local this_word=':start:' next_word |   local this_word=':start:' next_word | ||||||
|   integer in_redirection |   integer in_redirection | ||||||
|  |   # Processing buffer | ||||||
|  |   local proc_buf="$buf" | ||||||
|   for arg in ${interactive_comments-${(z)buf}} \ |   for arg in ${interactive_comments-${(z)buf}} \ | ||||||
|              ${interactive_comments+${(zZ+c+)buf}}; do |              ${interactive_comments+${(zZ+c+)buf}}; do | ||||||
|     if (( in_redirection )); then |     if (( in_redirection )); then | ||||||
| @ -234,14 +236,26 @@ _zsh_highlight_main_highlighter() | |||||||
|       # indistinguishable from 'echo foo echo bar' (one command with three |       # indistinguishable from 'echo foo echo bar' (one command with three | ||||||
|       # words for arguments). |       # words for arguments). | ||||||
|       local needle=$'[;\n]' |       local needle=$'[;\n]' | ||||||
|       integer offset=${${buf[start_pos+1,len]}[(i)$needle]} |       integer offset=$(( ${proc_buf[(i)$needle]} - 1 )) | ||||||
|       (( start_pos += offset - 1 )) |       (( start_pos += offset )) | ||||||
|       (( end_pos = start_pos + $#arg )) |       (( end_pos = start_pos + $#arg )) | ||||||
|     else |     else | ||||||
|       ((start_pos+=(len-start_pos)-${#${${buf[start_pos+1,len]}##([[:space:]]|\\[[:space:]])#}})) |       integer offset=$(((len-start_pos)-${#${proc_buf##([[:space:]]|\\[[:space:]])#}})) | ||||||
|  |       ((start_pos+=offset)) | ||||||
|       ((end_pos=$start_pos+${#arg})) |       ((end_pos=$start_pos+${#arg})) | ||||||
|     fi |     fi | ||||||
| 
 | 
 | ||||||
|  |     # Above `if` computes new start_pos and end_pos. | ||||||
|  |     # Here we compute new proc_buf. We advance it | ||||||
|  |     # (chop off characters from the beginning) | ||||||
|  |     # beyond what end_pos points to, by skipping | ||||||
|  |     # as many characters as end_pos was advanced. | ||||||
|  |     # | ||||||
|  |     # end_pos was advanced by $offset (via start_pos) | ||||||
|  |     # and by $#arg. Note the `start_pos=$end_pos` | ||||||
|  |     # below. | ||||||
|  |     proc_buf="${proc_buf[offset + $#arg + 1,-1]}" | ||||||
|  | 
 | ||||||
|     if [[ -n ${interactive_comments+'set'} && $arg[1] == $histchars[3] ]]; then |     if [[ -n ${interactive_comments+'set'} && $arg[1] == $histchars[3] ]]; then | ||||||
|       if [[ $this_word == *(':regular:'|':start:')* ]]; then |       if [[ $this_word == *(':regular:'|':start:')* ]]; then | ||||||
|         style=comment |         style=comment | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Sebastian Gniazdowski
						Sebastian Gniazdowski