Fix issues with widgets wrapped by other plugins
Puts in a better fix for #126 and related issues.
This commit is contained in:
40
src/bind.zsh
40
src/bind.zsh
@@ -3,12 +3,34 @@
|
||||
# Widget Helpers #
|
||||
#--------------------------------------------------------------------#
|
||||
|
||||
_zsh_autosuggest_incr_bind_count() {
|
||||
if ((${+_ZSH_AUTOSUGGEST_BIND_COUNTS[$1]})); then
|
||||
((_ZSH_AUTOSUGGEST_BIND_COUNTS[$1]++))
|
||||
else
|
||||
_ZSH_AUTOSUGGEST_BIND_COUNTS[$1]=1
|
||||
fi
|
||||
|
||||
bind_count=$_ZSH_AUTOSUGGEST_BIND_COUNTS[$1]
|
||||
}
|
||||
|
||||
_zsh_autosuggest_get_bind_count() {
|
||||
if ((${+_ZSH_AUTOSUGGEST_BIND_COUNTS[$1]})); then
|
||||
bind_count=$_ZSH_AUTOSUGGEST_BIND_COUNTS[$1]
|
||||
else
|
||||
bind_count=0
|
||||
fi
|
||||
}
|
||||
|
||||
# Bind a single widget to an autosuggest widget, saving a reference to the original widget
|
||||
_zsh_autosuggest_bind_widget() {
|
||||
typeset -gA _ZSH_AUTOSUGGEST_BIND_COUNTS
|
||||
|
||||
local widget=$1
|
||||
local autosuggest_action=$2
|
||||
local prefix=$ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX
|
||||
|
||||
local -i bind_count
|
||||
|
||||
# Save a reference to the original widget
|
||||
case $widgets[$widget] in
|
||||
# Already bound
|
||||
@@ -16,34 +38,38 @@ _zsh_autosuggest_bind_widget() {
|
||||
|
||||
# User-defined widget
|
||||
user:*)
|
||||
zle -l "$prefix$widget" && zle -N "$widget" ${widgets[$prefix$widget]#*:}
|
||||
zle -N $prefix$widget ${widgets[$widget]#*:}
|
||||
_zsh_autosuggest_incr_bind_count $widget
|
||||
zle -N $prefix${bind_count}-$widget ${widgets[$widget]#*:}
|
||||
;;
|
||||
|
||||
# Built-in widget
|
||||
builtin)
|
||||
_zsh_autosuggest_incr_bind_count $widget
|
||||
eval "_zsh_autosuggest_orig_${(q)widget}() { zle .${(q)widget} }"
|
||||
zle -N $prefix$widget _zsh_autosuggest_orig_$widget
|
||||
zle -N $prefix${bind_count}-$widget _zsh_autosuggest_orig_$widget
|
||||
;;
|
||||
|
||||
# Completion widget
|
||||
completion:*)
|
||||
eval "zle -C $prefix${(q)widget} ${${(s.:.)widgets[$widget]}[2,3]}"
|
||||
_zsh_autosuggest_incr_bind_count $widget
|
||||
eval "zle -C $prefix${bind_count}-${(q)widget} ${${(s.:.)widgets[$widget]}[2,3]}"
|
||||
;;
|
||||
esac
|
||||
|
||||
_zsh_autosuggest_get_bind_count $widget
|
||||
|
||||
# Pass the original widget's name explicitly into the autosuggest
|
||||
# function. Use this passed in widget name to call the original
|
||||
# widget instead of relying on the $WIDGET variable being set
|
||||
# correctly. $WIDGET cannot be trusted because other plugins call
|
||||
# zle without the `-w` flag (e.g. `zle self-insert` instead of
|
||||
# `zle self-insert -w`).
|
||||
eval "_zsh_autosuggest_bound_${(q)widget}() {
|
||||
_zsh_autosuggest_widget_$autosuggest_action $prefix${(q)widget} \$@
|
||||
eval "_zsh_autosuggest_bound_${bind_count}_${(q)widget}() {
|
||||
_zsh_autosuggest_widget_$autosuggest_action $prefix$bind_count-${(q)widget} \$@
|
||||
}"
|
||||
|
||||
# Create the bound widget
|
||||
zle -N $widget _zsh_autosuggest_bound_$widget
|
||||
zle -N $widget _zsh_autosuggest_bound_${bind_count}_$widget
|
||||
}
|
||||
|
||||
# Map all configured widgets to the right autosuggest widgets
|
||||
|
||||
Reference in New Issue
Block a user