diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh index 3a8419f..29b3f71 100644 --- a/highlighters/main/main-highlighter.zsh +++ b/highlighters/main/main-highlighter.zsh @@ -500,26 +500,37 @@ _zsh_highlight_main_highlighter_highlight_list() if [[ $this_word == *:start:* ]] && ! (( in_redirection )); then # Expand aliases. - # TODO: this should be done iteratively, e.g., 'alias x=y y=z z=w\n x' - # And then the entire 'alias' branch of the 'case' statement should + # TODO: the entire 'alias' branch of the 'case' statement should # be done here. _zsh_highlight_main__type "$arg" local res="$REPLY" if [[ $res == "alias" ]]; then - _zsh_highlight_main__resolve_alias $arg () { - # Use a temporary array to ensure the subscript is interpreted as - # an array subscript, not as a scalar subscript - local -a reply - # TODO: the ${interactive_comments+set} path needs to skip comments; see test-data/alias-comment1.zsh - reply=( ${interactive_comments-${(z)REPLY}} - ${interactive_comments+${(zZ+c+)REPLY}} ) - arg=$reply[1] + local -A seen_arg + while [[ $REPLY == alias ]]; do + seen_arg[$arg]=1 + _zsh_highlight_main__resolve_alias $arg + # Use a temporary array to ensure the subscript is interpreted as + # an array subscript, not as a scalar subscript + local -a reply + # TODO: the ${interactive_comments+set} path needs to skip comments; see test-data/alias-comment1.zsh + reply=( ${interactive_comments-${(z)REPLY}} + ${interactive_comments+${(zZ+c+)REPLY}} ) + # Avoid looping forever on alias a=b b=c c=b, but allow alias foo='foo bar' + [[ $arg == $reply[1] ]] && break + arg=$reply[1] + if (( $+seen_arg[$arg] )); then + res=none + break + fi + _zsh_highlight_main__type "$arg" + done } - fi - _zsh_highlight_main_highlighter_expand_path $arg - arg=$REPLY - if [[ $res != alias ]]; then + _zsh_highlight_main_highlighter_expand_path $arg + arg=$REPLY + else + _zsh_highlight_main_highlighter_expand_path $arg + arg=$REPLY _zsh_highlight_main__type "$arg" res="$REPLY" fi