diff --git a/README.md b/README.md index abf4790..a72ea01 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ This plugin works by triggering custom behavior when certain [zle widgets](http: - `ZSH_AUTOSUGGEST_CLEAR_WIDGETS`: Widgets in this array will clear the suggestion when invoked. - `ZSH_AUTOSUGGEST_ACCEPT_WIDGETS`: Widgets in this array will accept the suggestion when invoked. +- `ZSH_AUTOSUGGEST_EXECUTE_WIDGETS`: Widgets in this array will execute the suggestion when invoked. - `ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS`: Widgets in this array will partially accept the suggestion when invoked. Widgets not in any of these lists will update the suggestion when invoked. @@ -79,10 +80,11 @@ Widgets not in any of these lists will update the suggestion when invoked. ### Key Bindings -This plugin provides two widgets that you can use with `bindkey`: +This plugin provides three widgets that you can use with `bindkey`: 1. `autosuggest-accept`: Accepts the current suggestion. -2. `autosuggest-clear`: Clears the current suggestion. +2. `autosuggest-execute`: Accepts and executes the current suggestion. +3. `autosuggest-clear`: Clears the current suggestion. For example, this would bind ctrl + space to accept the current suggestion. diff --git a/src/bind.zsh b/src/bind.zsh index cc020de..030c6cf 100644 --- a/src/bind.zsh +++ b/src/bind.zsh @@ -55,6 +55,8 @@ _zsh_autosuggest_bind_widgets() { _zsh_autosuggest_bind_widget $widget clear elif [ ${ZSH_AUTOSUGGEST_ACCEPT_WIDGETS[(r)$widget]} ]; then _zsh_autosuggest_bind_widget $widget accept + elif [ ${ZSH_AUTOSUGGEST_EXECUTE_WIDGETS[(r)$widget]} ]; then + _zsh_autosuggest_bind_widget $widget execute elif [ ${ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS[(r)$widget]} ]; then _zsh_autosuggest_bind_widget $widget partial_accept else diff --git a/src/config.zsh b/src/config.zsh index b5a0f02..ae34f82 100644 --- a/src/config.zsh +++ b/src/config.zsh @@ -32,6 +32,10 @@ ZSH_AUTOSUGGEST_ACCEPT_WIDGETS=( vi-end-of-line ) +# Widgets that accept the entire suggestion and execute it +ZSH_AUTOSUGGEST_EXECUTE_WIDGETS=( +) + # Widgets that accept the suggestion as far as the cursor moves ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS=( forward-word diff --git a/src/widgets.zsh b/src/widgets.zsh index 1537b8a..3c75cd3 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -47,6 +47,17 @@ _zsh_autosuggest_accept() { _zsh_autosuggest_invoke_original_widget $@ } +# Accept the entire suggestion and execute it +_zsh_autosuggest_execute() { + # Add the suggestion to the buffer + BUFFER="$BUFFER$POSTDISPLAY" + + # Remove the suggestion + unset POSTDISPLAY + + zle .accept-line +} + # Partially accept the suggestion _zsh_autosuggest_partial_accept() { # Save the contents of the buffer so we can restore later if needed @@ -71,7 +82,7 @@ _zsh_autosuggest_partial_accept() { fi } -for action in clear modify accept partial_accept; do +for action in clear modify accept partial_accept execute; do eval "_zsh_autosuggest_widget_$action() { _zsh_autosuggest_highlight_reset _zsh_autosuggest_$action \$@ @@ -81,3 +92,4 @@ done zle -N autosuggest-accept _zsh_autosuggest_widget_accept zle -N autosuggest-clear _zsh_autosuggest_widget_clear +zle -N autosuggest-execute _zsh_autosuggest_widget_execute diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 552bbdf..6124953 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -58,6 +58,10 @@ ZSH_AUTOSUGGEST_ACCEPT_WIDGETS=( vi-end-of-line ) +# Widgets that accept the entire suggestion and execute it +ZSH_AUTOSUGGEST_EXECUTE_WIDGETS=( +) + # Widgets that accept the suggestion as far as the cursor moves ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS=( forward-word @@ -159,6 +163,8 @@ _zsh_autosuggest_bind_widgets() { _zsh_autosuggest_bind_widget $widget clear elif [ ${ZSH_AUTOSUGGEST_ACCEPT_WIDGETS[(r)$widget]} ]; then _zsh_autosuggest_bind_widget $widget accept + elif [ ${ZSH_AUTOSUGGEST_EXECUTE_WIDGETS[(r)$widget]} ]; then + _zsh_autosuggest_bind_widget $widget execute elif [ ${ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS[(r)$widget]} ]; then _zsh_autosuggest_bind_widget $widget partial_accept else @@ -252,6 +258,17 @@ _zsh_autosuggest_accept() { _zsh_autosuggest_invoke_original_widget $@ } +# Accept the entire suggestion and execute it +_zsh_autosuggest_execute() { + # Add the suggestion to the buffer + BUFFER="$BUFFER$POSTDISPLAY" + + # Remove the suggestion + unset POSTDISPLAY + + zle .accept-line +} + # Partially accept the suggestion _zsh_autosuggest_partial_accept() { # Save the contents of the buffer so we can restore later if needed @@ -276,7 +293,7 @@ _zsh_autosuggest_partial_accept() { fi } -for action in clear modify accept partial_accept; do +for action in clear modify accept partial_accept execute; do eval "_zsh_autosuggest_widget_$action() { _zsh_autosuggest_highlight_reset _zsh_autosuggest_$action \$@ @@ -286,6 +303,7 @@ done zle -N autosuggest-accept _zsh_autosuggest_widget_accept zle -N autosuggest-clear _zsh_autosuggest_widget_clear +zle -N autosuggest-execute _zsh_autosuggest_widget_execute #--------------------------------------------------------------------# # Suggestion #