_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