'brackets': Check if brackets match on first pass
This removes the need for the typepos array.
This commit is contained in:
		
							parent
							
								
									95d82568d8
								
							
						
					
					
						commit
						e05b8e88ad
					
				|  | @ -47,8 +47,8 @@ _zsh_highlight_brackets_highlighter_predicate() | ||||||
| _zsh_highlight_brackets_highlighter() | _zsh_highlight_brackets_highlighter() | ||||||
| { | { | ||||||
|   local char quotetype style |   local char quotetype style | ||||||
|   local -i bracket_color_size=${#ZSH_HIGHLIGHT_STYLES[(I)bracket-level-*]} buflen=${#BUFFER} level=0 pos |   local -i bracket_color_size=${#ZSH_HIGHLIGHT_STYLES[(I)bracket-level-*]} buflen=${#BUFFER} level=0 matchingpos pos | ||||||
|   local -A levelpos lastoflevel matching typepos |   local -A levelpos lastoflevel matching | ||||||
| 
 | 
 | ||||||
|   # Find all brackets and remember which one is matching |   # Find all brackets and remember which one is matching | ||||||
|   for (( pos = 1; pos <= buflen; pos++ )) ; do |   for (( pos = 1; pos <= buflen; pos++ )) ; do | ||||||
|  | @ -57,13 +57,14 @@ _zsh_highlight_brackets_highlighter() | ||||||
|       ["([{"]) |       ["([{"]) | ||||||
|         levelpos[$pos]=$((++level)) |         levelpos[$pos]=$((++level)) | ||||||
|         lastoflevel[$level]=$pos |         lastoflevel[$level]=$pos | ||||||
|         _zsh_highlight_brackets_highlighter_brackettype "$char" |  | ||||||
|         ;; |         ;; | ||||||
|       [")]}"]) |       [")]}"]) | ||||||
|         matching[$lastoflevel[$level]]=$pos |         matchingpos=$lastoflevel[$level] | ||||||
|         matching[$pos]=$lastoflevel[$level] |  | ||||||
|         levelpos[$pos]=$((level--)) |         levelpos[$pos]=$((level--)) | ||||||
|         _zsh_highlight_brackets_highlighter_brackettype "$char" | 	if _zsh_highlight_brackets_match $matchingpos $pos; then | ||||||
|  |           matching[$matchingpos]=$pos | ||||||
|  |           matching[$pos]=$matchingpos | ||||||
|  |         fi | ||||||
|         ;; |         ;; | ||||||
|       ['"'\']) |       ['"'\']) | ||||||
|         # Skip everything inside quotes |         # Skip everything inside quotes | ||||||
|  | @ -78,7 +79,7 @@ _zsh_highlight_brackets_highlighter() | ||||||
| 
 | 
 | ||||||
|   # Now highlight all found brackets |   # Now highlight all found brackets | ||||||
|   for pos in ${(k)levelpos}; do |   for pos in ${(k)levelpos}; do | ||||||
|     if [[ -n $matching[$pos] ]] && [[ $typepos[$pos] == $typepos[$matching[$pos]] ]]; then |     if (( $+matching[$pos] )); then | ||||||
|       style=bracket-level-$(( (levelpos[$pos] - 1) % bracket_color_size + 1 )) |       style=bracket-level-$(( (levelpos[$pos] - 1) % bracket_color_size + 1 )) | ||||||
|     else |     else | ||||||
|       style=bracket-error |       style=bracket-error | ||||||
|  | @ -95,12 +96,12 @@ _zsh_highlight_brackets_highlighter() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Helper function to differentiate type  | # Helper function to differentiate type  | ||||||
| _zsh_highlight_brackets_highlighter_brackettype() | _zsh_highlight_brackets_match() | ||||||
| { | { | ||||||
|   case $1 in |   case $BUFFER[$1] in | ||||||
|     ["()"]) typepos[$pos]=round;; |     \() [[ $BUFFER[$2] == \) ]];; | ||||||
|     ["[]"]) typepos[$pos]=bracket;; |     \[) [[ $BUFFER[$2] == \] ]];; | ||||||
|     ["{}"]) typepos[$pos]=curly;; |     \{) [[ $BUFFER[$2] == \} ]];; | ||||||
|     *) ;; |     *) false;; | ||||||
|   esac |   esac | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue