diff options
Diffstat (limited to 'Completion/Unix/Command/_7zip')
| -rw-r--r-- | Completion/Unix/Command/_7zip | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/Completion/Unix/Command/_7zip b/Completion/Unix/Command/_7zip new file mode 100644 index 000000000..6867d353c --- /dev/null +++ b/Completion/Unix/Command/_7zip @@ -0,0 +1,209 @@ +#compdef 7z 7za 7zr 7zz + +# this covers both the official 7-zip and the now deprecated p7zip (but not the +# p7zip command, which is a gzip-like wrapper) +# +# notes: +# - seemingly all 7zip commands, options, and option arguments are +# case-insensitive. we only partially support this +# - most options only work with certain commands. the html documentation lists +# which ones, but it was so consistently wrong or contradictory that i gave up +# on trying to separate them. do not blindly trust the documentation on this + +local ret=1 +local -a context line state state_descr args +local -A opt_args + +args=( + '*-ai-[specify archives to include]: :->file-refs' + "(2)-an[don't take archive name on command line (with -ai)]" + '-ao-[specify overwrite mode]:overwrite mode:(( + a\:"overwrite existing files without prompt" + s\:"skip extracting files that already exist" + t\:"auto-rename existing files" + u\:"auto-rename extracting files" + ))' + '*-ax-[specify archives to exclude]: :->file-refs' + '-bb-[specify output log level]::log level:(( + 0\:"disable log" + 1\:"show names of processed files" + 2\:"show names of additional files processed internally" + 3\:"show information about additional operations" + ))' + '-bd[disable progress indicator]' + '*-bs-[specify output stream]: :->output-streams' + '-bt[show execution time statistics]' + '*-i-[specify files to include]: :->file-refs' + '*-m-[specify compression method parameter]:method parameter' # @todo complete these + '-o-[specify output directory]:output directory:_files -/' + '-p-[specify password]:password' + "-r-[recurse into subdirectories (or specify)]::recursion method:(( + -\:\"don't recurse into subdirectories\" + 0\:'recurse into subdirectories only for wildcard names' + ))" + '-sa-[specify archive naming mode]:archive naming mode:(( + a\:"always add archive type extension" + e\:"use file name exactly as given" + s\:"add archive type extension only if file name has no extension" + ))' + '-scc-[specify charset for console input/output]: :->charsets-io' + '-scrc-[specify hash function]: :->hash-functions' + '-scs-[specify charset for list files]: :->charsets-listfile' + '-sdel[delete files after adding to archive]' + '-seml-[send archive by e-mail (specify behaviour)]::e-mail behaviour:(( + .\:"delete archive after attaching to e-mail" + ))' + '-sfx-[create SFX archive]:: :->sfx-modules' + '-si-[compress data from stdin (specify file name)]::file name in archive:_files' + '-slt[show technical information]' + '-snc[extract as alternate stream if : in file name]' + '-snh[store hard links as links (tar and WIM only)]' + '-sni[store NTFS security information (WIM only)]' + '-snl[store symbolic links as links (tar and WIM only)]' + "-sns-[store NTFS alternate streams (or specify) (WIM only)]::alternate-streams behaviour:(( + -\:\"don't store NTFS alternate streams\" + ))" + "-snt-[replace trailing dots and spaces in file names (or specify)]::trailing-character behaviour:(( + -\:\"don't replace trailing dots and spaces in file names\" + ))" + '-so[write data to stdout]' + '-spd[disable wildcard matching for file names]' + '-spe[eliminate duplication of root folder]' + '-spf-[use fully qualified (absolute) file paths (or specify)]::absolute-file-path behaviour::(( + 2\:"use full path without leading slash or drive letter" + ))' + '-ssc-[enable case-sensitive mode (or specify)]::case-sensitive mode:(( + -\:"disable case-sensitive mode" + ))' + '-sse[stop archive creation if unable to open input file]' + "-ssp[don't change access time of source files]" + '-ssw[compress files open for writing by other programs]' + '-stl[set archive time stamp from most recently modified file]' + '-stm-[specify CPU thread affinity mask]:affinity mask (hexadecimal)' + '-stx-[exclude specified archive type]: :->archive-types' + '-t-[specify archive type]: :->archive-types' + '-u-[specify update options]:update options' # @todo complete these + '-v-[create volume of specified size]: :_numbers -u bytes "volume size" b k m g' + '-w-[use temporary work directory (or specify)]::work directory:_files -/' + '*-x-[specify files to exclude]: :->file-refs' + '-y[assume yes to all queries]' + '1:command:(( + a\:"add files to archive" + b\:"benchmark" + d\:"delete files from archive" + e\:"extract files from archive (without full paths)" + h\:"calculate hash values for files" + i\:"show information about supported formats" + l\:"list contents of archive" + rn\:"rename files in archive" + t\:"test integrity of archive" + u\:"update files in archive" + x\:"extract files (with full paths)" + ))' + '(-an)2:archive file:_files' + '*: :_files' # @todo complete more specifically, handle list files +) + +_arguments -S : $args && ret=0 + +case $state in + archive-types) + local -a formats=( "${(@f)"$( _call_program 7z-info $words[1] i )"}" ) + formats=( "${(@)formats[(r)*Formats:*,-1]}" ) + formats=( ${formats[2,(r)]} ) + + # 'C' appears in fourth column if compression is supported + [[ ${(L)words[(rn:2:)^-*]} == (a|d|rn|u) ]] && + formats=( ${(M)formats:#???C*} ) + + # new (?) format + if [[ -n ${(M)formats:#*....*} ]]; then + formats=( ${formats/#?(#c28)/} ) + # old/p7zip format + else + formats=( ${formats/#?(#c17)/} ) + fi + formats=( ${formats%%[[:space:]]*} ) + + (( $#formats )) || formats=( 7z bzip2 gzip tar xz zip ) + formats=( ${formats//:/\\:} ) + + # @todo also complete the various -t* and -t# modes + _describe \ + -t formats \ + 'archive type' \ + formats \ + -M 'm:{a-z}={A-Z}' \ + && ret=0 + ;; + + charsets-io) + _describe \ + -t charsets \ + 'character set' \ + '( UTF-8 WIN DOS )' \ + -M 'm:{a-z}={A-Z}' \ + && ret=0 + ;; + + charsets-listfile) + _describe \ + -t charsets \ + 'character set (or Windows code-page number)' \ + '( UTF-8 UTF-16LE UTF-16BE WIN DOS )' \ + -M 'm:{a-z}={A-Z}' \ + && ret=0 + ;; + + file-refs) + # @todo complete this properly + if compset -P 1 '*[@!]'; then + _files && ret=0 + else + _describe -t file-refs 'file-ref type' '( + "@:list file" + "!:file name or wildcard" + )' && ret=0 + fi + ;; + + hash-functions) + local -a hashers=( "${(@f)"$( _call_program 7z-info $words[1] i )"}" ) + hashers=( "${(@)hashers[(r)*Hashers:*,-1]}" ) + hashers=( ${hashers[2,(r)]} ) + hashers=( ${hashers##*[[:space:]]} ) + (( $#hashers )) || hashers=( CRC32 CRC64 SHA1 SHA256 BLAKE2sp ) + hashers+=( \* ) + hashers=( ${hashers//:/\\:} ) + _describe -t hashers 'hash function' hashers -M 'm:{a-z}={A-Z}' && ret=0 + ;; + + output-streams) + if compset -P '?'; then + _describe -t stream-dests 'output stream destination' '( + 0:disabled + 1:stdout + 2:stderr + )' && ret=0 + else + _describe -t stream-types 'output stream type' '( + "e:error messages" + "o:standard output messages" + "p:progress information" + )' && ret=0 + fi + ;; + + sfx-modules) + # sfx modules should be in the same directory as the 7zip executable. on + # some systems they live in some lib directory so we look there too + local -aU sfxes=( + ${${(Q)words[1]}:c:h}/*.sfx(#q.N:t) + ${${(Q)words[1]}:c:P:h}/*.sfx(#q.N:t) + {,/opt,/usr}{,/local}/lib/7zip/*.sfx(#q.N:t) + ) + _describe -t sfx-modules 'SFX modules' sfxes && ret=0 + ;; +esac + +return ret |
