Isolate setup code in functions to ease messing with zsh-syntax-highlighting
This commit is contained in:
parent
5003fa7c9b
commit
0e331cd654
|
@ -118,62 +118,89 @@ _zsh_highlight_cursor_moved()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------------------------------
|
||||||
|
# Setup functions
|
||||||
|
# -------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Rebind all ZLE widgets to make them invoke _zsh_highlights.
|
||||||
|
_zsh_highlight_bind_widgets()
|
||||||
|
{
|
||||||
|
# Load ZSH module zsh/zleparameter, needed to override user defined widgets.
|
||||||
|
zmodload zsh/zleparameter 2>/dev/null || {
|
||||||
|
echo 'zsh-syntax-highlighting: failed loading zsh/zleparameter.' >&2
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Override ZLE widgets to make them invoke _zsh_highlight.
|
||||||
|
local cur_widget
|
||||||
|
for cur_widget in ${${(f)"$(builtin zle -la)"}:#(.*|orig-*|run-help|which-command|beep)}; do
|
||||||
|
case $widgets[$cur_widget] in
|
||||||
|
|
||||||
|
# Already rebound event: do nothing.
|
||||||
|
user:$cur_widget);;
|
||||||
|
|
||||||
|
# User defined widget: override and rebind old one with prefix "orig-".
|
||||||
|
user:*) eval "zle -N orig-$cur_widget ${widgets[$cur_widget]#*:}; \
|
||||||
|
_zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \
|
||||||
|
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
|
||||||
|
|
||||||
|
# Completion widget: override and rebind old one with prefix "orig-".
|
||||||
|
completion:*) eval "zle -C orig-$cur_widget ${${widgets[$cur_widget]#*:}/:/ }; \
|
||||||
|
_zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \
|
||||||
|
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
|
||||||
|
|
||||||
|
# Builtin widget: override and make it call the builtin ".widget".
|
||||||
|
builtin) eval "_zsh_highlight_widget_$cur_widget() { builtin zle .$cur_widget && _zsh_highlight }; \
|
||||||
|
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
|
||||||
|
|
||||||
|
# Default: unhandled case.
|
||||||
|
*) echo "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" >&2 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load highlighters from directory.
|
||||||
|
#
|
||||||
|
# Arguments:
|
||||||
|
# 1) Path to the highlighters directory.
|
||||||
|
_zsh_highlight_load_highlighters()
|
||||||
|
{
|
||||||
|
# Check the directory exists.
|
||||||
|
[[ -d "$1" ]] || {
|
||||||
|
echo "zsh-syntax-highlighting: highlighters directory '$1' not found." >&2
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load highlighters from highlighters directory and check they define required functions.
|
||||||
|
local highlighter highlighter_dir
|
||||||
|
for highlighter_dir ($1/*/); do
|
||||||
|
highlighter="${highlighter_dir:t}"
|
||||||
|
[[ -f "$highlighter_dir/${highlighter}-highlighter.zsh" ]] && {
|
||||||
|
. "$highlighter_dir/${highlighter}-highlighter.zsh"
|
||||||
|
type "_zsh_highlight_${highlighter}_highlighter" &> /dev/null &&
|
||||||
|
type "_zsh_highlight_${highlighter}_highlighter_predicate" &> /dev/null || {
|
||||||
|
echo "zsh-syntax-highlighting: '${highlighter}' highlighter should define both required functions '_zsh_highlight_${highlighter}_highlighter' and '_zsh_highlight_${highlighter}_highlighter_predicate' in '${highlighter_dir}/${highlighter}-highlighter.zsh'." >&2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------------------
|
||||||
# Setup
|
# Setup
|
||||||
# -------------------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
# Load ZSH module zsh/zleparameter, needed to override user defined widgets.
|
# Try binding widgets.
|
||||||
zmodload zsh/zleparameter 2>/dev/null || {
|
_zsh_highlight_bind_widgets || {
|
||||||
echo 'zsh-syntax-highlighting: failed loading zsh/zleparameter, exiting.' >&2
|
echo 'zsh-syntax-highlighting: failed binding ZLE widgets, exiting.' >&2
|
||||||
return -1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Resolve highlighters directory location.
|
# Resolve highlighters directory location.
|
||||||
highlighters_dir="${ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR:-${0:h}/highlighters}"
|
_zsh_highlight_load_highlighters "${ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR:-${0:h}/highlighters}" || {
|
||||||
[[ -d $highlighters_dir ]] || {
|
echo 'zsh-syntax-highlighting: failed loading highlighters, exiting.' >&2
|
||||||
echo "zsh-syntax-highlighting: highlighters directory '$highlighters_dir' not found, exiting." >&2
|
return 1
|
||||||
return -1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Override ZLE widgets to make them invoke _zsh_highlight.
|
|
||||||
for cur_widget in ${${(f)"$(builtin zle -la)"}:#(.*|orig-*|run-help|which-command|beep)}; do
|
|
||||||
case $widgets[$cur_widget] in
|
|
||||||
|
|
||||||
# Already rebound event: do nothing.
|
|
||||||
user:$cur_widget);;
|
|
||||||
|
|
||||||
# User defined widget: override and rebind old one with prefix "orig-".
|
|
||||||
user:*) eval "zle -N orig-$cur_widget ${widgets[$cur_widget]#*:}; \
|
|
||||||
_zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \
|
|
||||||
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
|
|
||||||
|
|
||||||
# Completion widget: override and rebind old one with prefix "orig-".
|
|
||||||
completion:*) eval "zle -C orig-$cur_widget ${${widgets[$cur_widget]#*:}/:/ }; \
|
|
||||||
_zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \
|
|
||||||
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
|
|
||||||
|
|
||||||
# Builtin widget: override and make it call the builtin ".widget".
|
|
||||||
builtin) eval "_zsh_highlight_widget_$cur_widget() { builtin zle .$cur_widget && _zsh_highlight }; \
|
|
||||||
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
|
|
||||||
|
|
||||||
# Default: unhandled case.
|
|
||||||
*) echo "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" >&2 ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
unset cur_widget
|
|
||||||
|
|
||||||
# Load highlighters from highlighters directory and check they define required functions.
|
|
||||||
for highlighter_dir ($highlighters_dir/*/); do
|
|
||||||
highlighter="${highlighter_dir:t}"
|
|
||||||
[[ -f "$highlighter_dir/${highlighter}-highlighter.zsh" ]] && {
|
|
||||||
. "$highlighter_dir/${highlighter}-highlighter.zsh"
|
|
||||||
type "_zsh_highlight_${highlighter}_highlighter" &> /dev/null &&
|
|
||||||
type "_zsh_highlight_${highlighter}_highlighter_predicate" &> /dev/null || {
|
|
||||||
echo "zsh-syntax-highlighting: '${highlighter}' highlighter should define both required functions '_zsh_highlight_${highlighter}_highlighter' and '_zsh_highlight_${highlighter}_highlighter_predicate' in '${highlighter_dir}/${highlighter}-highlighter.zsh'." >&2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
done
|
|
||||||
unset highlighter highlighter_dir highlighters_dir
|
|
||||||
|
|
||||||
# Initialize the array of active highlighters if needed.
|
# Initialize the array of active highlighters if needed.
|
||||||
[[ $#ZSH_HIGHLIGHT_HIGHLIGHTERS -eq 0 ]] && ZSH_HIGHLIGHT_HIGHLIGHTERS=(main)
|
[[ $#ZSH_HIGHLIGHT_HIGHLIGHTERS -eq 0 ]] && ZSH_HIGHLIGHT_HIGHLIGHTERS=(main)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user