|
|
@ -83,12 +83,63 @@ _zsh_highlight() |
|
|
|
return $ret |
|
|
|
} |
|
|
|
|
|
|
|
# Probe the memo= feature, once. |
|
|
|
(( ${+zsh_highlight__memo_feature} )) || { |
|
|
|
region_highlight+=( " 0 0 fg=red, memo=zsh-syntax-highlighting" ) |
|
|
|
case ${region_highlight[-1]} in |
|
|
|
("0 0 fg=red") |
|
|
|
# zsh 5.8 or earlier |
|
|
|
integer -gr zsh_highlight__memo_feature=0 |
|
|
|
;; |
|
|
|
("0 0 fg=red memo=zsh-syntax-highlighting") |
|
|
|
# zsh 5.9 or later |
|
|
|
integer -gr zsh_highlight__memo_feature=1 |
|
|
|
;; |
|
|
|
(" 0 0 fg=red, memo=zsh-syntax-highlighting") ;& |
|
|
|
(*) |
|
|
|
# We can get here in two ways: |
|
|
|
# |
|
|
|
# 1. When not running as a widget. In that case, $region_highlight is |
|
|
|
# not a special variable (= one with custom getter/setter functions |
|
|
|
# written in C) but an ordinary one, so the third case pattern matches |
|
|
|
# and we fall through to this block. (The test suite uses this codepath.) |
|
|
|
# |
|
|
|
# 2. When running under a future version of zsh that will have changed |
|
|
|
# the serialization of $region_highlight elements from their underlying |
|
|
|
# C structs, so that none of the previous case patterns will match. |
|
|
|
# |
|
|
|
# In either case, fall back to a version check. |
|
|
|
# |
|
|
|
# The memo= feature was added to zsh in commit zsh-5.8-172-gdd6e702ee. |
|
|
|
# The version number at the time was 5.8.0.2-dev (see Config/version.mk). |
|
|
|
# Therefore, on 5.8.0.3 and newer the memo= feature is available. |
|
|
|
# |
|
|
|
# On zsh version 5.8.0.2 between the aforementioned commit and the |
|
|
|
# first Config/version.mk bump after it (which, at the time of writing, |
|
|
|
# is yet to come), this condition will false negative. |
|
|
|
if is-at-least 5.8.0.3; then |
|
|
|
integer -gr zsh_highlight__memo_feature=1 |
|
|
|
else |
|
|
|
integer -gr zsh_highlight__memo_feature=0 |
|
|
|
fi |
|
|
|
;; |
|
|
|
esac |
|
|
|
region_highlight[-1]=() |
|
|
|
} |
|
|
|
|
|
|
|
# Reset region_highlight to build it from scratch |
|
|
|
if (( zsh_highlight__memo_feature )); then |
|
|
|
region_highlight=( "${(@)region_highlight:#*memo=zsh-syntax-highlighting*}" ) |
|
|
|
else |
|
|
|
# Legacy codepath. Not very interoperable with other plugins (issue #418). |
|
|
|
region_highlight=() |
|
|
|
fi |
|
|
|
|
|
|
|
# Remove all highlighting in isearch, so that only the underlining done by zsh itself remains. |
|
|
|
# For details see FAQ entry 'Why does syntax highlighting not work while searching history?'. |
|
|
|
# This disables highlighting during isearch (for reasons explained in README.md) unless zsh is new enough |
|
|
|
# and doesn't have the pattern matching bug |
|
|
|
if [[ $WIDGET == zle-isearch-update ]] && { $zsh_highlight__pat_static_bug || ! (( $+ISEARCHMATCH_ACTIVE )) }; then |
|
|
|
region_highlight=() |
|
|
|
return $ret |
|
|
|
fi |
|
|
|
|
|
|
@ -124,9 +175,6 @@ _zsh_highlight() |
|
|
|
# Do not highlight if there are pending inputs (copy/paste). |
|
|
|
[[ $PENDING -gt 0 ]] && return $ret |
|
|
|
|
|
|
|
# Reset region highlight to build it from scratch |
|
|
|
region_highlight=(); |
|
|
|
|
|
|
|
{ |
|
|
|
local cache_place |
|
|
|
local -a region_highlight_copy |
|
|
@ -245,7 +293,7 @@ _zsh_highlight_apply_zle_highlight() { |
|
|
|
else |
|
|
|
start=$second end=$first |
|
|
|
fi |
|
|
|
region_highlight+=("$start $end $region") |
|
|
|
region_highlight+=("$start $end $region, memo=zsh-syntax-highlighting") |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -285,7 +333,7 @@ _zsh_highlight_add_highlight() |
|
|
|
shift 2 |
|
|
|
for highlight; do |
|
|
|
if (( $+ZSH_HIGHLIGHT_STYLES[$highlight] )); then |
|
|
|
region_highlight+=("$start $end $ZSH_HIGHLIGHT_STYLES[$highlight]") |
|
|
|
region_highlight+=("$start $end $ZSH_HIGHLIGHT_STYLES[$highlight], memo=zsh-syntax-highlighting") |
|
|
|
break |
|
|
|
fi |
|
|
|
done |
|
|
|