diff --git a/README.md b/README.md index e419134..3a5c3f3 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ This plugin works by triggering custom behavior when certain [zle widgets](http: - `ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS`: Widgets in this array will partially accept the suggestion when invoked. - `ZSH_AUTOSUGGEST_IGNORE_WIDGETS`: Widgets in this array will not trigger any custom behavior. -Widgets not in any of these lists will update the suggestion when invoked. +Widgets that modify the buffer and are not found in any of these arrays will fetch a new suggestion after they are invoked. **Note:** A widget shouldn't belong to more than one of the above arrays. diff --git a/src/widgets.zsh b/src/widgets.zsh index 9e0b568..57f378e 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -15,13 +15,23 @@ _zsh_autosuggest_clear() { _zsh_autosuggest_modify() { local -i retval + # Save the contents of the buffer/postdisplay + local orig_buffer="$BUFFER" + local orig_postdisplay="$POSTDISPLAY" + # Clear suggestion while original widget runs unset POSTDISPLAY - # Original widget modifies the buffer + # Original widget may modify the buffer _zsh_autosuggest_invoke_original_widget $@ retval=$? + # Don't fetch a new suggestion if the buffer hasn't changed + if [ "$BUFFER" = "$orig_buffer" ]; then + POSTDISPLAY="$orig_postdisplay" + return $retval + fi + # Get a new suggestion if the buffer is not empty after modification local suggestion if [ $#BUFFER -gt 0 ]; then diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 9394cf8..a40cbdc 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -256,13 +256,23 @@ _zsh_autosuggest_clear() { _zsh_autosuggest_modify() { local -i retval + # Save the contents of the buffer/postdisplay + local orig_buffer="$BUFFER" + local orig_postdisplay="$POSTDISPLAY" + # Clear suggestion while original widget runs unset POSTDISPLAY - # Original widget modifies the buffer + # Original widget may modify the buffer _zsh_autosuggest_invoke_original_widget $@ retval=$? + # Don't fetch a new suggestion if the buffer hasn't changed + if [ "$BUFFER" = "$orig_buffer" ]; then + POSTDISPLAY="$orig_postdisplay" + return $retval + fi + # Get a new suggestion if the buffer is not empty after modification local suggestion if [ $#BUFFER -gt 0 ]; then