Isolate setup code in functions to ease messing with zsh-syntax-highlighting
This commit is contained in:
		
							parent
							
								
									5003fa7c9b
								
							
						
					
					
						commit
						0e331cd654
					
				|  | @ -118,62 +118,89 @@ _zsh_highlight_cursor_moved() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | # ------------------------------------------------------------------------------------------------- | ||||||
|  | # Setup functions | ||||||
|  | # ------------------------------------------------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | # Rebind all ZLE widgets to make them invoke _zsh_highlights. | ||||||
|  | _zsh_highlight_bind_widgets() | ||||||
|  | { | ||||||
|  |   # Load ZSH module zsh/zleparameter, needed to override user defined widgets. | ||||||
|  |   zmodload zsh/zleparameter 2>/dev/null || { | ||||||
|  |     echo 'zsh-syntax-highlighting: failed loading zsh/zleparameter.' >&2 | ||||||
|  |     return 1 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   # Override ZLE widgets to make them invoke _zsh_highlight. | ||||||
|  |   local cur_widget | ||||||
|  |   for cur_widget in ${${(f)"$(builtin zle -la)"}:#(.*|orig-*|run-help|which-command|beep)}; do | ||||||
|  |     case $widgets[$cur_widget] in | ||||||
|  | 
 | ||||||
|  |       # Already rebound event: do nothing. | ||||||
|  |       user:$cur_widget);; | ||||||
|  | 
 | ||||||
|  |       # User defined widget: override and rebind old one with prefix "orig-". | ||||||
|  |       user:*) eval "zle -N orig-$cur_widget ${widgets[$cur_widget]#*:}; \ | ||||||
|  |                     _zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \ | ||||||
|  |                     zle -N $cur_widget _zsh_highlight_widget_$cur_widget";; | ||||||
|  | 
 | ||||||
|  |       # Completion widget: override and rebind old one with prefix "orig-". | ||||||
|  |       completion:*) eval "zle -C orig-$cur_widget ${${widgets[$cur_widget]#*:}/:/ }; \ | ||||||
|  |                           _zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \ | ||||||
|  |                           zle -N $cur_widget _zsh_highlight_widget_$cur_widget";; | ||||||
|  | 
 | ||||||
|  |       # Builtin widget: override and make it call the builtin ".widget". | ||||||
|  |       builtin) eval "_zsh_highlight_widget_$cur_widget() { builtin zle .$cur_widget && _zsh_highlight }; \ | ||||||
|  |                      zle -N $cur_widget _zsh_highlight_widget_$cur_widget";; | ||||||
|  | 
 | ||||||
|  |       # Default: unhandled case. | ||||||
|  |       *) echo "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" >&2 ;; | ||||||
|  |     esac | ||||||
|  |   done | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Load highlighters from directory. | ||||||
|  | # | ||||||
|  | # Arguments: | ||||||
|  | #   1) Path to the highlighters directory. | ||||||
|  | _zsh_highlight_load_highlighters() | ||||||
|  | { | ||||||
|  |   # Check the directory exists. | ||||||
|  |   [[ -d "$1" ]] || { | ||||||
|  |     echo "zsh-syntax-highlighting: highlighters directory '$1' not found." >&2 | ||||||
|  |     return 1 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   # Load highlighters from highlighters directory and check they define required functions. | ||||||
|  |   local highlighter highlighter_dir | ||||||
|  |   for highlighter_dir ($1/*/); do | ||||||
|  |     highlighter="${highlighter_dir:t}" | ||||||
|  |     [[ -f "$highlighter_dir/${highlighter}-highlighter.zsh" ]] && { | ||||||
|  |       . "$highlighter_dir/${highlighter}-highlighter.zsh" | ||||||
|  |       type "_zsh_highlight_${highlighter}_highlighter" &> /dev/null && | ||||||
|  |       type "_zsh_highlight_${highlighter}_highlighter_predicate" &> /dev/null || { | ||||||
|  |         echo "zsh-syntax-highlighting: '${highlighter}' highlighter should define both required functions '_zsh_highlight_${highlighter}_highlighter' and '_zsh_highlight_${highlighter}_highlighter_predicate' in '${highlighter_dir}/${highlighter}-highlighter.zsh'." >&2 | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   done | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| # ------------------------------------------------------------------------------------------------- | # ------------------------------------------------------------------------------------------------- | ||||||
| # Setup | # Setup | ||||||
| # ------------------------------------------------------------------------------------------------- | # ------------------------------------------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| # Load ZSH module zsh/zleparameter, needed to override user defined widgets. | # Try binding widgets. | ||||||
| zmodload zsh/zleparameter 2>/dev/null || { | _zsh_highlight_bind_widgets || { | ||||||
|   echo 'zsh-syntax-highlighting: failed loading zsh/zleparameter, exiting.' >&2 |   echo 'zsh-syntax-highlighting: failed binding ZLE widgets, exiting.' >&2 | ||||||
|   return -1 |   return 1 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Resolve highlighters directory location. | # Resolve highlighters directory location. | ||||||
| highlighters_dir="${ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR:-${0:h}/highlighters}" | _zsh_highlight_load_highlighters "${ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR:-${0:h}/highlighters}" || { | ||||||
| [[ -d $highlighters_dir ]] || { |   echo 'zsh-syntax-highlighting: failed loading highlighters, exiting.' >&2 | ||||||
|   echo "zsh-syntax-highlighting: highlighters directory '$highlighters_dir' not found, exiting." >&2 |   return 1 | ||||||
|   return -1 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Override ZLE widgets to make them invoke _zsh_highlight. |  | ||||||
| for cur_widget in ${${(f)"$(builtin zle -la)"}:#(.*|orig-*|run-help|which-command|beep)}; do |  | ||||||
|   case $widgets[$cur_widget] in |  | ||||||
| 
 |  | ||||||
|     # Already rebound event: do nothing. |  | ||||||
|     user:$cur_widget);; |  | ||||||
| 
 |  | ||||||
|     # User defined widget: override and rebind old one with prefix "orig-". |  | ||||||
|     user:*) eval "zle -N orig-$cur_widget ${widgets[$cur_widget]#*:}; \ |  | ||||||
|                   _zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \ |  | ||||||
|                   zle -N $cur_widget _zsh_highlight_widget_$cur_widget";; |  | ||||||
| 
 |  | ||||||
|     # Completion widget: override and rebind old one with prefix "orig-". |  | ||||||
|     completion:*) eval "zle -C orig-$cur_widget ${${widgets[$cur_widget]#*:}/:/ }; \ |  | ||||||
|                         _zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \ |  | ||||||
|                         zle -N $cur_widget _zsh_highlight_widget_$cur_widget";; |  | ||||||
| 
 |  | ||||||
|     # Builtin widget: override and make it call the builtin ".widget". |  | ||||||
|     builtin) eval "_zsh_highlight_widget_$cur_widget() { builtin zle .$cur_widget && _zsh_highlight }; \ |  | ||||||
|                    zle -N $cur_widget _zsh_highlight_widget_$cur_widget";; |  | ||||||
| 
 |  | ||||||
|     # Default: unhandled case. |  | ||||||
|     *) echo "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" >&2 ;; |  | ||||||
|   esac |  | ||||||
| done |  | ||||||
| unset cur_widget |  | ||||||
| 
 |  | ||||||
| # Load highlighters from highlighters directory and check they define required functions. |  | ||||||
| for highlighter_dir ($highlighters_dir/*/); do |  | ||||||
|   highlighter="${highlighter_dir:t}" |  | ||||||
|   [[ -f "$highlighter_dir/${highlighter}-highlighter.zsh" ]] && { |  | ||||||
|     . "$highlighter_dir/${highlighter}-highlighter.zsh" |  | ||||||
|     type "_zsh_highlight_${highlighter}_highlighter" &> /dev/null && |  | ||||||
|     type "_zsh_highlight_${highlighter}_highlighter_predicate" &> /dev/null || { |  | ||||||
|       echo "zsh-syntax-highlighting: '${highlighter}' highlighter should define both required functions '_zsh_highlight_${highlighter}_highlighter' and '_zsh_highlight_${highlighter}_highlighter_predicate' in '${highlighter_dir}/${highlighter}-highlighter.zsh'." >&2 |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| done |  | ||||||
| unset highlighter highlighter_dir highlighters_dir |  | ||||||
| 
 |  | ||||||
| # Initialize the array of active highlighters if needed. | # Initialize the array of active highlighters if needed. | ||||||
| [[ $#ZSH_HIGHLIGHT_HIGHLIGHTERS -eq 0 ]] && ZSH_HIGHLIGHT_HIGHLIGHTERS=(main) | [[ $#ZSH_HIGHLIGHT_HIGHLIGHTERS -eq 0 ]] && ZSH_HIGHLIGHT_HIGHLIGHTERS=(main) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue