highlighters: Use _zsh_highlight_add_highlight

_zsh_highlight_add_highlight appends to region_highlight $1 $2 and the
next non-null parameter. If there is no non-null parameter, do nothing,
This is so that highlighters can add a style with fallbacks if the most
specific style is not defined. If none of the applicable styles are
defined, do the right thing and don't add an invalid entry to
region_highlight.

The pattern highlighter doesn't use this function as it'd need too large
of an API change.
This commit is contained in:
Matthew Martin 2016-04-29 09:48:39 -05:00
parent 089329660b
commit 341a3ae1f0
6 changed files with 25 additions and 9 deletions

View file

@ -83,10 +83,10 @@ _zsh_highlight_brackets_highlighter()
local bracket_color_size=${#ZSH_HIGHLIGHT_STYLES[(I)bracket-level-*]}
local bracket_color_level=bracket-level-$(( (levelpos[$pos] - 1) % bracket_color_size + 1 ))
local style=$bracket_color_level
region_highlight+=("$pos $((pos + 1)) $ZSH_HIGHLIGHT_STYLES[$style]")
_zsh_highlight_add_highlight $pos $((pos + 1)) $style
else
local style=bracket-error
region_highlight+=("$pos $((pos + 1)) $ZSH_HIGHLIGHT_STYLES[$style]")
_zsh_highlight_add_highlight $pos $((pos + 1)) $style
fi
done
@ -95,7 +95,7 @@ _zsh_highlight_brackets_highlighter()
if [[ -n $levelpos[$pos] ]] && [[ -n $matching[$pos] ]]; then
local otherpos=$matching[$pos]
local style=cursor-matchingbracket
region_highlight+=("$otherpos $((otherpos + 1)) $ZSH_HIGHLIGHT_STYLES[$style]")
_zsh_highlight_add_highlight $otherpos $((otherpos + 1)) $style
fi
}

View file

@ -44,5 +44,5 @@ _zsh_highlight_cursor_highlighter()
{
[[ $WIDGET == accept-* ]] && return
region_highlight+=("$CURSOR $(( $CURSOR + 1 )) $ZSH_HIGHLIGHT_STYLES[cursor]")
_zsh_highlight_add_highlight $CURSOR $(( $CURSOR + 1 )) cursor
}

View file

@ -40,5 +40,5 @@ _zsh_highlight_line_highlighter_predicate()
# root highlighting function.
_zsh_highlight_line_highlighter()
{
region_highlight+=("0 $#BUFFER $ZSH_HIGHLIGHT_STYLES[line]")
_zsh_highlight_add_highlight 0 $#BUFFER line
}

View file

@ -68,7 +68,7 @@ _zsh_highlight_main_highlighter_predicate()
# Helper to deal with tokens crossing line boundaries.
_zsh_highlight_main_add_region_highlight() {
integer start=$1 end=$2
local style=$ZSH_HIGHLIGHT_STYLES[$3]
local style=$3
# The calculation was relative to $PREBUFFER$BUFFER, but region_highlight is
# relative to $BUFFER.
@ -77,7 +77,7 @@ _zsh_highlight_main_add_region_highlight() {
(( end < 0 )) && return # having end<0 would be a bug
(( start < 0 )) && start=0 # having start<0 is normal with e.g. multiline strings
region_highlight+=("$start $end $style")
_zsh_highlight_add_highlight $start $end $style
}
# Wrapper around 'type -w'.
@ -126,7 +126,6 @@ _zsh_highlight_main_highlighter()
local -a options_to_set # used in callees
local buf="$PREBUFFER$BUFFER"
integer len="${#buf}"
region_highlight=()
if (( path_dirs_was_set )); then
options_to_set+=( PATH_DIRS )

View file

@ -40,5 +40,5 @@ _zsh_highlight_root_highlighter_predicate()
# root highlighting function.
_zsh_highlight_root_highlighter()
{
if (( EUID == 0 )) { region_highlight+=("0 $#BUFFER $ZSH_HIGHLIGHT_STYLES[root]") }
if (( EUID == 0 )) { _zsh_highlight_add_highlight 0 $#BUFFER root }
}

View file

@ -196,6 +196,23 @@ _zsh_highlight_cursor_moved()
[[ -n $CURSOR ]] && [[ -n ${_ZSH_HIGHLIGHT_PRIOR_CURSOR-} ]] && (($_ZSH_HIGHLIGHT_PRIOR_CURSOR != $CURSOR))
}
# Add a highlight defined by ZSH_HIGHLIGHT_STYLES
#
# Should be used by all highlighters aside from 'pattern' (cf. ZSH_HIGHLIGHT_PATTERN)
_zsh_highlight_add_highlight()
{
local -i start end
local highlight
start=$1
end=$2
shift 2
for highlight; do
if (( $+ZSH_HIGHLIGHT_STYLES[$highlight] )); then
region_highlight+=("$start $end $ZSH_HIGHLIGHT_STYLES[$highlight]")
break
fi
done
}
# -------------------------------------------------------------------------------------------------
# Setup functions