

3 changed files with 106 additions and 0 deletions
@ -0,0 +1,102 @@
|
||||
_pipesz_module() |
||||
{ |
||||
local WORD OPTS OPTARG OPTEND SOPT LOPT TARG |
||||
local SOPTS=(g s f n i o e c q v h V) |
||||
local LOPTS=(get set file fd stdin stdout stderr check quiet verbose help version) |
||||
local AOPTS=(0 1 1 1 0 0 0 0 0 0 0 0) # takes argument |
||||
local TOPTS=(1 0 1 1 1 1 1 0 0 0 0 0) # specifies target |
||||
local XOPTS=(0 0 0 0 0 0 0 0 0 0 1 1) # exits immediately |
||||
local MOPTS=(0 0 1 1 0 0 0 0 0 0 0 0) # repeatable |
||||
local NOPTS=(0 0 0 0 0 0 0 0 0 0 0 0) # number of repeats |
||||
local IDXG=0 IDXS=1 # index of --get and --set |
||||
|
||||
for ((i=1; i<COMP_CWORD; i++)); do |
||||
WORD=${COMP_WORDS[i]} |
||||
|
||||
if [[ ${NOPTS[$IDXG]} -eq 0 ]]; then |
||||
case $WORD in |
||||
--) |
||||
_command_offset $((i+1)) |
||||
return 0;; |
||||
[^-]*) |
||||
_command_offset $i |
||||
return 0;; |
||||
esac |
||||
fi |
||||
|
||||
for ((j=0; j<${#NOPTS[@]}; j++)); do |
||||
SOPT=${SOPTS[$j]} |
||||
LOPT=${LOPTS[$j]} |
||||
|
||||
case $WORD in |
||||
--$LOPT) OPTEND=l;; |
||||
--*) continue;; |
||||
-*$SOPT) OPTEND=s;; |
||||
-*$SOPT*) OPTEND=n;; |
||||
*) continue;; |
||||
esac |
||||
|
||||
if [[ ${XOPTS[$j]} -ne 0 ]]; then |
||||
COMPREPLY=() |
||||
return 0 |
||||
fi |
||||
|
||||
((NOPTS[j]++)) |
||||
|
||||
[[ ${TOPTS[$j]} -ne 0 ]] && TARG=y |
||||
[[ $OPTEND != n ]] && ((i+=AOPTS[j])) |
||||
[[ $OPTEND == l ]] && break |
||||
done |
||||
done |
||||
|
||||
case $3 in |
||||
--fd) OPTARG=n;; |
||||
--file) OPTARG=f;; |
||||
--size) OPTARG=s;; |
||||
--*) ;; |
||||
-*n) OPTARG=n;; |
||||
-*f) OPTARG=f;; |
||||
-*s) OPTARG=s;; |
||||
esac |
||||
|
||||
case $OPTARG in |
||||
f) |
||||
compopt -o filenames |
||||
COMPREPLY=( $(compgen -f -- "$2") ) |
||||
return 0;; |
||||
n) |
||||
COMPREPLY=( $(compgen -W "0 1 2" -- "$2") ) |
||||
return 0;; |
||||
s) |
||||
WORD=$2 |
||||
if [[ ! $WORD =~ ^[0-9]+[a-zA-Z]*$ ]]; then |
||||
COMPREPLY=() |
||||
return 0 |
||||
fi |
||||
|
||||
while [[ $WORD =~ [a-zA-Z]$ ]]; do WORD=${WORD:0:-1}; done |
||||
|
||||
compopt -o nosort |
||||
COMPREPLY=( $(compgen -W "$WORD $WORD{K,M,G}{B,iB}" -- "$2") ) |
||||
return 0;; |
||||
esac |
||||
|
||||
for ((j=0; j<${#NOPTS[@]}; j++)); do |
||||
[[ $j -eq $IDXG && ${NOPTS[$IDXS]} -ne 0 ]] && continue |
||||
[[ $j -eq $IDXS && ${NOPTS[$IDXG]} -ne 0 ]] && continue |
||||
[[ $COMP_CWORD -ne 1 && ${XOPTS[$j]} -ne 0 ]] && continue |
||||
[[ ${NOPTS[$j]} -gt 0 && ${MOPTS[$j]} -eq 0 ]] && continue |
||||
|
||||
[[ $2 != --* && $2 == -* ]] && OPTS+=" -${SOPTS[$j]}" |
||||
OPTS+=" --${LOPTS[$j]}" |
||||
done |
||||
|
||||
if [[ ! $TARG || ${NOPTS[$IDXG]} -ne 0 ]]; then |
||||
COMPREPLY=( $(compgen -W "$OPTS" -- "$2") ) |
||||
else |
||||
compopt -o filenames |
||||
COMPREPLY=( $(compgen -c -W "$OPTS --" -- "$2") ) |
||||
fi |
||||
} |
||||
|
||||
complete -F _pipesz_module pipesz |
Loading…
Reference in new issue