summaryrefslogtreecommitdiff
path: root/completions/7z
blob: 96a64f1f333cc1bcaac69b1cfa895e528a30ca29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# 7z(1) completion                                         -*- shell-script -*-

_7z()
{
    local cur prev words cword
    _init_completion -n = || return

    if [[ $cword -eq 1 ]]; then
        COMPREPLY=( $(compgen -W 'a b d e l t u x' -- "$cur") )
        return
    fi

    local mode
    [[ ${words[1]} == [adu] ]] && mode=w || mode=r

    case $cur in
        -ao*)
            COMPREPLY=( $(compgen -P${cur:0:3} -W 'a s t u' -- "${cur:3}") )
            return
            ;;
        -?(a)[ix]*)
            local opt
            if [[ $cur == -a[ix]* ]]; then
                opt=${cur:0:3} cur=${cur:3}
            else
                opt=${cur:0:2} cur=${cur:2}
            fi
            if [[ $cur != *[@\!]* ]]; then
                COMPREPLY=( $(compgen -P$opt -W '@ ! r@ r-@ r0@ r! r-! r0!' \
                    -- "$cur") )
            elif [[ $cur == ?(r@(-|0|))@* ]]; then
                local IFS=$' \t\n' reset=$(shopt -po noglob); set -o noglob
                COMPREPLY=( $(compgen -P"${opt}${cur%%@*}@" -f -- "${cur#*@}") )
                $reset
                compopt -o filenames
            fi
            return
            ;;
        -mhe=*|-mhc=*|-ms=*|-mt=*)
            COMPREPLY=( $(compgen -W 'on off' -- "${cur#*=}") )
            return
            ;;
        -mx=*)
            COMPREPLY=( $(compgen -W '0 1 3 5 7 9' -- "${cur#*=}") )
            return
            ;;
        -o*|-w?*)
            local IFS=$' \t\n' reset=$(shopt -po noglob); set -o noglob
            COMPREPLY=( $(compgen -P${cur:0:2} -S/ -d -- "${cur:2}") )
            $reset
            compopt -o nospace -o filenames
            return
            ;;
        -r?*)
            COMPREPLY=( $(compgen -P${cur:0:2} -W '- 0' -- "${cur:2}") )
            return
            ;;
        -scs*)
            COMPREPLY=( $(compgen -P${cur:0:4} -W 'UTF-8 WIN DOS' \
                -- "${cur:4}") )
            return
            ;;
        -ssc?*)
            COMPREPLY=( $(compgen -P${cur:0:4} -W '-' -- "${cur:4}") )
            return
            ;;
        -t*)
            if [[ $mode == w ]]; then
                COMPREPLY=( $(compgen -P${cur:0:2} -W '7z bzip2 gzip swfc
                    tar wim xz zip' -- "${cur:2}") )
            else
                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}") )
            fi
            return
            ;;
        -m*=*|-p*|-u*|-v*)
            return
            ;;
    esac

    if [[ $cur == -* ]]; then
        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
    fi

    local args
    _count_args =
    if [[ $args -eq 2 ]]; then
        _filedir_xspec unzip
        # TODO: parsing 7z i output?
        # - how to figure out if the format is input or output?
        # - find string Formats:, read until next empty line
        # - extensions start from column 26
        #   - ignore everything in parens
        #   - terminate on two spaces
        #   - terminate on token containing anything [^a-z0-9]
        #     (assumption: extensions are all lowercase)
        [[ $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)|msi|pmd|[rx]ar|rpm|sw[fm]|?(g)tar|taz|?(t)[bglx]z|tb?(z)2|vhd|wim|Z)'
    else
        if [[ ${words[1]} == d ]]; then
            local IFS=$'\n'
            COMPREPLY=( $(compgen -W "$(printf '%s\n' $($1 l ${words[2]} \
                -slt 2>/dev/null | command sed -n '/^Path =/s/^Path = \(.*\)$/\1/p' \
                2>/dev/null | tail -n+2))" -- "$cur") )
            compopt -o filenames
        else
            _filedir
        fi
    fi
} &&
complete -F _7z 7z 7za

# ex: filetype=sh