diff options
author | Tyler Davis <tyler@gluecode.net> | 2024-01-10 12:13:23 -0800 |
---|---|---|
committer | Tyler Davis <tyler@gluecode.net> | 2024-01-10 12:13:23 -0800 |
commit | 8c954408cf093378758d262c3088fc13a69f9639 (patch) | |
tree | d2fe4e65781224a679162ef2bc1610f1a5417245 /.local/share/bash/bash_completion.d/tar | |
parent | 75415a836a83f6898515383107caa35b49cc48c4 (diff) | |
download | dotfiles-8c954408cf093378758d262c3088fc13a69f9639.tar.gz dotfiles-8c954408cf093378758d262c3088fc13a69f9639.zip |
bin: add bash3 completion
Diffstat (limited to '.local/share/bash/bash_completion.d/tar')
-rw-r--r-- | .local/share/bash/bash_completion.d/tar | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/.local/share/bash/bash_completion.d/tar b/.local/share/bash/bash_completion.d/tar new file mode 100644 index 0000000..a5c0249 --- /dev/null +++ b/.local/share/bash/bash_completion.d/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 |