# 7z(1) completion -*- shell-script -*- proc _7z { local cur prev words cword _init_completion -n = || return if [[ $cword -eq 1 ]] { setglobal COMPREPLY = ''( $( compgen -W 'a b d e l t u x' -- "$cur" ) ) return } local mode [[ ${words[1]} == [adu] ]] && setglobal mode = 'w' || setglobal mode = 'r' match $cur { with -ao* setglobal COMPREPLY = ''( $( compgen -P${cur:0:3} -W 'a s t u' -- "${cur:3}" ) ) return with -?(a)[ix]* local opt if [[ $cur == -a[ix]* ]] { setglobal opt = $(cur:0:3), cur = $(cur:3) } else { setglobal opt = $(cur:0:2), cur = $(cur:2) } if [[ $cur != *[@\!]* ]] { setglobal COMPREPLY = ''( $( compgen -P$opt -W '@ ! r@ r-@ r0@ r! r-! r0!' \ -- "$cur" ) ) } elif [[ $cur == ?(r@(-|0|))@* ]] { local x tmp setglobal x = $[ compgen -P"$(opt)$(cur%%@*)@" -f -- $(cur#*@)] && while read -r tmp { setglobal COMPREPLY = ''( "$tmp" ) } <<< "$x" compopt -o filenames } return with -mhe=*|-mhc=*|-ms=*|-mt=* setglobal COMPREPLY = ''( $( compgen -W 'on off' -- "${cur#*=}" ) ) return with -mx=* setglobal COMPREPLY = ''( $( compgen -W '0 1 3 5 7 9' -- "${cur#*=}" ) ) return with -o*|-w?* local x tmp setglobal x = $[ compgen -P$(cur:0:2) -S/ -d -- $(cur:2)] && while read -r tmp { setglobal COMPREPLY = ''( "$tmp" ) } <<< "$x" compopt -o nospace -o filenames return with -r?* setglobal COMPREPLY = ''( $( compgen -P${cur:0:2} -W '- 0' -- "${cur:2}" ) ) return with -scs* setglobal COMPREPLY = ''( $( compgen -P${cur:0:4} -W 'UTF-8 WIN DOS' \ -- "${cur:4}" ) ) return with -ssc?* setglobal COMPREPLY = ''( $( compgen -P${cur:0:4} -W '-' -- "${cur:4}" ) ) return with -t* if [[ $mode == w ]] { setglobal COMPREPLY = ''( $( compgen -P${cur:0:2} -W '7z bzip2 gzip swfc tar wim xz zip' -- "${cur:2}" ) ) } else { setglobal COMPREPLY = ''( $( compgen -P${cur:0:2} -W '7z apm arj bzip2 cab chm cpio cramfs deb dmg elf fat flv gzip hfs iso lzh lzma lzma86 macho mbr mslz mub nsis ntfs pe ppmd rar rpm squashfs swf swfc tar udf vhd wim xar xz z zip' \ -- "${cur:2}" ) ) } return with -m*=*|-p*|-u*|-v* return } if [[ $cur == -* ]] { setglobal COMPREPLY = ''( $( compgen -W '-ai -an -ao -ax -bd -i -m{x,s,f,he,hc,mt}= -o -p -r -scs -sfx -si -slp -slt -so -ssc -t -u -v -w -x -y' \ -- "$cur" ) ) [[ $COMPREPLY == -@(an|bd|sfx|si|slt|so|ssc|[rwy]) ]] || compopt -o nospace return } local args _count_args = if [[ $args -eq 2 ]] { _filedir_xspec unzip [[ $mode == w ]] && _filedir '@(7z|bz2|swf|?(g)tar|?(t)[bglx]z|tb?(z)2|wim)' || _filedir '@(7z|arj|bz2|cab|chm|cpio|deb|dmg|flv|gem|img|iso|lz[ah]|lzma?(86)|pmd|[rx]ar|rpm|sw[fm]|?(g)tar|taz|?(t)[bglx]z|tb?(z)2|vhd|wim|Z)' } else { if [[ ${words[1]} == d ]] { local IFS=$'\n' setglobal COMPREPLY = ''( $( compgen -W "$( printf '%s\n' $( $1 l ${words[2]} \ -slt 2>/dev/null | sed -n '/^Path =/s/^Path = \(.*\)$/\1/p' \ 2>/dev/null | tail -n+2 ) )" -- "$cur" ) ) compopt -o filenames } else { _filedir } } } && complete -F _7z 7z 7za # ex: ts=4 sw=4 et filetype=sh