From 6ec95379fa32e4d55360738616ae78240587dcc2 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sun, 15 Dec 2019 06:56:10 -0700 Subject: [PATCH] Call original widget before moving cursor when accepting suggestion The check on length of `$POSTDISPLAY` is in support of the test for `vi-delete` on the last char of the buffer with `dl`. Fixes issue #482. --- src/widgets.zsh | 13 ++++++++++--- zsh-autosuggestions.zsh | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/widgets.zsh b/src/widgets.zsh index c6f1137..8f09792 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -119,7 +119,7 @@ _zsh_autosuggest_suggest() { # Accept the entire suggestion _zsh_autosuggest_accept() { - local -i max_cursor_pos=$#BUFFER + local -i retval max_cursor_pos=$#BUFFER # When vicmd keymap is active, the cursor can't move all the way # to the end of the buffer @@ -127,7 +127,9 @@ _zsh_autosuggest_accept() { max_cursor_pos=$((max_cursor_pos - 1)) fi - if (( $CURSOR != $max_cursor_pos )); then + # If we're not in a valid state to accept a suggestion, just run the + # original widget and bail out + if (( $CURSOR != $max_cursor_pos || !$#POSTDISPLAY )); then _zsh_autosuggest_invoke_original_widget $@ return fi @@ -139,6 +141,11 @@ _zsh_autosuggest_accept() { # Remove the suggestion unset POSTDISPLAY + # Run the original widget before manually moving the cursor so that the + # cursor movement doesn't make the widget do something unexpected + _zsh_autosuggest_invoke_original_widget $@ + retval=$? + # Move the cursor to the end of the buffer if [[ "$KEYMAP" = "vicmd" ]]; then CURSOR=$(($#BUFFER - 1)) @@ -146,7 +153,7 @@ _zsh_autosuggest_accept() { CURSOR=$#BUFFER fi - _zsh_autosuggest_invoke_original_widget $@ + return $retval } # Accept the entire suggestion and execute it diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 899dcf3..0e1549a 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -381,7 +381,7 @@ _zsh_autosuggest_suggest() { # Accept the entire suggestion _zsh_autosuggest_accept() { - local -i max_cursor_pos=$#BUFFER + local -i retval max_cursor_pos=$#BUFFER # When vicmd keymap is active, the cursor can't move all the way # to the end of the buffer @@ -389,7 +389,9 @@ _zsh_autosuggest_accept() { max_cursor_pos=$((max_cursor_pos - 1)) fi - if (( $CURSOR != $max_cursor_pos )); then + # If we're not in a valid state to accept a suggestion, just run the + # original widget and bail out + if (( $CURSOR != $max_cursor_pos || !$#POSTDISPLAY )); then _zsh_autosuggest_invoke_original_widget $@ return fi @@ -401,6 +403,11 @@ _zsh_autosuggest_accept() { # Remove the suggestion unset POSTDISPLAY + # Run the original widget before manually moving the cursor so that the + # cursor movement doesn't make the widget do something unexpected + _zsh_autosuggest_invoke_original_widget $@ + retval=$? + # Move the cursor to the end of the buffer if [[ "$KEYMAP" = "vicmd" ]]; then CURSOR=$(($#BUFFER - 1)) @@ -408,7 +415,7 @@ _zsh_autosuggest_accept() { CURSOR=$#BUFFER fi - _zsh_autosuggest_invoke_original_widget $@ + return $retval } # Accept the entire suggestion and execute it