zsh-autosuggestions/src/widgets.zsh

128 lines
3 KiB
Bash
Raw Normal View History

2016-02-05 23:14:08 +01:00
2016-02-14 08:29:43 +01:00
#--------------------------------------------------------------------#
# Autosuggest Widget Implementations #
#--------------------------------------------------------------------#
2016-02-05 23:14:08 +01:00
# Clear the suggestion
_zsh_autosuggest_clear() {
# Remove the suggestion
unset POSTDISPLAY
_zsh_autosuggest_invoke_original_widget $@
2016-02-05 23:14:08 +01:00
}
# Modify the buffer and get a new suggestion
_zsh_autosuggest_modify() {
local -i retval
# Clear suggestion while original widget runs
unset POSTDISPLAY
2016-02-05 23:14:08 +01:00
# Original widget modifies the buffer
_zsh_autosuggest_invoke_original_widget $@
retval=$?
2016-02-05 23:14:08 +01:00
# Get a new suggestion if the buffer is not empty after modification
local suggestion
if [ $#BUFFER -gt 0 ]; then
if [ -z "$ZSH_BUFFER_MAX_SIZE" -o $#BUFFER -lt "$ZSH_BUFFER_MAX_SIZE" ]; then
suggestion="$(_zsh_autosuggest_suggestion "$BUFFER")"
fi
2016-02-05 23:14:08 +01:00
fi
# Add the suggestion to the POSTDISPLAY
if [ -n "$suggestion" ]; then
2016-03-06 05:03:14 +01:00
POSTDISPLAY="${suggestion#$BUFFER}"
2016-02-05 23:14:08 +01:00
else
unset POSTDISPLAY
fi
return $retval
2016-02-05 23:14:08 +01:00
}
# Accept the entire suggestion
_zsh_autosuggest_accept() {
2016-03-15 04:41:14 +01:00
local -i max_cursor_pos=$#BUFFER
# When vicmd keymap is active, the cursor can't move all the way
# to the end of the buffer
if [ "$KEYMAP" = "vicmd" ]; then
max_cursor_pos=$((max_cursor_pos - 1))
fi
2016-02-05 23:14:08 +01:00
# Only accept if the cursor is at the end of the buffer
2016-03-15 04:41:14 +01:00
if [ $CURSOR -eq $max_cursor_pos ]; then
2016-02-05 23:14:08 +01:00
# Add the suggestion to the buffer
BUFFER="$BUFFER$POSTDISPLAY"
# Remove the suggestion
unset POSTDISPLAY
# Move the cursor to the end of the buffer
CURSOR=${#BUFFER}
fi
_zsh_autosuggest_invoke_original_widget $@
2016-02-05 23:14:08 +01:00
}
# Accept the entire suggestion and execute it
_zsh_autosuggest_execute() {
# Add the suggestion to the buffer
BUFFER="$BUFFER$POSTDISPLAY"
# Remove the suggestion
unset POSTDISPLAY
# Call the original `accept-line` to handle syntax highlighting or
# other potential custom behavior
_zsh_autosuggest_invoke_original_widget "accept-line"
}
2016-02-05 23:14:08 +01:00
# Partially accept the suggestion
_zsh_autosuggest_partial_accept() {
local -i retval
2016-02-05 23:14:08 +01:00
# Save the contents of the buffer so we can restore later if needed
2016-03-06 05:03:14 +01:00
local original_buffer="$BUFFER"
2016-02-05 23:14:08 +01:00
# Temporarily accept the suggestion.
BUFFER="$BUFFER$POSTDISPLAY"
# Original widget moves the cursor
_zsh_autosuggest_invoke_original_widget $@
retval=$?
2016-02-05 23:14:08 +01:00
# If we've moved past the end of the original buffer
if [ $CURSOR -gt $#original_buffer ]; then
# Set POSTDISPLAY to text right of the cursor
2016-03-06 05:03:14 +01:00
POSTDISPLAY="$RBUFFER"
2016-02-05 23:14:08 +01:00
# Clip the buffer at the cursor
2016-03-06 05:03:14 +01:00
BUFFER="$LBUFFER"
2016-02-05 23:14:08 +01:00
else
# Restore the original buffer
2016-03-06 05:03:14 +01:00
BUFFER="$original_buffer"
2016-02-05 23:14:08 +01:00
fi
return $retval
2016-02-05 23:14:08 +01:00
}
for action in clear modify accept partial_accept execute; do
eval "_zsh_autosuggest_widget_$action() {
local -i retval
_zsh_autosuggest_highlight_reset
_zsh_autosuggest_$action \$@
retval=\$?
_zsh_autosuggest_highlight_apply
return \$retval
}"
done
2016-02-05 23:14:08 +01:00
zle -N autosuggest-accept _zsh_autosuggest_widget_accept
zle -N autosuggest-clear _zsh_autosuggest_widget_clear
zle -N autosuggest-execute _zsh_autosuggest_widget_execute