diff options
Diffstat (limited to 'completions/function')
-rw-r--r-- | completions/function | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/completions/function b/completions/function index e8e4d751..fbcf10d2 100644 --- a/completions/function +++ b/completions/function @@ -6,17 +6,32 @@ _function() _init_completion || return if [[ $1 == @(declare|typeset) ]]; then - if [[ $prev == -f ]]; then - COMPREPLY=( $( compgen -A function -- "$cur" ) ) - elif [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '$( _parse_usage "$1" )' -- "$cur" ) ) + if [[ $cur == [-+]* ]]; then + local opts + opts=( $( _parse_usage "$1" ) ) + # Most options also have a '+' form. We'll exclude the ones that don't with compgen. + opts+=( ${opts[*]/-/+} ) + COMPREPLY=( $( compgen -W "${opts[*]}" -X '+[Ffgp]' -- "$cur" ) ) + else + local i=1 + while [[ ${words[i]} == [-+]* ]]; do + if [[ ${words[i]} == -*[fF]* ]]; then + COMPREPLY=( $( compgen -A function -- "$cur" ) ) + return + fi + ((i++)) + done + if [[ $i -gt 1 ]]; then + # There was at least one option and it was not one that limited operations to functions + COMPREPLY=( $( compgen -A variable -- "$cur" ) ) + fi fi elif [[ $cword -eq 1 ]]; then COMPREPLY=( $( compgen -A function -- "$cur" ) ) else - COMPREPLY=( "() $( type -- ${words[1]} | sed -e 1,2d )" ) + COMPREPLY=( "() $( type -- ${words[1]} | command sed -e 1,2d )" ) fi } && complete -F _function function declare typeset -# ex: ts=4 sw=4 et filetype=sh +# ex: filetype=sh |