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

Fixes #674.

WIP: One test fails:

# commmand-parameter
1..8
ok 1 - [1,2] «$x»
ok 2 - [4,13] «"argument"»
ok 3 - [4,13] «"argument"»
ok 4 - [14,14] «;»
not ok 5 - [16,17] «$y» - expected (16 17 "precommand"), observed (16 17 "command").
ok 6 - [18,18] «;»
ok 7 - [20,21] «$z»
ok 8 - cardinality check
This commit is contained in:
Daniel Shahaf 2020-01-16 17:39:12 +00:00
parent dfb917020c
commit 2b1eadbc60
3 changed files with 27 additions and 9 deletions

View File

@ -77,6 +77,10 @@ _zsh_highlight_main_add_region_highlight() {
[[ $1 == unknown-token ]] && alias_style=unknown-token [[ $1 == unknown-token ]] && alias_style=unknown-token
return return
fi fi
if (( in_param )); then
[[ $1 == unknown-token ]] && param_style=unknown-token
return
fi
# The calculation was relative to $buf but region_highlight is relative to $BUFFER. # The calculation was relative to $buf but region_highlight is relative to $BUFFER.
(( start += buf_offset )) (( start += buf_offset ))
@ -394,11 +398,13 @@ _zsh_highlight_main_highlighter_highlight_list()
# alias_style is the style to apply to an alias once in_alias=0 # 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 # Usually 'alias' but set to 'unknown-token' if any word expanded from
# the alias would be highlighted as unknown-token # 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 ')' 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 # 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. # 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 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 # seen_alias is a map of aliases already seen to avoid loops like alias a=b b=a
local -A seen_alias local -A seen_alias
@ -477,6 +483,13 @@ _zsh_highlight_main_highlighter_highlight_list()
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $alias_style _zsh_highlight_main_add_region_highlight $start_pos $end_pos $alias_style
fi fi
fi fi
if (( in_param )); then
(( in_param-- ))
if (( in_param == 0 )); then
# start_pos and end_pos are of the alias (previous $arg) here
_zsh_highlight_main_add_region_highlight $start_pos $end_pos ${param_style:-unknown_token}
fi
fi
# Initialize this_word and next_word. # Initialize this_word and next_word.
if (( in_redirection == 0 )); then if (( in_redirection == 0 )); then
@ -501,7 +514,7 @@ _zsh_highlight_main_highlighter_highlight_list()
fi fi
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. # Compute the new $start_pos and $end_pos, skipping over whitespace in $buf.
[[ "$proc_buf" = (#b)(#s)(([ $'\t']|\\$'\n')#)* ]] [[ "$proc_buf" = (#b)(#s)(([ $'\t']|\\$'\n')#)* ]]
# The first, outer parenthesis # The first, outer parenthesis
@ -614,6 +627,7 @@ _zsh_highlight_main_highlighter_highlight_list()
local -a match mbegin mend local -a match mbegin mend
local MATCH; integer MBEGIN MEND local MATCH; integer MBEGIN MEND
local parameter_name local parameter_name
local -a words
if [[ $arg[1] == '$' ]] && [[ ${arg[2]} == '{' ]] && [[ ${arg[-1]} == '}' ]]; then if [[ $arg[1] == '$' ]] && [[ ${arg[2]} == '{' ]] && [[ ${arg[-1]} == '}' ]]; then
parameter_name=${${arg:2}%?} parameter_name=${${arg:2}%?}
elif [[ $arg[1] == '$' ]]; then elif [[ $arg[1] == '$' ]]; then
@ -626,14 +640,16 @@ _zsh_highlight_main_highlighter_highlight_list()
# Set $arg. # Set $arg.
case ${(tP)MATCH} in case ${(tP)MATCH} in
(*array*|*assoc*) (*array*|*assoc*)
local -a words; words=( ${(P)MATCH} ) words=( ${(P)MATCH} )
arg=${words[1]}
;; ;;
(*) (*)
# scalar, presumably # scalar, presumably
arg=${(P)MATCH} words=( ${(P)MATCH} )
;; ;;
esac esac
(( in_param = 1 + $#words ))
args=( $words $args )
arg=$args[1]
_zsh_highlight_main__type "$arg" 0 _zsh_highlight_main__type "$arg" 0
res=$REPLY res=$REPLY
fi fi
@ -876,6 +892,7 @@ _zsh_highlight_main_highlighter_highlight_list()
if [[ -n ${(M)ZSH_HIGHLIGHT_TOKENS_CONTROL_FLOW:#"$arg"} ]]; then if [[ -n ${(M)ZSH_HIGHLIGHT_TOKENS_CONTROL_FLOW:#"$arg"} ]]; then
next_word=':start::start_of_pipeline:' next_word=':start::start_of_pipeline:'
fi fi
: ${param_style:=$style}
else # $arg is a non-command word else # $arg is a non-command word
case $arg in case $arg in
$'\x29') # subshell or end of array assignment $'\x29') # subshell or end of array assignment
@ -934,6 +951,7 @@ _zsh_highlight_main_highlighter_highlight_list()
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $style _zsh_highlight_main_add_region_highlight $start_pos $end_pos $style
done done
(( in_alias == 1 )) && in_alias=0 _zsh_highlight_main_add_region_highlight $start_pos $end_pos $alias_style (( 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:-unknown_token}
[[ "$proc_buf" = (#b)(#s)(([[:space:]]|\\$'\n')#) ]] [[ "$proc_buf" = (#b)(#s)(([[:space:]]|\\$'\n')#) ]]
REPLY=$(( end_pos + ${#match[1]} - 1 )) REPLY=$(( end_pos + ${#match[1]} - 1 ))
reply=($list_highlights) reply=($list_highlights)

View File

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

View File

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