main: Have helper functions return highlights in reply

This allows _highlight_arguments to put things in region_highlight prior
to the highlights decided by the helper functions, but decide on what
that prior highlight should be after the helpers have run.
This commit is contained in:
Matthew Martin 2018-01-18 14:59:24 -06:00
parent 6cc861fbad
commit 6835121eaf

View File

@ -751,10 +751,11 @@ _zsh_highlight_main_highlighter_highlight_path_separators()
{
local pos style_pathsep
style_pathsep=$1_pathseparator
reply=()
[[ -z "$ZSH_HIGHLIGHT_STYLES[$style_pathsep]" || "$ZSH_HIGHLIGHT_STYLES[$1]" == "$ZSH_HIGHLIGHT_STYLES[$style_pathsep]" ]] && return 0
for (( pos = start_pos; $pos <= end_pos; pos++ )) ; do
if [[ $BUFFER[pos] == / ]]; then
_zsh_highlight_main_add_region_highlight $((pos - 1)) $pos $style_pathsep
reply+=($((pos - 1)) $pos $style_pathsep)
fi
done
}
@ -799,6 +800,7 @@ _zsh_highlight_main_highlighter_check_path()
_zsh_highlight_main_highlighter_highlight_argument()
{
local i path_eligible style
local -a highlights reply
path_eligible=1
local -a match mbegin mend
@ -808,13 +810,26 @@ _zsh_highlight_main_highlighter_highlight_argument()
for (( i = 1 ; i <= end_pos - start_pos ; i += 1 )); do
case "$arg[$i]" in
"\\") (( i += 1 )); continue;;
"'") _zsh_highlight_main_highlighter_highlight_single_quote $i; (( i = REPLY ));;
'"') _zsh_highlight_main_highlighter_highlight_double_quote $i; (( i = REPLY ));;
'`') _zsh_highlight_main_highlighter_highlight_backtick $i; (( i = REPLY ));;
"'")
_zsh_highlight_main_highlighter_highlight_single_quote $i
(( i = REPLY ))
highlights+=($reply)
;;
'"')
_zsh_highlight_main_highlighter_highlight_double_quote $i
(( i = REPLY ))
highlights+=($reply)
;;
'`')
_zsh_highlight_main_highlighter_highlight_backtick $i
(( i = REPLY ))
highlights+=($reply)
;;
'$')
if [[ $arg[i+1] == "'" ]]; then
_zsh_highlight_main_highlighter_highlight_dollar_quote $i
(( i = REPLY ))
highlights+=($reply)
elif [[ $arg[i+1] == [\^=~#+] ]]; then
while [[ $arg[i+1] == [\^=~#+] ]]; do
(( i += 1 ))
@ -841,8 +856,10 @@ _zsh_highlight_main_highlighter_highlight_argument()
if (( path_eligible )) && _zsh_highlight_main_highlighter_check_path; then
style=$REPLY
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $style
_zsh_highlight_main_highlighter_highlight_path_separators $style
highlights+=($reply)
fi
_zsh_highlight_main_add_many_region_highlights $highlights
}
# Quote Helper Functions
@ -851,17 +868,18 @@ _zsh_highlight_main_highlighter_highlight_argument()
# $start_pos is expected to be set to the start of $arg in $BUFFER
# $1 is the index in $arg which starts the quote
# $REPLY is returned as the end of quote index in $arg
# $reply is returned as an array of region_highlight additions
# Highlight single-quoted strings
_zsh_highlight_main_highlighter_highlight_single_quote()
{
local arg1=$1 i q=\' style
local -a highlights
i=$arg[(ib:arg1+1:)$q]
reply=()
if [[ $zsyh_user_options[rcquotes] == on ]]; then
while [[ $arg[i+1] == "'" ]]; do
highlights+=($(( start_pos + i - 1 )) $(( start_pos + i + 1 )) rc-quote)
reply+=($(( start_pos + i - 1 )) $(( start_pos + i + 1 )) rc-quote)
(( i++ ))
i=$arg[(ib:i+1:)$q]
done
@ -872,17 +890,17 @@ _zsh_highlight_main_highlighter_highlight_single_quote()
else
style=single-quoted-argument-unclosed
fi
highlights+=($(( start_pos + arg1 - 1 )) $(( start_pos + i )) $style $highlights)
_zsh_highlight_main_add_many_region_highlights $highlights
reply+=($(( start_pos + arg1 - 1 )) $(( start_pos + i )) $style $reply)
REPLY=$i
}
# Highlight special chars inside double-quoted strings
_zsh_highlight_main_highlighter_highlight_double_quote()
{
local -a highlights match mbegin mend
local -a match mbegin mend
local MATCH; integer MBEGIN MEND
local i j k style
reply=()
for (( i = $1 + 1 ; i < end_pos - start_pos ; i += 1 )) ; do
(( j = i + start_pos - 1 ))
@ -929,7 +947,7 @@ _zsh_highlight_main_highlighter_highlight_double_quote()
*) continue ;;
esac
highlights+=($j $k $style)
reply+=($j $k $style)
done
if [[ $arg[i] == '"' ]]; then
@ -937,19 +955,19 @@ _zsh_highlight_main_highlighter_highlight_double_quote()
else
style=double-quoted-argument-unclosed
fi
highlights=($(( start_pos + $1 - 1)) $(( start_pos + i )) $style $highlights)
_zsh_highlight_main_add_many_region_highlights $highlights
reply=($(( start_pos + $1 - 1)) $(( start_pos + i )) $style $reply)
REPLY=$i
}
# Highlight special chars inside dollar-quoted strings
_zsh_highlight_main_highlighter_highlight_dollar_quote()
{
local -a highlights match mbegin mend
local -a match mbegin mend
local MATCH; integer MBEGIN MEND
local i j k style
local AA
integer c
reply=()
for (( i = $1 + 2 ; i < end_pos - start_pos ; i += 1 )) ; do
(( j = i + start_pos - 1 ))
@ -981,7 +999,7 @@ _zsh_highlight_main_highlighter_highlight_dollar_quote()
*) continue ;;
esac
highlights+=($j $k $style)
reply+=($j $k $style)
done
if [[ $arg[i] == "'" ]]; then
@ -989,8 +1007,7 @@ _zsh_highlight_main_highlighter_highlight_dollar_quote()
else
style=dollar-quoted-argument-unclosed
fi
highlights+=($(( start_pos + $1 - 1 )) $(( start_pos + i )) $style $highlights)
_zsh_highlight_main_add_many_region_highlights $highlights
reply+=($(( start_pos + $1 - 1 )) $(( start_pos + i )) $style $reply)
REPLY=$i
}
@ -998,6 +1015,7 @@ _zsh_highlight_main_highlighter_highlight_dollar_quote()
_zsh_highlight_main_highlighter_highlight_backtick()
{
local arg1=$1 i=$1 q=\` style
reply=()
while i=$arg[(ib:i+1:)$q]; [[ $arg[i-1] == '\' && $i -lt $(( end_pos - start_pos )) ]]; do done
if [[ $arg[i] == '`' ]]; then
@ -1005,7 +1023,7 @@ _zsh_highlight_main_highlighter_highlight_backtick()
else
style=back-quoted-argument-unclosed
fi
_zsh_highlight_main_add_region_highlight $(( start_pos + arg1 - 1 )) $(( start_pos + i )) $style
reply=($(( start_pos + arg1 - 1 )) $(( start_pos + i )) $style)
REPLY=$i
}