summaryrefslogtreecommitdiff
path: root/completions/tar
diff options
context:
space:
mode:
authorDavid Paleino <dapal@debian.org>2011-02-06 21:26:41 +0100
committerDavid Paleino <dapal@debian.org>2011-02-06 21:26:41 +0100
commit9920a8faedf704420571d8072ccab27e9dac40ba (patch)
tree733edf3b07be06c130d04aaa1884213326722cad /completions/tar
parentf9748115fb4b2950fb4df7535fb723c4affde078 (diff)
downloadbash-completion-9920a8faedf704420571d8072ccab27e9dac40ba.tar.gz
Imported Upstream version 1.3upstream/1.3
Diffstat (limited to 'completions/tar')
-rw-r--r--completions/tar72
1 files changed, 72 insertions, 0 deletions
diff --git a/completions/tar b/completions/tar
new file mode 100644
index 00000000..a5c02490
--- /dev/null
+++ b/completions/tar
@@ -0,0 +1,72 @@
+# bash completion for GNU tar
+
+have tar && {
+_tar()
+{
+ local cur ext regex tar untar
+
+ COMPREPLY=()
+ _get_comp_words_by_ref cur
+
+ if [ $COMP_CWORD -eq 1 ]; then
+ COMPREPLY=( $( compgen -W 'c t x u r d A' -- "$cur" ) )
+ return 0
+ fi
+
+ case ${COMP_WORDS[1]} in
+ ?(-)[cr]*f)
+ _filedir
+ return 0
+ ;;
+ +([^IZzJjy])f)
+ ext='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'
+ regex='\(\(tar\|gem\|spkg\)\(\.\(Z\|[gx]z\|bz?(2)\|lzma\)\)\?\|t\([glx]z\|bz2\?\)\)'
+ ;;
+ *[Zz]*f)
+ ext='@(t?(ar.)|gem.|spkg.)@(gz|Z)'
+ regex='\(t\(ar\.\)\?\|gem\.\|spkg\.\)\(gz\|Z\)'
+ ;;
+ *[Ijy]*f)
+ ext='@(@(t?(ar.)|gem.)bz?(2)|spkg)'
+ regex='\(\(t\(ar\.\)\?\|gem\.\)bz2\?\|spkg\)'
+ ;;
+ *[J]*f)
+ ext='@(t?(ar.)|gem.|spkg.)@(lz?(ma)|xz)'
+ regex='\(t\(ar\.\)\?\|gem\.\|spkg\.\)\(lzma\|xz\)\?'
+ ;;
+ *)
+ _filedir
+ return 0
+ ;;
+ esac
+
+ if [[ "$COMP_LINE" == *$ext' ' ]]; then
+ # complete on files in tar file
+ #
+ # get name of tar file from command line
+ tar=$( sed -e 's/^.* \([^ ]*'$regex'\) .*$/\1/' <<<"$COMP_LINE" )
+ # devise how to untar and list it
+ untar=t${COMP_WORDS[1]//[^Izjyf]/}
+
+ local IFS=$'\n'
+ COMPREPLY=( $( compgen -W "$( printf '%s\n' $( tar $untar $tar \
+ 2>/dev/null ) )" -- "$cur" ) )
+ return 0
+ fi
+
+ # file completion on relevant files
+ _filedir "$ext"
+
+ return 0
+}
+[ -n "${COMP_TAR_INTERNAL_PATHS:-}" ] && complete -F _tar -o dirnames tar ||
+ complete -F _tar tar
+}
+
+# Local variables:
+# mode: shell-script
+# sh-basic-offset: 4
+# sh-indent-comment: t
+# indent-tabs-mode: nil
+# End:
+# ex: ts=4 sw=4 et filetype=sh