Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] completion: add _7zip



someone on irc wanted this. a few things left out but it's 90% there

dana


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




Messages sorted by: Reverse Date, Date, Thread, Author