This commit is contained in:
Eric Freese 2016-01-26 20:51:44 -07:00
commit fc3f368acf
15 changed files with 224 additions and 708 deletions

53
lib/widget/hook.zsh Normal file
View file

@ -0,0 +1,53 @@
_zsh_autosuggest_is_defined_widget() {
[ -n "$widgets[$1]" ]
}
_zsh_autosuggest_is_built_in_widget() {
[ -n "$widgets[.$1]" ]
}
_zsh_autosuggest_is_original_widget_defined() {
_zsh_autosuggest_is_defined_widget $(_zsh_autosuggest_original_widget $1)
}
_zsh_autosuggest_original_widget() {
if _zsh_autosuggest_is_built_in_widget $1; then
echo ".$1"
else
echo "_autosuggest_original_$1"
fi
}
_zsh_autosuggest_hook_widget() {
local autosuggest_widget=$1
local widget=$2
# Skip if the widget does not exist
if ! _zsh_autosuggest_is_defined_widget $widget; then
continue
fi
# Alias if dot-prefixed alias is unavailable and we haven't already aliased it
if ! _zsh_autosuggest_is_original_widget_defined $widget; then
zle -A $widget $(_zsh_autosuggest_original_widget $widget)
fi
# Hook it
zle -A $autosuggest_widget $widget
}
_zsh_autosuggest_hook_widgets() {
local widget
for widget in $ZSH_AUTOSUGGEST_MODIFY_WIDGETS; do
_zsh_autosuggest_hook_widget _zsh_autosuggest_widget_modify $widget
done
for widget in $ZSH_AUTOSUGGEST_CLEAR_WIDGETS; do
_zsh_autosuggest_hook_widget _zsh_autosuggest_widget_clear $widget
done
for widget in $ZSH_AUTOSUGGEST_ACCEPT_WIDGETS; do
_zsh_autosuggest_hook_widget _zsh_autosuggest_widget_accept $widget
done
}

42
lib/widget/widgets.zsh Normal file
View file

@ -0,0 +1,42 @@
# Buffer was modified, update suggestion
_zsh_autosuggest_widget_modify() {
local suggestion
zle $(_zsh_autosuggest_original_widget $WIDGET) $@
if [ $#BUFFER -gt 0 ]; then
suggestion=$(_zsh_autosuggest_get_suggestion $BUFFER)
fi
if [ -n "$suggestion" ]; then
POSTDISPLAY=${suggestion#$BUFFER}
else
unset POSTDISPLAY
fi
_zsh_autosuggest_highlight
}
# Clear command triggered, hide the suggestion
_zsh_autosuggest_widget_clear() {
unset POSTDISPLAY
_zsh_autosuggest_highlight
zle $(_zsh_autosuggest_original_widget $WIDGET) $@
}
# Suggestion accepted, add it to the buffer
_zsh_autosuggest_widget_accept() {
if [ $CURSOR -eq $#BUFFER ]; then
BUFFER="$BUFFER$POSTDISPLAY"
unset POSTDISPLAY
CURSOR=${#BUFFER}
_zsh_autosuggest_highlight
else
zle $(_zsh_autosuggest_original_widget $WIDGET) $@
fi
}
# Create the widgets
zle -N _zsh_autosuggest_widget_modify
zle -N _zsh_autosuggest_widget_clear
zle -N _zsh_autosuggest_widget_accept