From f60e97d0c2ad6d82575d07473543eced6072f67d Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Thu, 21 May 2009 01:38:13 +0200 Subject: [PATCH] split tar completion --- Makefile.am | 1 + bash_completion | 64 ----------------------------------------------- contrib/tar | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 64 deletions(-) create mode 100644 contrib/tar diff --git a/Makefile.am b/Makefile.am index 3a280b43..549a787b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -82,6 +82,7 @@ bashcomp_DATA = contrib/ant \ contrib/strace \ contrib/_subversion \ contrib/svk \ + contrib/tar \ contrib/unace \ contrib/unrar \ contrib/vncviewer \ diff --git a/bash_completion b/bash_completion index 320e6327..eeeb31a2 100644 --- a/bash_completion +++ b/bash_completion @@ -2892,70 +2892,6 @@ _route() } [ $UNAME = Linux ] && complete -F _route route -# GNU tar(1) completion -# -_tar() -{ - local cur ext regex tar untar - - COMPREPLY=() - cur=`_get_cword` - - 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='t@(ar?(.@(Z|gz|bz?(2)|lz?(ma)))|gz|bz?(2)|lz?(ma))' - regex='t\(ar\(\.\(Z\|gz\|bz2\?\|lzma\|xz\)\)\?\|gz\|bz2\?\|lzma\|xz\)' - ;; - *[Zz]*f) - ext='t?(ar.)@(gz|Z)' - regex='t\(ar\.\)\?\(gz\|Z\)' - ;; - *[Ijy]*f) - ext='t?(ar.)bz?(2)' - regex='t\(ar\.\)\?bz2\?' - ;; - *[J]*f) - ext='t?(ar.)@(lz?(ma)|xz)' - regex='t\(ar\.\)\?\(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=$( echo "$COMP_LINE" | \ - sed -e 's/^.* \([^ ]*'$regex'\) .*$/\1/' ) - # devise how to untar and list it - untar=t${COMP_WORDS[1]//[^Izjyf]/} - - COMPREPLY=( $( compgen -W "$( echo $( 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 $dirnames tar || - complete -F _tar $filenames tar - # jar(1) completion # have jar && diff --git a/contrib/tar b/contrib/tar new file mode 100644 index 00000000..dadd7886 --- /dev/null +++ b/contrib/tar @@ -0,0 +1,66 @@ +# -*- mode: shell-script; sh-basic-offset: 8; indent-tabs-mode: t -*- +# ex: ts=8 sw=8 noet filetype=sh +# +# bash completion for GNU tar + +_tar() +{ + local cur ext regex tar untar + + COMPREPLY=() + cur=`_get_cword` + + 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='t@(ar?(.@(Z|gz|bz?(2)|lz?(ma)))|gz|bz?(2)|lz?(ma))' + regex='t\(ar\(\.\(Z\|gz\|bz2\?\|lzma\|xz\)\)\?\|gz\|bz2\?\|lzma\|xz\)' + ;; + *[Zz]*f) + ext='t?(ar.)@(gz|Z)' + regex='t\(ar\.\)\?\(gz\|Z\)' + ;; + *[Ijy]*f) + ext='t?(ar.)bz?(2)' + regex='t\(ar\.\)\?bz2\?' + ;; + *[J]*f) + ext='t?(ar.)@(lz?(ma)|xz)' + regex='t\(ar\.\)\?\(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=$( echo "$COMP_LINE" | \ + sed -e 's/^.* \([^ ]*'$regex'\) .*$/\1/' ) + # devise how to untar and list it + untar=t${COMP_WORDS[1]//[^Izjyf]/} + + COMPREPLY=( $( compgen -W "$( echo $( 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 $dirnames tar || + complete -F _tar $filenames tar