diff --git a/internal/parse.zsh b/internal/parse.zsh index 261eb12..c0df3c2 100644 --- a/internal/parse.zsh +++ b/internal/parse.zsh @@ -16,6 +16,7 @@ typeset -gA _p9k_skip_token=( 'if' '' 'fi' '' 'elif' '' + 'else' '' 'then' '' 'while' '' 'until' '' @@ -62,6 +63,21 @@ typeset -gA _p9k_redirect=( '>>|' '' ) +typeset -gA _p9k_term=( + '|' '' + '||' '' + ';' '' + '&' '' + '&&' '' + '|&' '' + '&!' '' + '&|' '' + ';;' '' + ';&' '' + ';|' '' + ')' '' +) + function _p9k_extract_commands() { local rcquotes [[ -o rcquotes ]] && rcquotes=(-o rcquotes) @@ -73,7 +89,7 @@ function _p9k_extract_commands() { local -i e local id='$(<->|[[:alpha:]_][[:IDENT:]]#)' local skip n s r var="\$$id|\${$id}|\"\$$id\"|\"\${$id}\"" - local -a aln alp alf v match mbegin mend + local -a aln alp alf v commands match mbegin mend [[ -o interactive_comments ]] && local tokens=(${(Z+C+)1}) || local tokens=(${(z)1}) @@ -119,7 +135,14 @@ function _p9k_extract_commands() { if [[ -n $skip ]]; then if [[ $token == $~skip ]]; then - [[ $token == ';'[';&|'] ]] && skip='\)|esac' || skip= + skip= + if (( $+_p9k_term[$token] )); then + [[ $token == ';'[';&|'] ]] && skip='\)|esac' + _p9k_commands+=($commands) + commands=() + elif [[ $token == '()' ]]; then + commands=() + fi fi continue fi @@ -153,9 +176,11 @@ function _p9k_extract_commands() { fi fi - _p9k_commands+=${token::=${(Q)${~token}}} + commands+=${:-${(Q)${~token}}} - # '|' '||' ';' '&' '&&' '|&' '&!' '&|' ';;' ';&' ';|' ')' - skip='\||\|\||;|&|&&|\|&|&!|&\||;;|;&|;\||\)|}' + # '|' '||' ';' '&' '&&' '|&' '&!' '&|' ';;' ';&' ';|' ')' '()' + skip='\||\|\||;|&|&&|\|&|&!|&\||;;|;&|;\||\)|}|\(\)' done + + _p9k_commands+=($commands) }