Restore standard widgets to fix segfault when re-sourcing autosuggestions.zsh

This commit is contained in:
Eric Freese 2016-01-20 01:38:51 -07:00
parent 7a00bfa444
commit 8777836a1c

View file

@ -46,21 +46,23 @@ ZLE_AUTOSUGGEST_ACCEPT_WIDGETS=(
vi-add-next vi-forward-blank-word vi-end-of-line end-of-line
)
ZLE_AUTOSUGGEST_ALL_WIDGETS=(
self-insert magic-space backward-delete-char accept-line
$ZLE_AUTOSUGGEST_ACCEPT_WIDGETS
$ZLE_AUTOSUGGEST_SUSPEND_WIDGETS
$ZLE_AUTOSUGGEST_COMPLETION_WIDGETS
)
autosuggest-pause() {
[[ -z $ZLE_AUTOSUGGESTING ]] && return
unset ZLE_AUTOSUGGESTING
local widget
# Restore standard widgets except for self-insert, which triggers resume
autosuggest-restore-widgets
zle -A autosuggest-paused-self-insert self-insert
# When autosuggestions are disabled, kill the unmaterialized part
RBUFFER=''
zle -A autosuggest-paused-self-insert self-insert
zle -A autosuggest-magic-space-orig magic-space
zle -A autosuggest-backward-delete-char-orig backward-delete-char
zle -A autosuggest-accept-line-orig accept-line
for widget in $ZLE_AUTOSUGGEST_ACCEPT_WIDGETS $ZLE_AUTOSUGGEST_SUSPEND_WIDGETS $ZLE_AUTOSUGGEST_COMPLETION_WIDGETS; do
[[ -z $widgets[$widget] || -z $widgets[autosuggest-${widget}-orig] ]] &&\
continue
eval "zle -A autosuggest-${widget}-orig ${widget}"
done
autosuggest-highlight-suggested-text
if [[ -n $ZLE_AUTOSUGGEST_CONNECTION ]]; then
@ -71,27 +73,7 @@ autosuggest-pause() {
autosuggest-resume() {
[[ -n $ZLE_AUTOSUGGESTING ]] && return
ZLE_AUTOSUGGESTING=1
local widget
# Replace prediction widgets by versions that will also highlight RBUFFER
zle -A autosuggest-insert-or-space self-insert
zle -A autosuggest-insert-or-space magic-space
zle -A autosuggest-backward-delete-char backward-delete-char
zle -A autosuggest-accept-line accept-line
# Hook into some default widgets that should suspend autosuggestion
# automatically
for widget in $ZLE_AUTOSUGGEST_ACCEPT_WIDGETS; do
[[ -z $widgets[$widget] ]] && continue
eval "zle -A autosuggest-accept-suggestion $widget"
done
for widget in $ZLE_AUTOSUGGEST_SUSPEND_WIDGETS; do
[[ -z $widgets[$widget] ]] && continue
eval "zle -A autosuggest-suspend $widget"
done
# Hook into completion widgets to trim RBUFFER before completion
for widget in $ZLE_AUTOSUGGEST_COMPLETION_WIDGETS; do
[[ -z $widgets[$widget] ]] && continue
eval "zle -A autosuggest-tab $widget"
done
autosuggest-hook-widgets
if [[ -n $ZLE_AUTOSUGGEST_CONNECTION ]]; then
# install listen for suggestions asynchronously
zle -Fw $ZLE_AUTOSUGGEST_CONNECTION autosuggest-pop-suggestion
@ -111,7 +93,7 @@ autosuggest-start() {
autosuggest-toggle() {
if [[ -n $ZLE_AUTOSUGGESTING ]]; then
autosuggest-pause
zle -A autosuggest-self-insert-orig self-insert
zle -A .self-insert self-insert
else
autosuggest-resume
fi
@ -194,7 +176,7 @@ autosuggest-paused-self-insert() {
autosuggest-resume
zle self-insert
else
zle autosuggest-self-insert-orig
zle .self-insert
fi
}
@ -228,21 +210,21 @@ autosuggest-pop-suggestion() {
autosuggest-suspend() {
autosuggest-pause
zle autosuggest-${WIDGET}-orig "$@"
zle .${WIDGET} "$@"
}
autosuggest-tab() {
RBUFFER=''
zle autosuggest-${WIDGET}-orig "$@"
zle .${WIDGET} "$@"
autosuggest-invalidate-highlight-cache
autosuggest-highlight-suggested-text
}
autosuggest-accept-suggestion() {
if [[ AUTOSUGGESTION_ACCEPT_RIGHT_ARROW -eq 1 && ("$WIDGET" == 'forward-char' || "$WIDGET" == 'vi-forward-char') ]]; then
zle autosuggest-end-of-line-orig "$@"
zle .end-of-line "$@"
else
zle autosuggest-${WIDGET}-orig "$@"
zle .${WIDGET} "$@"
fi
if [[ -n $ZLE_AUTOSUGGESTING ]]; then
autosuggest-invalidate-highlight-cache
@ -252,7 +234,7 @@ autosuggest-accept-suggestion() {
autosuggest-execute-suggestion() {
if [[ -n $ZLE_AUTOSUGGESTING ]]; then
zle autosuggest-end-of-line-orig
zle .end-of-line
autosuggest-invalidate-highlight-cache
autosuggest-highlight-suggested-text
fi
@ -264,6 +246,36 @@ autosuggest-invalidate-highlight-cache() {
_zsh_highlight_autosuggest_highlighter_cache=()
}
autosuggest-restore-widgets() {
for widget in $ZLE_AUTOSUGGEST_ALL_WIDGETS; do
[[ -z $widgets[$widget] ]] && continue
zle -A .${widget} ${widget}
done
}
autosuggest-hook-widgets() {
local widget
# Replace prediction widgets by versions that will also highlight RBUFFER
zle -A autosuggest-insert-or-space self-insert
zle -A autosuggest-insert-or-space magic-space
zle -A autosuggest-backward-delete-char backward-delete-char
zle -A autosuggest-accept-line accept-line
# Hook into some default widgets that should suspend autosuggestion
# automatically
for widget in $ZLE_AUTOSUGGEST_ACCEPT_WIDGETS; do
[[ -z $widgets[$widget] ]] && continue
eval "zle -A autosuggest-accept-suggestion $widget"
done
for widget in $ZLE_AUTOSUGGEST_SUSPEND_WIDGETS; do
[[ -z $widgets[$widget] ]] && continue
eval "zle -A autosuggest-suspend $widget"
done
for widget in $ZLE_AUTOSUGGEST_COMPLETION_WIDGETS; do
[[ -z $widgets[$widget] ]] && continue
eval "zle -A autosuggest-tab $widget"
done
}
zle -N autosuggest-toggle
zle -N autosuggest-start
zle -N autosuggest-accept-suggested-small-word
@ -279,13 +291,4 @@ zle -N autosuggest-tab
zle -N autosuggest-suspend
zle -N autosuggest-accept-suggestion
# Save all widgets
zle -A self-insert autosuggest-self-insert-orig
zle -A magic-space autosuggest-magic-space-orig
zle -A backward-delete-char autosuggest-backward-delete-char-orig
zle -A accept-line autosuggest-accept-line-orig
for widget in ${ZLE_AUTOSUGGEST_ACCEPT_WIDGETS} ${ZLE_AUTOSUGGEST_SUSPEND_WIDGETS} ${ZLE_AUTOSUGGEST_COMPLETION_WIDGETS}; do
[[ -z $widgets[$widget] ]] && continue
eval "zle -A $widget autosuggest-${widget}-orig"
done
autosuggest-restore-widgets