diff options
Diffstat (limited to 'completions/ip')
-rw-r--r-- | completions/ip | 217 |
1 files changed, 122 insertions, 95 deletions
diff --git a/completions/ip b/completions/ip index 12ad9aa..511f206 100644 --- a/completions/ip +++ b/completions/ip @@ -1,58 +1,78 @@ # ip(8) completion -*- shell-script -*- -_iproute2_etc() +_comp_cmd_ip__iproute2_etc() { - COMPREPLY+=($(compgen -W \ - "$(awk '!/#/ { print $2 }' /etc/iproute2/$1 2>/dev/null)" \ - -- "$cur")) + _comp_compgen -a split -- "$(_comp_awk '!/#/ { print $2 }' "/etc/iproute2/$1" \ + 2>/dev/null)" } -_ip() +_comp_cmd_ip__netns() { - local cur prev words cword - _init_completion || return + _comp_compgen_split -- "$( + { + ${1-ip} -c=never netns list 2>/dev/null || ${1-ip} netns list + } | _comp_awk '{print $1}' + )" +} + +_comp_cmd_ip() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in - -V | -Version | -rc | -rcvbuf) + -V | -Version | -rc | -rcvbuf | -l | -loops) return ;; -f | -family) - COMPREPLY=($(compgen -W 'inet inet6 ipx dnet link' -- "$cur")) + _comp_compgen -- -W 'inet inet6 ipx dnet link' return ;; -b | -batch) - _filedir + _comp_compgen_filedir + return + ;; + -n | -netns) + _comp_cmd_ip__netns "$1" return ;; -force) - COMPREPLY=($(compgen -W '-batch' -- "$cur")) + _comp_compgen -- -W '-batch' return ;; esac - local subcword cmd subcmd="" - for ((subcword = 1; subcword < ${#words[@]} - 1; subcword++)); do + local subcword cmd="" has_cmd="" subcmd="" + for ((subcword = 1; subcword < cword; subcword++)); do [[ ${words[subcword]} == -b?(atch) ]] && return - [[ -v cmd ]] && subcmd=${words[subcword]} && break - [[ ${words[subcword]} != -* && \ - ${words[subcword - 1]} != -@(f?(amily)|rc?(vbuf)) ]] && - cmd=${words[subcword]} + [[ $has_cmd ]] && subcmd=${words[subcword]} && break + [[ ${words[subcword]} != -* && + ${words[subcword - 1]} != -@(f?(amily)|rc?(vbuf)) ]] && + cmd=${words[subcword]} has_cmd=set done - if [[ ! -v cmd ]]; then + if [[ ! $has_cmd ]]; then case $cur in -*) - local c="-Version -statistics -details -resolve -family - -oneline -timestamp -batch -rcvbuf" - ((cword == 1)) && c+=" -force" - COMPREPLY=($(compgen -W "$c" -- "$cur")) + _comp_compgen -a help - <<<"$( + ((cword == 1)) && printf '%s\n' -force + { + "$1" -c=never help || "$1" help + } 2>&1 | command sed -e \ + 's/[{|}=]/\n/g' -e \ + 's/\[\([^]]\{1,\}\)\]/\1/g' + )" ;; *) - COMPREPLY=($(compgen -W "help $($1 help 2>&1 | command sed -e \ - '/OBJECT := /,/}/!d' -e \ - 's/.*{//' -e \ - 's/}.*//' -e \ - 's/|//g')" -- "$cur")) + _comp_compgen_split -- "help $( + { + $1 -c=never help || $1 help + } 2>&1 | command sed -e \ + '/OBJECT := /,/}/!d' -e \ + 's/.*{//' -e \ + 's/}.*//' -e \ + 's/|//g' + )" ;; esac return @@ -69,26 +89,26 @@ _ip() delete) case $((cword - subcword)) in 1) - _available_interfaces + _comp_compgen_available_interfaces ;; 2) - COMPREPLY=($(compgen -W 'type' -- "$cur")) + _comp_compgen -- -W 'type' ;; 3) [[ $prev == type ]] && - COMPREPLY=($(compgen -W 'vlan veth vcan dummy - ifb macvlan can' -- "$cur")) + _comp_compgen -- -W 'vlan veth vcan dummy ifb + macvlan can' ;; esac ;; set) if ((cword - subcword == 1)); then - _available_interfaces + _comp_compgen_available_interfaces else case $prev in arp | dynamic | multicast | allmulticast | promisc | \ trailers) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' ;; txqueuelen | name | address | broadcast | mtu | netns | alias) ;; @@ -97,25 +117,24 @@ _ip() promisc trailers txqueuelen name address broadcast mtu netns alias" [[ $prev != @(up|down) ]] && c+=" up down" - COMPREPLY=($(compgen -W "$c" -- "$cur")) + _comp_compgen -- -W "$c" ;; esac fi ;; show) if ((cword == subcword + 1)); then - _available_interfaces - COMPREPLY+=($(compgen -W 'dev group up' -- "$cur")) + _comp_compgen_available_interfaces + _comp_compgen -a -- -W 'dev group up' elif [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces elif [[ $prev == group ]]; then - _iproute2_etc group + _comp_cmd_ip__iproute2_etc group fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add delete set show' \ - -- "$cur")) + _comp_compgen -- -W 'help add delete set show' ;; esac ;; @@ -124,38 +143,38 @@ _ip() case $subcmd in add | change | replace) if [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces elif [[ $prev == scope ]]; then - _iproute2_etc rt_scopes + _comp_cmd_ip__iproute2_etc rt_scopes else : # TODO fi ;; del) if [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces elif [[ $prev == scope ]]; then - _iproute2_etc rt_scopes + _comp_cmd_ip__iproute2_etc rt_scopes else : # TODO fi ;; show | flush) if ((cword == subcword + 1)); then - _available_interfaces - COMPREPLY+=($(compgen -W 'dev scope to label dynamic + _comp_compgen_available_interfaces + _comp_compgen -a -- -W 'dev scope to label dynamic permanent tentative deprecated dadfailed temporary - primary secondary up' -- "$cur")) + primary secondary up' elif [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces elif [[ $prev == scope ]]; then - _iproute2_etc rt_scopes + _comp_cmd_ip__iproute2_etc rt_scopes fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add change replace del - show flush' -- "$cur")) + _comp_compgen -- -W 'help add change replace del show + flush' ;; esac ;; @@ -164,15 +183,14 @@ _ip() case $subcmd in list | add | del | flush) if [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces else : # TODO fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help list add del flush' \ - -- "$cur")) + _comp_compgen -- -W 'help list add del flush' ;; esac ;; @@ -181,7 +199,7 @@ _ip() case $subcmd in list | flush) if [[ $prev == proto ]]; then - _iproute2_etc rt_protos + _comp_cmd_ip__iproute2_etc rt_protos else : # TODO fi @@ -189,25 +207,32 @@ _ip() get) # TODO ;; - a | add | d | del | change | append | r | replace | monitor) + a | add | d | del | change | append | r | replace) if [[ $prev == via ]]; then - COMPREPLY=($(compgen -W "$($1 r | command sed -ne \ - 's/.*via \([0-9.]*\).*/\1/p')" -- "$cur")) + _comp_compgen_split -- "$( + { + $1 -c=never r 2>/dev/null || $1 r + } | command sed -ne \ + 's/.*via \([0-9.]*\).*/\1/p' + )" elif [[ $prev == "$subcmd" ]]; then - COMPREPLY=($(compgen -W "table default \ - $($1 r | cut -d ' ' -f 1)" -- "$cur")) + _comp_compgen_split -- "table default $( + { + $1 -c=never r 2>/dev/null || $1 r + } | cut -d ' ' -f 1 + )" elif [[ $prev == dev ]]; then - _available_interfaces -a + _comp_compgen_available_interfaces -a elif [[ $prev == table ]]; then - COMPREPLY=($(compgen -W 'local main default' -- "$cur")) + _comp_compgen -- -W 'local main default' else - COMPREPLY=($(compgen -W 'via dev weight' -- "$cur")) + _comp_compgen -- -W 'via dev weight' fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help list flush get add del - change append replace monitor' -- "$cur")) + _comp_compgen -- -W 'help list flush get add del change + append replace' ;; esac ;; @@ -221,16 +246,16 @@ _ip() suppress_ifgroup | realms | nat | goto) ;; iif | oif) - _available_interfaces -a + _comp_compgen_available_interfaces -a ;; table | lookup) - COMPREPLY=($(compgen -W 'local main default' -- "$cur")) + _comp_compgen -- -W 'local main default' ;; *) - COMPREPLY=($(compgen -W 'from to tos dsfield fwmark - uidrange ipproto sport dport priority table lookup - protocol suppress_prefixlength suppress_ifgroup realms - nat goto iif oif not' -- "$cur")) + _comp_compgen -- -W 'from to tos dsfield fwmark + uidrange ipproto sport dport priority table + lookup protocol suppress_prefixlength + suppress_ifgroup realms nat goto iif oif not' ;; esac ;; @@ -238,14 +263,14 @@ _ip() if [[ $prev == protocol ]]; then : else - COMPREPLY=($(compgen -W 'protocol' -- "$cur")) + _comp_compgen -- -W 'protocol' fi ;; restore | show) ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add del list flush save - restore show' -- "$cur")) + _comp_compgen -- -W 'help add del list flush save + restore show' ;; esac ;; @@ -260,8 +285,8 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add del change replace - show flush' -- "$cur")) + _comp_compgen -- -W 'help add del change replace show + flush' ;; esac ;; @@ -276,8 +301,7 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help change show' \ - -- "$cur")) + _comp_compgen -- -W 'help change show' ;; esac ;; @@ -291,8 +315,7 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add change del show prl - 6rd' -- "$cur")) + _comp_compgen -- -W 'help add change del show prl 6rd' ;; esac ;; @@ -304,16 +327,15 @@ _ip() ;; show) if [[ $cword -eq $subcword+1 || $prev == dev ]]; then - _available_interfaces - [[ $prev != dev ]] && - COMPREPLY=($(compgen -W '${COMPREPLY[@]} dev' \ - -- "$cur")) + _comp_compgen_available_interfaces + if [[ $prev != dev ]]; then + _comp_compgen -a -W dev + fi fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add del show' \ - -- "$cur")) + _comp_compgen -- -W 'help add del show' ;; esac ;; @@ -325,7 +347,7 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help show' -- "$cur")) + _comp_compgen -- -W 'help show' ;; esac ;; @@ -335,7 +357,14 @@ _ip() all) ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help all' -- "$cur")) + _comp_compgen_split -- "help all $( + { + "$1" -c=never monitor help || "$1" monitor help + } 2>&1 | command sed -e \ + '/OBJECTS := /,/[^|]$/!d' -e \ + 's/OBJECTS := *//' -e \ + 's/|//g' + )" ;; esac ;; @@ -348,13 +377,12 @@ _ip() # TODO ;; delete | exec | pids | set) - [[ $prev == "$subcmd" ]] && - COMPREPLY=($(compgen -W "$($1 netns list)" -- "$cur")) + [[ $prev == "$subcmd" ]] && _comp_cmd_ip__netns "$1" ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add delete exec - identify list list-id monitor pids set' -- "$cur")) + _comp_compgen -- -W 'help add delete exec identify list + list-id monitor pids set' ;; esac ;; @@ -366,13 +394,12 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'state policy monitor' \ - -- "$cur")) + _comp_compgen -- -W 'state policy monitor' ;; esac ;; esac } && - complete -F _ip ip + complete -F _comp_cmd_ip ip # ex: filetype=sh |