diff --git a/internal/parse.zsh b/internal/parse.zsh index ce58ffcf..1b1aba1e 100644 --- a/internal/parse.zsh +++ b/internal/parse.zsh @@ -28,7 +28,7 @@ typeset -gA _p9k_skip_token=( 'nocorrect' '' 'time' '' '-' '' - 'builtin' '' + 'builtin' '' # this is wrong as it will cause alias expansion '[[' '\]\]' '((' '\)\)' 'case' '\)|esac' @@ -96,26 +96,81 @@ typeset -gA _p9k_skip_arg=( '()' '' ) +function _p9k_next_token() { + if (( $#tokens == aln[-1] )); then + aln[-1]=() + alp[-1]=() + if (( $#tokens == alf[-1] )); then + alf[-1]=() + (( e = 0 )) + else + (( e = 1 )) + fi + else + (( e = 1 )) + fi + + while (( $#tokens )); do + token=$tokens[1] + shift 1 tokens + if (( $+galiases[$token] )); then + (( $aln[(eI)p$token] )) && return + n=p$token + s=$galiases[$token] + elif (( e )); then + return + elif (( $+aliases[$token] )); then + (( $aln[(eI)p$token] )) && return + n=p$token + s=$aliases[$token] + elif [[ $token == (#b)?*.(?*) ]] && (( $+saliases[$match[1]] )); then + (( $aln[(eI)s$match[1]] )) && return + n=s$match[1] + s=${saliases[$match[1]]%% #} + else + return 0 + fi + aln+=$n + alp+=$#tokens + [[ $s == *' ' ]] && alf+=$#tokens + [[ -o interactive_comments ]] && tokens[1,0]=(${(Z+C+)s}) || tokens[1,0]=(${(z)s}) + done + + token= + return 1 +} + # False positives: # # {} always {} # # False negatives: # +# --------------- # : $(x) +# --------------- # : `x` +# --------------- # -# Completely broken: +# Broken: # +# --------------- # ${x/} +# --------------- # * +# --------------- # x=$y; $x -# +# --------------- +# x <