173 lines
5.1 KiB
Bash
173 lines
5.1 KiB
Bash
typeset -g ZERO=${(%):-%N}
|
|
|
|
_zsh_highlight()
|
|
{
|
|
local ret=$?
|
|
|
|
if [[ $WIDGET == zle-isearch-update ]] && ! (( $+ISEARCHMATCH_ACTIVE )); then
|
|
region_highlight=()
|
|
return $ret
|
|
fi
|
|
|
|
setopt localoptions warncreateglobal noksharrays
|
|
local REPLY
|
|
local -a reply
|
|
|
|
[[ -n ${ZSH_HIGHLIGHT_MAXLENGTH:-} ]] && [[ $#BUFFER -gt $ZSH_HIGHLIGHT_MAXLENGTH ]] && return $ret
|
|
|
|
[[ $PENDING -gt 0 ]] && return $ret
|
|
|
|
if [[ $WIDGET == zle-line-finish ]] || _zsh_highlight_buffer_modified; then
|
|
-fast-highlight-init
|
|
-fast-highlight-process && region_highlight=( $reply ) || region_highlight=()
|
|
fi
|
|
|
|
{
|
|
local cache_place
|
|
local -a region_highlight_copy
|
|
|
|
if (( REGION_ACTIVE == 1 )); then
|
|
_zsh_highlight_apply_zle_highlight region standout "$MARK" "$CURSOR"
|
|
elif (( REGION_ACTIVE == 2 )); then
|
|
() {
|
|
local needle=$'\n'
|
|
integer min max
|
|
if (( MARK > CURSOR )) ; then
|
|
min=$CURSOR max=$MARK
|
|
else
|
|
min=$MARK max=$CURSOR
|
|
fi
|
|
(( min = ${${BUFFER[1,$min]}[(I)$needle]} ))
|
|
(( max += ${${BUFFER:($max-1)}[(i)$needle]} - 1 ))
|
|
_zsh_highlight_apply_zle_highlight region standout "$min" "$max"
|
|
}
|
|
fi
|
|
|
|
(( $+YANK_ACTIVE )) && (( YANK_ACTIVE )) && _zsh_highlight_apply_zle_highlight paste standout "$YANK_START" "$YANK_END"
|
|
|
|
(( $+ISEARCHMATCH_ACTIVE )) && (( ISEARCHMATCH_ACTIVE )) && _zsh_highlight_apply_zle_highlight isearch underline "$ISEARCHMATCH_START" "$ISEARCHMATCH_END"
|
|
|
|
(( $+SUFFIX_ACTIVE )) && (( SUFFIX_ACTIVE )) && _zsh_highlight_apply_zle_highlight suffix bold "$SUFFIX_START" "$SUFFIX_END"
|
|
|
|
return $ret
|
|
|
|
} always {
|
|
typeset -g _ZSH_HIGHLIGHT_PRIOR_BUFFER="$BUFFER"
|
|
typeset -g _ZSH_HIGHLIGHT_PRIOR_RACTIVE="$REGION_ACTIVE"
|
|
typeset -gi _ZSH_HIGHLIGHT_PRIOR_CURSOR=$CURSOR
|
|
}
|
|
}
|
|
|
|
_zsh_highlight_apply_zle_highlight() {
|
|
local entry="$1" default="$2"
|
|
integer first="$3" second="$4"
|
|
|
|
local region="${zle_highlight[(r)${entry}:*]}"
|
|
|
|
if [[ -z "$region" ]]; then
|
|
region=$default
|
|
else
|
|
region="${region#${entry}:}"
|
|
|
|
if [[ -z "$region" ]] || [[ "$region" == none ]]; then
|
|
return
|
|
fi
|
|
fi
|
|
|
|
integer start end
|
|
if (( first < second )); then
|
|
start=$first end=$second
|
|
else
|
|
start=$second end=$first
|
|
fi
|
|
region_highlight+=("$start $end $region")
|
|
}
|
|
|
|
|
|
_zsh_highlight_buffer_modified()
|
|
{
|
|
[[ "${_ZSH_HIGHLIGHT_PRIOR_BUFFER:-}" != "$BUFFER" ]] || [[ "$REGION_ACTIVE" != "$_ZSH_HIGHLIGHT_PRIOR_RACTIVE" ]] || { _zsh_highlight_cursor_moved && [[ "$REGION_ACTIVE" = 1 || "$REGION_ACTIVE" = 2 ]] }
|
|
}
|
|
|
|
_zsh_highlight_cursor_moved()
|
|
{
|
|
[[ -n $CURSOR ]] && [[ -n ${_ZSH_HIGHLIGHT_PRIOR_CURSOR-} ]] && (($_ZSH_HIGHLIGHT_PRIOR_CURSOR != $CURSOR))
|
|
}
|
|
|
|
_zsh_highlight_call_widget()
|
|
{
|
|
builtin zle "$@" && _zsh_highlight
|
|
}
|
|
|
|
_zsh_highlight_bind_widgets()
|
|
{
|
|
setopt localoptions noksharrays
|
|
typeset -F SECONDS
|
|
local prefix=orig-s$SECONDS-r$RANDOM
|
|
|
|
zmodload zsh/zleparameter 2>/dev/null || {
|
|
print -r -- >&2 'zsh-syntax-highlighting: failed loading zsh/zleparameter.'
|
|
return 1
|
|
}
|
|
|
|
local -U widgets_to_bind
|
|
widgets_to_bind=(${${(k)widgets}:#(.*|run-help|which-command|beep|set-local-history|yank)})
|
|
|
|
widgets_to_bind+=(zle-line-finish)
|
|
|
|
widgets_to_bind+=(zle-isearch-update)
|
|
|
|
local cur_widget
|
|
for cur_widget in $widgets_to_bind; do
|
|
case $widgets[$cur_widget] in
|
|
|
|
user:_zsh_highlight_widget_*);;
|
|
|
|
user:*) zle -N $prefix-$cur_widget ${widgets[$cur_widget]#*:}
|
|
eval "_zsh_highlight_widget_${(q)prefix}-${(q)cur_widget}() { _zsh_highlight_call_widget ${(q)prefix}-${(q)cur_widget} -- \"\$@\" }"
|
|
zle -N $cur_widget _zsh_highlight_widget_$prefix-$cur_widget;;
|
|
|
|
completion:*) zle -C $prefix-$cur_widget ${${(s.:.)widgets[$cur_widget]}[2,3]}
|
|
eval "_zsh_highlight_widget_${(q)prefix}-${(q)cur_widget}() { _zsh_highlight_call_widget ${(q)prefix}-${(q)cur_widget} -- \"\$@\" }"
|
|
zle -N $cur_widget _zsh_highlight_widget_$prefix-$cur_widget;;
|
|
|
|
builtin) eval "_zsh_highlight_widget_${(q)prefix}-${(q)cur_widget}() { _zsh_highlight_call_widget .${(q)cur_widget} -- \"\$@\" }"
|
|
zle -N $cur_widget _zsh_highlight_widget_$prefix-$cur_widget;;
|
|
|
|
*)
|
|
if [[ $cur_widget == zle-* ]] && [[ -z $widgets[$cur_widget] ]]; then
|
|
_zsh_highlight_widget_${cur_widget}() { :; _zsh_highlight }
|
|
zle -N $cur_widget _zsh_highlight_widget_$cur_widget
|
|
else
|
|
print -r -- >&2 "zsh-syntax-highlighting: unhandled ZLE widget ${(qq)cur_widget}"
|
|
fi
|
|
esac
|
|
done
|
|
}
|
|
|
|
_zsh_highlight_bind_widgets || {
|
|
print -r -- >&2 'zsh-syntax-highlighting: failed binding ZLE widgets, exiting.'
|
|
return 1
|
|
}
|
|
|
|
_zsh_highlight_preexec_hook()
|
|
{
|
|
typeset -g _ZSH_HIGHLIGHT_PRIOR_BUFFER=
|
|
typeset -gi _ZSH_HIGHLIGHT_PRIOR_CURSOR=0
|
|
}
|
|
|
|
autoload -U add-zsh-hook
|
|
add-zsh-hook preexec _zsh_highlight_preexec_hook 2>/dev/null || {
|
|
print -r -- >&2 'zsh-syntax-highlighting: failed loading add-zsh-hook.'
|
|
}
|
|
|
|
ZSH_HIGHLIGHT_MAXLENGTH=10000
|
|
|
|
zmodload zsh/parameter 2>/dev/null
|
|
|
|
autoload -U is-at-least
|
|
source "${dotlib}/highlight"
|
|
|
|
[[ "${+termcap[Co]}" = 1 && "${termcap[Co]}" = "256" ]] && FAST_HIGHLIGHT_STYLES[variable]="fg=112"
|
|
|
|
-fast-highlight-fill-option-variables
|