diff options
Diffstat (limited to 'Completion')
-rw-r--r-- | Completion/Builtins/_zle | 83 |
1 files changed, 75 insertions, 8 deletions
diff --git a/Completion/Builtins/_zle b/Completion/Builtins/_zle index e390382d4..8a84b3697 100644 --- a/Completion/Builtins/_zle +++ b/Completion/Builtins/_zle @@ -1,10 +1,77 @@ #compdef zle -local expl - -if [[ "$words[2]" = -N && CURRENT -eq 3 ]]; then - _wanted -C -N functions expl 'widget shell function' \ - compadd "$@" -k functions -else - _wanted widgets expl widget compadd -k widgets -fi +local expl ret=1 st +local -a opts compwids state + +compwids=(accept-and-menu-complete + complete-word + delete-char-or-list + expand-or-complete + expand-or-complete-prefix + list-choices + menu-complete + menu-expand-or-complete + reverse-menu-complete) + +opts=(-A -C -D -L -M -N -R -U -a -c -l \* :) + +_arguments -s \ + "($opts)-A[define widget alias]:old widget:->widget :new widget:->widget" \ + "($opts)-C[define completion widget]:new widget name:->comp-widget :completion widget:->builtin-comp-widget :widget shell function:->function" \ + "($opts)-D[delete widget]:*:widget:->widget" \ + "(${opts#-l})-L+[with -l, list as commands]:*:-:->listing" \ + "(${opts#-[La]})-l+[list user-defined widgets]:*:-:->listing" \ + "(${opts#-l})-a+[with -l, list all widgets]:*:-:->listing" \ + "($opts)-M[display message]:message: " \ + "($opts)-N[define new widget]:widget name:->widget-or-function ::widget shell function:->function" \ + "(${opts#-c})-R+[redisplay]:*:-:->redisplay" \ + "(${opts#-R})-c+[with -R, clear listing]:*:-:->redisplay" \ + "($opts)-U[unget to input stack]:string: " \ + '(-)::widget name:->call' + +[[ $state == listing ]] && + _arguments -s \ + "-l[list user-defined widgets]" \ + "(-a)-L[list as commands]" \ + "(-L)-a[list all widgets]" \ + '(-)*:widget name:->widget' + +for st in $state; do + case $st in + (call) + if ((CURRENT > 2)); then + _arguments \ + '(-N)-n[numeric prefix]:number: ' \ + '(-n)-N[reset numeric prefix]' \ + ':widget::' '(-)*:widget arguments: ' && ret=0 + # :widget:: is a placeholder so we needn't shift words + continue + fi + ;& + (widget*) + _wanted widgets expl widget compadd -k widgets && ret=0 + [[ $st != *function ]] && continue + ;& + (function) + _wanted functions expl 'widget shell function' \ + compadd -k functions && ret=0 + ;; + (comp-widget) + _wanted widgets expl 'completion widget' \ + compadd -k "widgets[(R)(*:|)(.|)(${(j(|))compwids})(|:*)]" && ret=0 + ;& + (builtin-comp-widget) + _wanted widgets expl 'builtin completion widget' \ + compadd -k "widgets[(I)(.|)(${(j(|))compwids})]" && ret=0 + ;; + (redisplay) + _arguments -s \ + "-R[redisplay]" \ + "(*)-c[clear listing]" \ + "(-)::status line: " "*:strings to list: " && ret=0 + ;; + (*) ret=$?;; + esac +done + +return ret |