diff options
Diffstat (limited to 'bash-completion/pipesz')
-rw-r--r-- | bash-completion/pipesz | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/bash-completion/pipesz b/bash-completion/pipesz new file mode 100644 index 0000000..592075c --- /dev/null +++ b/bash-completion/pipesz @@ -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 |