Refactor the application of zle_highlight settings
- Extract duplicated code into a new function. This makes it easier to add support for other entries in the future, that cannot be accessed in the current version of zsh (isearch, suffix). - Make decision logic more comprehensible. - Respect deliberately empty entries in zle_highlight. Don't force the default value when the user deliberately sets an entry in zle_highlight to the empty string. For example zle_highligh(paste:) to disable paste highlighting completely.
This commit is contained in:
parent
4c23a2fd1b
commit
4849ef3307
@ -113,33 +113,13 @@ _zsh_highlight()
|
|||||||
done
|
done
|
||||||
|
|
||||||
# Re-apply zle_highlight settings
|
# Re-apply zle_highlight settings
|
||||||
() {
|
|
||||||
if (( REGION_ACTIVE )) ; then
|
# region
|
||||||
# zle_highlight[region] defaults to 'standout' if unspecified
|
(( REGION_ACTIVE )) && _zsh_highlight_apply_zle_highlight region standout "$MARK" "$CURSOR"
|
||||||
local region="${${zle_highlight[(r)region:*]#region:}:-standout}"
|
|
||||||
integer start end
|
# yank / paste (zsh-5.1.1 and newer)
|
||||||
if (( MARK > CURSOR )) ; then
|
(( $+YANK_ACTIVE )) && (( YANK_ACTIVE )) && _zsh_highlight_apply_zle_highlight paste standout "$YANK_START" "$YANK_END"
|
||||||
start=$CURSOR end=$MARK
|
|
||||||
else
|
|
||||||
start=$MARK end=$CURSOR
|
|
||||||
fi
|
|
||||||
region_highlight+=("$start $end $region")
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
# YANK_ACTIVE is only available in zsh-5.1.1 and newer
|
|
||||||
(( $+YANK_ACTIVE )) && () {
|
|
||||||
if (( YANK_ACTIVE )) ; then
|
|
||||||
# zle_highlight[paste] defaults to 'standout' if unspecified
|
|
||||||
local paste="${${zle_highlight[(r)paste:*]#paste:}:-standout}"
|
|
||||||
integer start end
|
|
||||||
if (( YANK_END > YANK_START )) ; then
|
|
||||||
start=$YANK_START end=$YANK_END
|
|
||||||
else
|
|
||||||
start=$YANK_END end=$YANK_START
|
|
||||||
fi
|
|
||||||
region_highlight+=("$start $end $paste")
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
return $ret
|
return $ret
|
||||||
|
|
||||||
@ -150,6 +130,42 @@ _zsh_highlight()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Apply highlighting based on entries in the zle_highligh array.
|
||||||
|
# This function takes four arguments:
|
||||||
|
# 1. The exact entry (no patterns) in the zle_highlight array:
|
||||||
|
# region, paste, isearch, or suffix
|
||||||
|
# 2. The default highlighting that should be applied if the entry is unset
|
||||||
|
# 3. and 4. Two integer values describing the beginning and end of the
|
||||||
|
# range. The order does not matter.
|
||||||
|
_zsh_highlight_apply_zle_highlight() {
|
||||||
|
local entry="$1" default="$2"
|
||||||
|
integer first="$3" second="$4"
|
||||||
|
|
||||||
|
# read the relevant entry from zle_highlight
|
||||||
|
local region="${zle_highlight[(r)$entry:*]}"
|
||||||
|
|
||||||
|
if [[ -z "$region" ]]; then
|
||||||
|
# entry not specified at all, use default value
|
||||||
|
region=$default
|
||||||
|
else
|
||||||
|
# strip prefix
|
||||||
|
region="${region#$entry:}"
|
||||||
|
|
||||||
|
# no highlighting when set to the empty string or to 'none'
|
||||||
|
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")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------------------
|
||||||
# API/utility functions for highlighters
|
# API/utility functions for highlighters
|
||||||
|
Loading…
Reference in New Issue
Block a user