| # vim:ft=zsh:sw=4:sts=4 | |
| 
 | |
| # | |
| # $1 - PREBUFFER | |
| # $2 - BUFFER | |
| # | |
| function -fast-highlight-string-process { | |
|     emulate -LR zsh | |
|     setopt extendedglob warncreateglobal typesetsilent | |
| 
 | |
|     local -A pos_to_level level_to_pos pair_map final_pairs | |
|     local input=$1$2 _mybuf=$1$2 __style __quoting | |
|     integer __idx=0 __pair_idx __level=0 __start __end | |
|     local -a match mbegin mend | |
| 
 | |
|     pair_map=( "(" ")" "{" "}" "[" "]" ) | |
| 
 | |
|     while [[ $_mybuf = (#b)([^"{}()[]\\\"'"]#)((["({[]})\"'"])|[\\](*))(*) ]]; do | |
|         if [[ -n ${match[4]} ]] { | |
|             __idx+=${mbegin[2]} | |
| 
 | |
|             [[ $__quoting = \' ]] && _mybuf=${match[4]} || { _mybuf=${match[4]:1}; (( ++ __idx )); } | |
|         } else { | |
|             __idx+=${mbegin[2]} | |
|             [[ -z $__quoting && -z ${_FAST_COMPLEX_BRACKETS[(r)$((__idx-${#PREBUFFER}-1))]} ]] && { | |
|                 if [[ ${match[2]} = ["({["] ]]; then | |
|                     pos_to_level[$__idx]=$(( ++__level )) | |
|                     level_to_pos[$__level]=$__idx | |
|                 elif [[ ${match[2]} = ["]})"] ]]; then | |
|                     if (( __level > 0 )); then | |
|                         __pair_idx=${level_to_pos[$__level]} | |
|                         pos_to_level[$__idx]=$(( __level -- )) | |
|                         [[ ${pair_map[${input[__pair_idx]}]} = ${input[__idx]} ]] && { | |
|                             final_pairs[$__idx]=$__pair_idx | |
|                             final_pairs[$__pair_idx]=$__idx | |
|                         } | |
|                     else | |
|                         pos_to_level[$__idx]=-1 | |
|                     fi | |
|                 fi | |
|             } | |
| 
 | |
|             if [[ ${match[2]} = \" && $__quoting != \' ]] { | |
|                 [[ $__quoting = '"' ]] && __quoting="" || __quoting='"'; | |
|             } | |
|             if [[ ${match[2]} = \' && $__quoting != \" ]] { | |
|                 if [[ $__quoting = ("'"|"$'") ]] { | |
|                     __quoting="" | |
|                 } else { | |
|                     if [[ $match[1] = *\$ ]] { | |
|                         __quoting="\$'"; | |
|                     } else { | |
|                         __quoting="'"; | |
|                     } | |
|                 } | |
|             } | |
|             _mybuf=${match[5]} | |
|         } | |
|     done | |
| 
 | |
|     for __idx in ${(k)pos_to_level}; do | |
|         (( ${+final_pairs[$__idx]} )) && __style=${FAST_THEME_NAME}bracket-level-$(( ( (pos_to_level[$__idx]-1) % 3 ) + 1 )) || __style=${FAST_THEME_NAME}unknown-token | |
|         (( __start=__idx-${#PREBUFFER}-1, __end=__idx-${#PREBUFFER}, __start >= 0 )) && \ | |
|             reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") | |
|     done | |
| 
 | |
|     # If cursor is on a bracket, then highlight corresponding bracket, if any. | |
|     if [[ $WIDGET != zle-line-finish ]]; then | |
|         __idx=$(( CURSOR + 1 )) | |
|         if (( ${+pos_to_level[$__idx]} )) && (( ${+final_pairs[$__idx]} )); then | |
|             (( __start=final_pairs[$__idx]-${#PREBUFFER}-1, __end=final_pairs[$__idx]-${#PREBUFFER}, __start >= 0 )) && \ | |
|                 reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}") && \ | |
|                 reply+=("$CURSOR $__idx ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}") | |
|         fi | |
|     fi | |
|     return 0 | |
| }
 |