diff --git a/zsh-syntax-highlighting.zsh b/zsh-syntax-highlighting.zsh index c830e92..2528f46 100644 --- a/zsh-syntax-highlighting.zsh +++ b/zsh-syntax-highlighting.zsh @@ -136,30 +136,31 @@ highlighters_dir="${ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR:-${0:h}/highlighters}" } # Override ZLE widgets to make them invoke _zsh_highlight. -for event in ${${(f)"$(zle -la)"}:#(_*|orig-*|.run-help|.which-command|.beep)}; do - if [[ "$widgets[$event]" == completion:* ]]; then - eval "zle -C orig-$event ${${${widgets[$event]}#*:}/:/ } ; $event() { builtin zle orig-$event && _zsh_highlight } ; zle -N $event" - else - case $event in - accept-and-menu-complete) - eval "$event() { builtin zle .$event && _zsh_highlight } ; zle -N $event" - ;; - .*) - clean_event=${event#\.} - case ${widgets[$clean_event]-} in - (completion|user):*) - ;; - *) - eval "$clean_event() { builtin zle $event && _zsh_highlight } ; zle -N $clean_event" - ;; - esac - ;; - *) - ;; - esac - fi +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]#*:}; \ + $cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \ + zle -N $cur_widget";; + + # Completion widget: override and rebind old one with prefix "orig-". + completion:*) eval "zle -C orig-$cur_widget ${${widgets[$cur_widget]#*:}/:/ }; \ + $cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \ + zle -N $cur_widget";; + + # Builtin widget: override and make it call the builtin ".widget". + builtin) eval "$cur_widget() { builtin zle .$cur_widget && _zsh_highlight }; \ + zle -N $cur_widget";; + + # Default: unhandled case. + *) echo "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" >&2 ;; + esac done -unset event clean_event +unset cur_widget # Start highlighting immediately after the creation of a new command line. autoload add-zsh-hook && add-zsh-hook precmd _zsh_highlight