added extract/ls-archive from sorin ionescu
authorJoerg Jaspert <joerg@debian.org>
Sun, 7 Apr 2013 22:33:04 +0000 (00:33 +0200)
committerJoerg Jaspert <joerg@debian.org>
Sun, 7 Apr 2013 22:33:04 +0000 (00:33 +0200)
.zsh/README.org
.zsh/functions/_extract [new file with mode: 0644]
.zsh/functions/_ls-archive [new file with mode: 0644]
.zsh/functions/extract [new file with mode: 0644]
.zsh/functions/ls-archive [new file with mode: 0644]

index 3c95b86..7ef6dfe 100644 (file)
@@ -251,6 +251,9 @@ The prompt i use is based on various others.
 - zbell function is Written by Jean-Philippe Ouellet <jpo@vt.edu>
   and available under the ISC license, taken from [[https://gist.github.com/jpouellet/5278239][hist gist on github]]
 
+- extract/ls_archive is from [[https://github.com/sorin-ionescu][Sorin Ionescu]] and available under the MIT
+  License.
+
 * Footnotes
 
 [fn:1] Actually, the symlink points to the file zshenv.home inside that directory
diff --git a/.zsh/functions/_extract b/.zsh/functions/_extract
new file mode 100644 (file)
index 0000000..901a848
--- /dev/null
@@ -0,0 +1,14 @@
+#compdef extract
+#autoload
+
+#
+# Completes extract.
+#
+# Authors:
+#   Sorin Ionescu <sorin.ionescu@gmail.com>
+#
+
+_arguments \
+  '(-r --remove)'{-r,--remove}'[remove archive]' \
+  "*::archive file:_files -g '(#i)*.(tar|tgz|tbz|tbz2|txz|tlz|gz|bz2|xz|lzma|Z|zip|rar|7z|deb)(-.)'" && return 0
+
diff --git a/.zsh/functions/_ls-archive b/.zsh/functions/_ls-archive
new file mode 100644 (file)
index 0000000..00453c4
--- /dev/null
@@ -0,0 +1,14 @@
+#compdef ls-archive
+#autoload
+
+#
+# Completes ls-archive.
+#
+# Authors:
+#   Sorin Ionescu <sorin.ionescu@gmail.com>
+#
+
+_arguments \
+  '(-v --verbose)'{-v,--remove}'[verbose archive listing]' \
+  "*::archive file:_files -g '(#i)*.(tar|tgz|tbz|tbz2|txz|tlz|gz|bz2|xz|lzma|Z|zip|rar|7z)(-.)'" && return 0
+
diff --git a/.zsh/functions/extract b/.zsh/functions/extract
new file mode 100644 (file)
index 0000000..af7ed25
--- /dev/null
@@ -0,0 +1,77 @@
+#
+# Extracts the contents of popular archive formats.
+#
+# Authors:
+#   Sorin Ionescu <sorin.ionescu@gmail.com>
+#
+
+local remove_archive
+local success
+local file_name
+local extract_dir
+
+if (( $# == 0 )); then
+  cat >&2 <<EOF
+usage: $0 [-option] [file ...]
+
+options:
+    -r, --remove    remove archive
+
+Report bugs to <sorin.ionescu@gmail.com>.
+EOF
+fi
+
+remove_archive=1
+if [[ "$1" == "-r" || "$1" == "--remove" ]]; then
+  remove_archive=0
+  shift
+fi
+
+while (( $# > 0 )); do
+  if [[ ! -s "$1" ]]; then
+    print "$0: file not valid: $1" >&2
+    shift
+    continue
+  fi
+
+  success=0
+  file_name="${1:t}"
+  extract_dir="${file_name:r}"
+  case "$1" in
+    (*.tar.gz|*.tgz) tar xvzf "$1" ;;
+    (*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;;
+    (*.tar.xz|*.txz) tar --xz --help &> /dev/null \
+      && tar --xz -xvf "$1" \
+      || xzcat "$1" | tar xvf - ;;
+    (*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \
+      && tar --lzma -xvf "$1" \
+      || lzcat "$1" | tar xvf - ;;
+    (*.tar) tar xvf "$1" ;;
+    (*.gz) gunzip "$1" ;;
+    (*.bz2) bunzip2 "$1" ;;
+    (*.xz) unxz "$1" ;;
+    (*.lzma) unlzma "$1" ;;
+    (*.Z) uncompress "$1" ;;
+    (*.zip) unzip "$1" -d $extract_dir ;;
+    (*.rar) unrar e -ad "$1" ;;
+    (*.7z) 7za x "$1" ;;
+    (*.deb)
+      mkdir -p "$extract_dir/control"
+      mkdir -p "$extract_dir/data"
+      cd "$extract_dir"; ar vx "../${1}" > /dev/null
+      cd control; tar xzvf ../control.tar.gz
+      cd ../data; tar xzvf ../data.tar.gz
+      cd ..; rm *.tar.gz debian-binary
+      cd ..
+    ;;
+    (*)
+      print "$0: cannot extract: $1" >&2
+      success=1
+    ;;
+  esac
+
+  (( success = $success > 0 ? $success : $? ))
+  (( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1"
+  shift
+done
+
diff --git a/.zsh/functions/ls-archive b/.zsh/functions/ls-archive
new file mode 100644 (file)
index 0000000..e8727fa
--- /dev/null
@@ -0,0 +1,54 @@
+#
+# Lists the contents of popular archive formats.
+#
+# Authors:
+#   Sorin Ionescu <sorin.ionescu@gmail.com>
+#
+
+local verbose
+
+if (( $# == 0 )); then
+  cat >&2 <<EOF
+usage: $0 [-option] [file ...]
+
+options:
+    -v, --verbose    verbose archive listing
+
+Report bugs to <sorin.ionescu@gmail.com>.
+EOF
+fi
+
+if [[ "$1" == "-v" || "$1" == "--verbose" ]]; then
+  verbose=0
+  shift
+fi
+
+while (( $# > 0 )); do
+  if [[ ! -s "$1" ]]; then
+    print "$0: file not valid: $1" >&2
+    shift
+    continue
+  fi
+
+  case "$1" in
+    (*.tar.gz|*.tgz) tar t${verbose:+v}vzf "$1" ;;
+    (*.tar.bz2|*.tbz|*.tbz2) tar t${verbose:+v}jf "$1" ;;
+    (*.tar.xz|*.txz) tar --xz --help &> /dev/null \
+      && tar --xz -t${verbose:+v}f "$1" \
+      || xzcat "$1" | tar t${verbose:+v}f - ;;
+    (*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \
+      && tar --lzma -t${verbose:+v}f "$1" \
+      || lzcat "$1" | tar x${verbose:+v}f - ;;
+    (*.tar) tar t${verbose:+v}f "$1" ;;
+    (*.zip) unzip -l${verbose:+v} "$1" ;;
+    (*.rar) unrar ${${verbose:+v}:-l} "$1" ;;
+    (*.7z) 7za l "$1" ;;
+    (*)
+                       print "$0: cannot list: $1" >&2
+      success=1
+    ;;
+  esac
+
+  shift
+done
+