Mercurial > dotfiles
comparison .zfun/zsh-autosuggestions/src/bind.zsh @ 467:e1ce8897030d
zsh: import df6f6f9ff41 of zsh-autosuggestions
| author | Augie Fackler <raf@durin42.com> |
|---|---|
| date | Mon, 03 Dec 2018 22:37:29 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 466:f248cf012d9a | 467:e1ce8897030d |
|---|---|
| 1 | |
| 2 #--------------------------------------------------------------------# | |
| 3 # Widget Helpers # | |
| 4 #--------------------------------------------------------------------# | |
| 5 | |
| 6 _zsh_autosuggest_incr_bind_count() { | |
| 7 if ((${+_ZSH_AUTOSUGGEST_BIND_COUNTS[$1]})); then | |
| 8 ((_ZSH_AUTOSUGGEST_BIND_COUNTS[$1]++)) | |
| 9 else | |
| 10 _ZSH_AUTOSUGGEST_BIND_COUNTS[$1]=1 | |
| 11 fi | |
| 12 | |
| 13 typeset -gi bind_count=$_ZSH_AUTOSUGGEST_BIND_COUNTS[$1] | |
| 14 } | |
| 15 | |
| 16 _zsh_autosuggest_get_bind_count() { | |
| 17 if ((${+_ZSH_AUTOSUGGEST_BIND_COUNTS[$1]})); then | |
| 18 typeset -gi bind_count=$_ZSH_AUTOSUGGEST_BIND_COUNTS[$1] | |
| 19 else | |
| 20 typeset -gi bind_count=0 | |
| 21 fi | |
| 22 } | |
| 23 | |
| 24 # Bind a single widget to an autosuggest widget, saving a reference to the original widget | |
| 25 _zsh_autosuggest_bind_widget() { | |
| 26 typeset -gA _ZSH_AUTOSUGGEST_BIND_COUNTS | |
| 27 | |
| 28 local widget=$1 | |
| 29 local autosuggest_action=$2 | |
| 30 local prefix=$ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX | |
| 31 | |
| 32 local -i bind_count | |
| 33 | |
| 34 # Save a reference to the original widget | |
| 35 case $widgets[$widget] in | |
| 36 # Already bound | |
| 37 user:_zsh_autosuggest_(bound|orig)_*);; | |
| 38 | |
| 39 # User-defined widget | |
| 40 user:*) | |
| 41 _zsh_autosuggest_incr_bind_count $widget | |
| 42 zle -N $prefix${bind_count}-$widget ${widgets[$widget]#*:} | |
| 43 ;; | |
| 44 | |
| 45 # Built-in widget | |
| 46 builtin) | |
| 47 _zsh_autosuggest_incr_bind_count $widget | |
| 48 eval "_zsh_autosuggest_orig_${(q)widget}() { zle .${(q)widget} }" | |
| 49 zle -N $prefix${bind_count}-$widget _zsh_autosuggest_orig_$widget | |
| 50 ;; | |
| 51 | |
| 52 # Completion widget | |
| 53 completion:*) | |
| 54 _zsh_autosuggest_incr_bind_count $widget | |
| 55 eval "zle -C $prefix${bind_count}-${(q)widget} ${${(s.:.)widgets[$widget]}[2,3]}" | |
| 56 ;; | |
| 57 esac | |
| 58 | |
| 59 _zsh_autosuggest_get_bind_count $widget | |
| 60 | |
| 61 # Pass the original widget's name explicitly into the autosuggest | |
| 62 # function. Use this passed in widget name to call the original | |
| 63 # widget instead of relying on the $WIDGET variable being set | |
| 64 # correctly. $WIDGET cannot be trusted because other plugins call | |
| 65 # zle without the `-w` flag (e.g. `zle self-insert` instead of | |
| 66 # `zle self-insert -w`). | |
| 67 eval "_zsh_autosuggest_bound_${bind_count}_${(q)widget}() { | |
| 68 _zsh_autosuggest_widget_$autosuggest_action $prefix$bind_count-${(q)widget} \$@ | |
| 69 }" | |
| 70 | |
| 71 # Create the bound widget | |
| 72 zle -N -- $widget _zsh_autosuggest_bound_${bind_count}_$widget | |
| 73 } | |
| 74 | |
| 75 # Map all configured widgets to the right autosuggest widgets | |
| 76 _zsh_autosuggest_bind_widgets() { | |
| 77 emulate -L zsh | |
| 78 | |
| 79 local widget | |
| 80 local ignore_widgets | |
| 81 | |
| 82 ignore_widgets=( | |
| 83 .\* | |
| 84 _\* | |
| 85 zle-\* | |
| 86 autosuggest-\* | |
| 87 $ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX\* | |
| 88 $ZSH_AUTOSUGGEST_IGNORE_WIDGETS | |
| 89 ) | |
| 90 | |
| 91 # Find every widget we might want to bind and bind it appropriately | |
| 92 for widget in ${${(f)"$(builtin zle -la)"}:#${(j:|:)~ignore_widgets}}; do | |
| 93 if [[ -n ${ZSH_AUTOSUGGEST_CLEAR_WIDGETS[(r)$widget]} ]]; then | |
| 94 _zsh_autosuggest_bind_widget $widget clear | |
| 95 elif [[ -n ${ZSH_AUTOSUGGEST_ACCEPT_WIDGETS[(r)$widget]} ]]; then | |
| 96 _zsh_autosuggest_bind_widget $widget accept | |
| 97 elif [[ -n ${ZSH_AUTOSUGGEST_EXECUTE_WIDGETS[(r)$widget]} ]]; then | |
| 98 _zsh_autosuggest_bind_widget $widget execute | |
| 99 elif [[ -n ${ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS[(r)$widget]} ]]; then | |
| 100 _zsh_autosuggest_bind_widget $widget partial_accept | |
| 101 else | |
| 102 # Assume any unspecified widget might modify the buffer | |
| 103 _zsh_autosuggest_bind_widget $widget modify | |
| 104 fi | |
| 105 done | |
| 106 } | |
| 107 | |
| 108 # Given the name of an original widget and args, invoke it, if it exists | |
| 109 _zsh_autosuggest_invoke_original_widget() { | |
| 110 # Do nothing unless called with at least one arg | |
| 111 (( $# )) || return 0 | |
| 112 | |
| 113 local original_widget_name="$1" | |
| 114 | |
| 115 shift | |
| 116 | |
| 117 if (( ${+widgets[$original_widget_name]} )); then | |
| 118 zle $original_widget_name -- $@ | |
| 119 fi | |
| 120 } |
