diff --git a/zsh-syntax-highlighting.zsh b/zsh-syntax-highlighting.zsh index cdbe4c4..65f1938 100644 --- a/zsh-syntax-highlighting.zsh +++ b/zsh-syntax-highlighting.zsh @@ -54,37 +54,42 @@ _zsh_highlight() # Do not highlight if there are pending inputs (copy/paste). [[ $PENDING -gt 0 ]] && return $ret + # Reset region highlight to build it from scratch + region_highlight=(); + { - local -a selected_highlighters local cache_place + local -a region_highlight_copy # Select which highlighters in ZSH_HIGHLIGHT_HIGHLIGHTERS need to be invoked. local highlighter; for highlighter in $ZSH_HIGHLIGHT_HIGHLIGHTERS; do + # eval cache place for current highlighter and prepare it + cache_place="_zsh_highlight_${highlighter}_highlighter_cache" + typeset -ga ${cache_place} + # If highlighter needs to be invoked if "_zsh_highlight_${highlighter}_highlighter_predicate"; then - # Mark the highlighter as selected for update. - selected_highlighters+=($highlighter) + # save a copy, and cleanup region_highlight + region_highlight_copy=("${region_highlight[@]}") + region_highlight=() - # Remove what was stored in its cache from region_highlight. - cache_place="_zsh_highlight_${highlighter}_highlighter_cache" - typeset -ga ${cache_place} - [[ ${#${(P)cache_place}} -gt 0 ]] && [[ ! -z ${region_highlight-} ]] && region_highlight=(${region_highlight:#(${(P~j.|.)cache_place})}) + # Execute highlighter and save result + { + "_zsh_highlight_${highlighter}_highlighter" + } always { + eval "${cache_place}=(\"\${region_highlight[@]}\")" + } + + # Restore saved region_highlight + region_highlight=("${region_highlight_copy[@]}") fi - done - # Invoke each selected highlighter and store the result in its cache. - local -a region_highlight_copy - for highlighter in $selected_highlighters; do - cache_place="_zsh_highlight_${highlighter}_highlighter_cache" - region_highlight_copy=($region_highlight) - { - "_zsh_highlight_${highlighter}_highlighter" - } always { - [[ ! -z ${region_highlight-} ]] && : ${(PA)cache_place::=${region_highlight:#(${(~j.|.)region_highlight_copy})}} - } + # Use value form cache if any cached + eval "region_highlight+=(\"\${${cache_place}[@]}\")" + done } always {