'main': Pass parameters through the multi-word machinery, as we already do for aliases.

Fixes #674.
This commit is contained in:
Daniel Shahaf 2020-01-16 17:39:12 +00:00
parent 52ea5c686a
commit 1a55dc8fc2
3 changed files with 33 additions and 9 deletions

View file

@ -77,6 +77,16 @@ _zsh_highlight_main_add_region_highlight() {
[[ $1 == unknown-token ]] && alias_style=unknown-token
return
fi
if (( in_param )); then
if [[ $1 == unknown-token ]]; then
param_style=unknown-token
fi
if [[ -n $param_style ]]; then
return
fi
param_style=$1
return
fi
# The calculation was relative to $buf but region_highlight is relative to $BUFFER.
(( start += buf_offset ))
@ -406,11 +416,13 @@ _zsh_highlight_main_highlighter_highlight_list()
# alias_style is the style to apply to an alias once in_alias=0
# Usually 'alias' but set to 'unknown-token' if any word expanded from
# the alias would be highlighted as unknown-token
local alias_style arg buf=$4 highlight_glob=true style
# param_style is analogous for parameter expansions
local alias_style param_style arg buf=$4 highlight_glob=true style
local in_array_assignment=false # true between 'a=(' and the matching ')'
# in_alias is equal to the number of shifts needed until arg=args[1] pops an
# arg from BUFFER and not added by an alias.
integer in_alias=0 len=$#buf
# in_param is analogous for parameter expansions
integer in_alias=0 in_param=0 len=$#buf
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
@ -489,6 +501,14 @@ _zsh_highlight_main_highlighter_highlight_list()
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $alias_style
fi
fi
if (( in_param )); then
(( in_param-- ))
if (( in_param == 0 )); then
# start_pos and end_pos are of the '$foo' word (previous $arg) here
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $param_style
param_style=""
fi
fi
# Initialize this_word and next_word.
if (( in_redirection == 0 )); then
@ -513,7 +533,7 @@ _zsh_highlight_main_highlighter_highlight_list()
fi
fi
if (( in_alias == 0 )); then
if (( in_alias == 0 && in_param == 0 )); then
# Compute the new $start_pos and $end_pos, skipping over whitespace in $buf.
[[ "$proc_buf" = (#b)(#s)(([ $'\t']|\\$'\n')#)* ]]
# The first, outer parenthesis
@ -626,6 +646,7 @@ _zsh_highlight_main_highlighter_highlight_list()
local -a match mbegin mend
local MATCH; integer MBEGIN MEND
local parameter_name
local -a words
if [[ $arg[1] == '$' ]] && [[ ${arg[2]} == '{' ]] && [[ ${arg[-1]} == '}' ]]; then
parameter_name=${${arg:2}%?}
elif [[ $arg[1] == '$' ]]; then
@ -638,14 +659,16 @@ _zsh_highlight_main_highlighter_highlight_list()
# Set $arg.
case ${(tP)MATCH} in
(*array*|*assoc*)
local -a words; words=( ${(P)MATCH} )
arg=${words[1]}
words=( ${(P)MATCH} )
;;
(*)
# scalar, presumably
arg=${(P)MATCH}
words=( ${(P)MATCH} )
;;
esac
(( in_param = 1 + $#words ))
args=( $words $args )
arg=$args[1]
_zsh_highlight_main__type "$arg" 0
res=$REPLY
fi
@ -946,6 +969,7 @@ _zsh_highlight_main_highlighter_highlight_list()
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $style
done
(( in_alias == 1 )) && in_alias=0 _zsh_highlight_main_add_region_highlight $start_pos $end_pos $alias_style
(( in_param == 1 )) && in_param=0 _zsh_highlight_main_add_region_highlight $start_pos $end_pos $param_style
[[ "$proc_buf" = (#b)(#s)(([[:space:]]|\\$'\n')#) ]]
REPLY=$(( end_pos + ${#match[1]} - 1 ))
reply=($list_highlights)

View file

@ -36,7 +36,7 @@ BUFFER='$sudo_u phy1729 echo foo'
expected_region_highlight=(
'1 7 precommand' # $sudo_u
'9 15 default "issue #674"' # phy1729
'9 15 default' # phy1729
'18 20 command "issue #540"' # echo (not builtin)
'22 24 default' # foo
)

View file

@ -36,7 +36,7 @@ BUFFER='$sudo_u phy1729 ls foo'
expected_region_highlight=(
'1 7 precommand' # sudo_u
'9 15 default "issue #674"' # phy1729
'17 18 command "issue #674"' # ls
'9 15 default' # phy1729
'17 18 command' # ls
'20 22 default' # foo
)