Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/highlighters/main.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ This highlighter defines the following styles:
* `assign` - parameter assignments (`x=foo` and `x=( )`)
* `redirection` - redirection operators (`<`, `>`, etc)
* `comment` - comments, when `setopt INTERACTIVE_COMMENTS` is in effect (`echo # foo`)
* `named-fd` - named file descriptor (`echo foo {fd}>&2`)
* `arg0` - a command word other than one of those enumerated above (other than a command, precommand, alias, function, or shell builtin command).
* `default` - everything else

Expand Down
15 changes: 12 additions & 3 deletions highlighters/main/main-highlighter.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
: ${ZSH_HIGHLIGHT_STYLES[assign]:=none}
: ${ZSH_HIGHLIGHT_STYLES[redirection]:=none}
: ${ZSH_HIGHLIGHT_STYLES[comment]:=fg=black,bold}
: ${ZSH_HIGHLIGHT_STYLES[named-fd]:=none}
: ${ZSH_HIGHLIGHT_STYLES[arg0]:=fg=green}

# Whether the highlighter should be called or not.
Expand Down Expand Up @@ -378,6 +379,8 @@ _zsh_highlight_main_highlighter_highlight_list()
local -a match mbegin mend list_highlights
# seen_alias is a map of aliases already seen to avoid loops like alias a=b b=a
local -A seen_alias
# Pattern for parameter names
readonly parameter_name_pattern='([A-Za-z_][A-Za-z0-9_]*|[0-9]+)'
list_highlights=()

# "R" for round
Expand Down Expand Up @@ -552,13 +555,19 @@ _zsh_highlight_main_highlighter_highlight_list()

# Analyse the current word.
if _zsh_highlight_main__is_redirection $arg ; then
if (( in_redirection )); then
if (( in_redirection == 1 )); then
# The condition excludes the case that BUFFER='{foo}>&2' and we're on the '>&'.
_zsh_highlight_main_add_region_highlight $start_pos $end_pos unknown-token
else
in_redirection=2
_zsh_highlight_main_add_region_highlight $start_pos $end_pos redirection
fi
continue
elif [[ $arg == '{'${~parameter_name_pattern}'}' ]] && _zsh_highlight_main__is_redirection $args[1]; then
# named file descriptor: {foo}>&2
in_redirection=3
_zsh_highlight_main_add_region_highlight $start_pos $end_pos named-fd
continue
fi

# Expand parameters.
Expand All @@ -580,7 +589,7 @@ _zsh_highlight_main_highlighter_highlight_list()
parameter_name=${arg:1}
fi
if [[ $res == none ]] && zmodload -e zsh/parameter &&
[[ ${parameter_name} =~ ^([A-Za-z_][A-Za-z0-9_]*|[0-9]+)$ ]] &&
[[ ${parameter_name} =~ ^${~parameter_name_pattern}$ ]] &&
(( ${+parameters[(e)${MATCH}]} )) && [[ ${parameters[(e)$MATCH]} != *special* ]]
then
# Set $arg.
Expand Down Expand Up @@ -864,7 +873,7 @@ _zsh_highlight_main_highlighter_highlight_list()
elif [[ $arg == $'\x5d' ]] && _zsh_highlight_main__stack_pop 'Q' builtin; then
:
else
_zsh_highlight_main_highlighter_highlight_argument 1 $(( 1 - in_redirection ))
_zsh_highlight_main_highlighter_highlight_argument 1 $(( 1 != in_redirection ))
continue
fi
;;
Expand Down
4 changes: 2 additions & 2 deletions highlighters/main/test-data/exec-redirection1.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ BUFFER='exec {foo}>&/tmp ls'

expected_region_highlight=(
"1 4 precommand" # exec
"6 10 redirection 'issue #238'" # {foo}
"6 10 named-fd" # {foo}
"11 12 redirection" # >&
"13 16 path" # /tmp
"18 19 command 'issue #238'" # ls
"18 19 command" # ls
)