blob: a8acbc593552ccf7741a3137b82526d856f7939e (
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
124
125
126
127
128
|
# 7z(1) completion -*- shell-script -*-
_7z()
{
local cur prev words cword
_init_completion -n = || return
if ((cword == 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 reset=$(shopt -po noglob)
set -o noglob
compopt -o filenames
local ifs=$IFS IFS=$'\n'
COMPREPLY=($(compgen -d -P${cur:0:2} -S/ -- "${cur:2}"))
IFS=$ifs
$reset
compopt -o nospace
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 == 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
|