mirror of
https://github.com/zsh-users/zsh-syntax-highlighting.git
synced 2025-04-17 11:35:32 +08:00
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:
parent
dfb917020c
commit
2b1eadbc60
@ -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)
|
||||||
|
@ -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
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user