diff --git a/highlighters/brackets/brackets-highlighter.zsh b/highlighters/brackets/brackets-highlighter.zsh index cc756e8..3875b99 100644 --- a/highlighters/brackets/brackets-highlighter.zsh +++ b/highlighters/brackets/brackets-highlighter.zsh @@ -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 } diff --git a/highlighters/cursor/cursor-highlighter.zsh b/highlighters/cursor/cursor-highlighter.zsh index 5685c40..aa70f55 100644 --- a/highlighters/cursor/cursor-highlighter.zsh +++ b/highlighters/cursor/cursor-highlighter.zsh @@ -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 } diff --git a/highlighters/line/line-highlighter.zsh b/highlighters/line/line-highlighter.zsh index 68308cc..2da55ea 100644 --- a/highlighters/line/line-highlighter.zsh +++ b/highlighters/line/line-highlighter.zsh @@ -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 } diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh index 9260ebe..a0f8dba 100644 --- a/highlighters/main/main-highlighter.zsh +++ b/highlighters/main/main-highlighter.zsh @@ -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 ) diff --git a/highlighters/root/root-highlighter.zsh b/highlighters/root/root-highlighter.zsh index a9039d6..ede9769 100644 --- a/highlighters/root/root-highlighter.zsh +++ b/highlighters/root/root-highlighter.zsh @@ -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 } } diff --git a/zsh-syntax-highlighting.zsh b/zsh-syntax-highlighting.zsh index e171339..8d3e42a 100644 --- a/zsh-syntax-highlighting.zsh +++ b/zsh-syntax-highlighting.zsh @@ -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