Refactor the application of zle_highlight settings
- Extract duplicated code into a new function.
  This makes it easier to add support for other entries in the
  future, that cannot be accessed in the current version of zsh
  (isearch, suffix).
- Make decision logic more comprehensible.
- Respect deliberately empty entries in zle_highlight.
  Don't force the default value when the user deliberately sets
  an entry in zle_highlight to the empty string.
  For example
    zle_highligh(paste:)
  to disable paste highlighting completely.
			
			
This commit is contained in:
		
							parent
							
								
									4c23a2fd1b
								
							
						
					
					
						commit
						4849ef3307
					
				|  | @ -113,33 +113,13 @@ _zsh_highlight() | ||||||
|     done |     done | ||||||
| 
 | 
 | ||||||
|     # Re-apply zle_highlight settings |     # Re-apply zle_highlight settings | ||||||
|     () { | 
 | ||||||
|       if (( REGION_ACTIVE )) ; then |     # region | ||||||
|         # zle_highlight[region] defaults to 'standout' if unspecified |     (( REGION_ACTIVE )) && _zsh_highlight_apply_zle_highlight region standout "$MARK" "$CURSOR" | ||||||
|         local region="${${zle_highlight[(r)region:*]#region:}:-standout}" | 
 | ||||||
|         integer start end |     # yank / paste (zsh-5.1.1 and newer) | ||||||
|         if (( MARK > CURSOR )) ; then |     (( $+YANK_ACTIVE )) && (( YANK_ACTIVE )) && _zsh_highlight_apply_zle_highlight paste standout "$YANK_START" "$YANK_END" | ||||||
|           start=$CURSOR end=$MARK | 
 | ||||||
|         else |  | ||||||
|           start=$MARK end=$CURSOR |  | ||||||
|         fi |  | ||||||
|         region_highlight+=("$start $end $region") |  | ||||||
|       fi |  | ||||||
|     } |  | ||||||
|     # YANK_ACTIVE is only available in zsh-5.1.1 and newer |  | ||||||
|     (( $+YANK_ACTIVE )) && () { |  | ||||||
|       if (( YANK_ACTIVE )) ; then |  | ||||||
|         # zle_highlight[paste] defaults to 'standout' if unspecified |  | ||||||
|         local paste="${${zle_highlight[(r)paste:*]#paste:}:-standout}" |  | ||||||
|         integer start end |  | ||||||
|         if (( YANK_END > YANK_START )) ; then |  | ||||||
|           start=$YANK_START end=$YANK_END |  | ||||||
|         else |  | ||||||
|           start=$YANK_END end=$YANK_START |  | ||||||
|         fi |  | ||||||
|         region_highlight+=("$start $end $paste") |  | ||||||
|       fi |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     return $ret |     return $ret | ||||||
| 
 | 
 | ||||||
|  | @ -150,6 +130,42 @@ _zsh_highlight() | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | # Apply highlighting based on entries in the zle_highligh array. | ||||||
|  | # This function takes four arguments: | ||||||
|  | # 1. The exact entry (no patterns) in the zle_highlight array: | ||||||
|  | #    region, paste, isearch, or suffix | ||||||
|  | # 2. The default highlighting that should be applied if the entry is unset | ||||||
|  | # 3. and 4. Two integer values describing the beginning and end of the | ||||||
|  | #    range. The order does not matter. | ||||||
|  | _zsh_highlight_apply_zle_highlight() { | ||||||
|  |   local entry="$1" default="$2" | ||||||
|  |   integer first="$3" second="$4" | ||||||
|  | 
 | ||||||
|  |   # read the relevant entry from zle_highlight | ||||||
|  |   local region="${zle_highlight[(r)$entry:*]}" | ||||||
|  | 
 | ||||||
|  |   if [[ -z "$region" ]]; then | ||||||
|  |     # entry not specified at all, use default value | ||||||
|  |     region=$default | ||||||
|  |   else | ||||||
|  |     # strip prefix | ||||||
|  |     region="${region#$entry:}" | ||||||
|  | 
 | ||||||
|  |     # no highlighting when set to the empty string or to 'none' | ||||||
|  |     if [[ -z "$region" ]] || [[ "$region" == none ]]; then | ||||||
|  |       return | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   integer start end | ||||||
|  |   if (( first < second )); then | ||||||
|  |     start=$first end=$second | ||||||
|  |   else | ||||||
|  |     start=$second end=$first | ||||||
|  |   fi | ||||||
|  |   region_highlight+=("$start $end $region") | ||||||
|  | } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| # ------------------------------------------------------------------------------------------------- | # ------------------------------------------------------------------------------------------------- | ||||||
| # API/utility functions for highlighters | # API/utility functions for highlighters | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue