From 341a3ae1f015fc366edfa7d31d0f96c693c9343c Mon Sep 17 00:00:00 2001 From: Matthew Martin Date: Fri, 29 Apr 2016 09:48:39 -0500 Subject: [PATCH] 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. --- highlighters/brackets/brackets-highlighter.zsh | 6 +++--- highlighters/cursor/cursor-highlighter.zsh | 2 +- highlighters/line/line-highlighter.zsh | 2 +- highlighters/main/main-highlighter.zsh | 5 ++--- highlighters/root/root-highlighter.zsh | 2 +- zsh-syntax-highlighting.zsh | 17 +++++++++++++++++ 6 files changed, 25 insertions(+), 9 deletions(-) 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