summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/parse.zsh35
1 files changed, 30 insertions, 5 deletions
diff --git a/internal/parse.zsh b/internal/parse.zsh
index 261eb126..c0df3c2d 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)
}