summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/aliases.zsh1
-rw-r--r--lib/functions.zsh35
-rw-r--r--plugins/extract/_extract8
-rw-r--r--plugins/extract/extract.plugin.zsh83
4 files changed, 91 insertions, 36 deletions
diff --git a/lib/aliases.zsh b/lib/aliases.zsh
index b47de5bde..0555be264 100644
--- a/lib/aliases.zsh
+++ b/lib/aliases.zsh
@@ -22,4 +22,3 @@ alias sl=ls # often screw this up
alias afind='ack-grep -il'
-alias x=extract
diff --git a/lib/functions.zsh b/lib/functions.zsh
index b29d3e482..ef7cc6383 100644
--- a/lib/functions.zsh
+++ b/lib/functions.zsh
@@ -15,38 +15,3 @@ function take() {
cd $1
}
-function extract() {
- unset REMOVE_ARCHIVE
-
- if test "$1" = "-r"; then
- REMOVE=1
- shift
- fi
- if [[ -f $1 ]]; then
- case $1 in
- *.tar.bz2) tar xvjf $1;;
- *.tar.gz) tar xvzf $1;;
- *.tar.xz) tar xvJf $1;;
- *.tar.lzma) tar --lzma -xvf $1;;
- *.bz2) bunzip $1;;
- *.rar) unrar x $1;;
- *.gz) gunzip $1;;
- *.tar) tar xvf $1;;
- *.tbz2) tar xvjf $1;;
- *.tgz) tar xvzf $1;;
- *.zip) unzip $1;;
- *.Z) uncompress $1;;
- *.7z) 7z x $1;;
- *) echo "'$1' cannot be extracted via >extract<";;
- esac
-
- if [[ $REMOVE_ARCHIVE -eq 1 ]]; then
- echo removing "$1";
- /bin/rm "$1";
- fi
-
- else
- echo "'$1' is not a valid file"
- fi
-}
-
diff --git a/plugins/extract/_extract b/plugins/extract/_extract
new file mode 100644
index 000000000..dca890954
--- /dev/null
+++ b/plugins/extract/_extract
@@ -0,0 +1,8 @@
+#compdef extract
+#autoload
+
+_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/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh
new file mode 100644
index 000000000..c58692fbf
--- /dev/null
+++ b/plugins/extract/extract.plugin.zsh
@@ -0,0 +1,83 @@
+# ------------------------------------------------------------------------------
+# FILE: extract.plugin.zsh
+# DESCRIPTION: oh-my-zsh plugin file.
+# AUTHOR: Sorin Ionescu (sorin.ionescu@gmail.com)
+# VERSION: 1.0.0
+# ------------------------------------------------------------------------------
+
+
+function extract() {
+ local remove_archive
+ local success
+ local file_name
+ local extract_dir
+
+ if (( $# == 0 )); then
+ echo "Usage: extract [-option] [file ...]"
+ echo
+ echo Options:
+ echo " -r, --remove Remove archive."
+ echo
+ echo "Report bugs to <sorin.ionescu@gmail.com>."
+ fi
+
+ remove_archive=1
+ if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then
+ remove_archive=0
+ shift
+ fi
+
+ while (( $# > 0 )); do
+ if [[ ! -f "$1" ]]; then
+ echo "extract: '$1' is not a valid file" 1>&2
+ shift
+ continue
+ fi
+
+ success=0
+ file_name="$( basename "$1" )"
+ extract_dir="$( echo "$file_name" | sed "s/\.${1##*.}//g" )"
+ case "$1" in
+ (*.tar.gz|*.tgz) tar xvzf "$1" ;;
+ (*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;;
+ (*.tar.xz|*.txz) tar xvJf "$1" ;;
+ # (*.tar.xz|*.txz) xzcat "$1" | tar xvf - ;;
+ (*.tar.lzma|*.tlz) tar --lzma -xvf "$1" ;;
+ # (*.tar.lzma|*.tlz) 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 ..
+ ;;
+ (*)
+ echo "extract: '$1' cannot be extracted" 1>&2
+ success=1
+ ;;
+ esac
+
+ (( success = $success > 0 ? $success : $? ))
+ (( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1"
+ shift
+ done
+}
+
+alias x=extract
+
+# add extract completion function to path
+fpath=($ZSH/plugins/extract $fpath)
+autoload -U compinit
+compinit -i
+