From 606c81a01b408a64816e4a02d1de9a17e9c725ca Mon Sep 17 00:00:00 2001 From: Kordan Ou Date: Sat, 20 Feb 2016 21:52:21 +0800 Subject: [PATCH] Add an autosuggest widget: autosuggest-execute. --- README.md | 6 ++++-- src/bind.zsh | 2 ++ src/config.zsh | 4 ++++ src/widgets.zsh | 14 +++++++++++++- zsh-autosuggestions.zsh | 20 +++++++++++++++++++- 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7ba869a..9fe6b6a 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,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. @@ -78,10 +79,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 c8d6f0a..ca76de9 100644 --- a/src/config.zsh +++ b/src/config.zsh @@ -30,6 +30,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 81aa947..28c0952 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -56,6 +56,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 @@ -157,6 +161,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 @@ -250,6 +256,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 @@ -274,7 +291,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 \$@ @@ -284,6 +301,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 #