diff options
author | David Paleino <d.paleino@gmail.com> | 2009-10-10 17:15:58 +0200 |
---|---|---|
committer | David Paleino <d.paleino@gmail.com> | 2009-10-10 17:15:58 +0200 |
commit | e5a9b6220e93ca656fd9774c6aefa78241edca6f (patch) | |
tree | 4a65aa19b18fe2e8dcec24a1c97ce9746a6f91ff /bash_completion | |
parent | 96d00c3d7f1912d4f3f76f8ea21ef68d179b8b30 (diff) | |
download | bash-completion-e5a9b6220e93ca656fd9774c6aefa78241edca6f.tar.gz |
Imported Upstream version 1.1upstream/1.1
Diffstat (limited to 'bash_completion')
-rw-r--r-- | bash_completion | 9991 |
1 files changed, 1159 insertions, 8832 deletions
diff --git a/bash_completion b/bash_completion index 552f8085..e1c40544 100644 --- a/bash_completion +++ b/bash_completion @@ -1,8 +1,6 @@ -# -*- mode: shell-script; sh-basic-offset: 8; indent-tabs-mode: t -*- -# ex: ts=8 sw=8 noet filetype=sh # # bash_completion - programmable completion functions for bash 3.x -# (backwards compatible with bash 2.05b) +# (backwards compatible with bash 2.05b) # # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org> # © 2009, Bash Completion Maintainers @@ -26,52 +24,63 @@ # # http://bash-completion.alioth.debian.org/ # -# RELEASE: 1.0 +# RELEASE: 1.1 if [[ $- == *v* ]]; then - BASH_COMPLETION_ORIGINAL_V_VALUE="-v" + BASH_COMPLETION_ORIGINAL_V_VALUE="-v" else - BASH_COMPLETION_ORIGINAL_V_VALUE="+v" + BASH_COMPLETION_ORIGINAL_V_VALUE="+v" fi if [[ -n $BASH_COMPLETION_DEBUG ]]; then - set -v + set -v else - set +v + set +v fi # Alter the following to reflect the location of this file. # [ -n "$BASH_COMPLETION" ] || BASH_COMPLETION=/etc/bash_completion [ -n "$BASH_COMPLETION_DIR" ] || BASH_COMPLETION_DIR=/etc/bash_completion.d -readonly BASH_COMPLETION BASH_COMPLETION_DIR +[ -n "$BASH_COMPLETION_COMPAT_DIR" ] || BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d +readonly BASH_COMPLETION BASH_COMPLETION_DIR BASH_COMPLETION_COMPAT_DIR # Set a couple of useful vars # UNAME=$( uname -s ) # strip OS type and version under Cygwin (e.g. CYGWIN_NT-5.1 => Cygwin) UNAME=${UNAME/CYGWIN_*/Cygwin} -RELEASE=$( uname -r ) + +case ${UNAME} in + Linux|GNU|GNU/*) USERLAND=GNU ;; + *) USERLAND=${UNAME} ;; +esac # features supported by bash 2.05 and higher if [ ${BASH_VERSINFO[0]} -eq 2 ] && [[ ${BASH_VERSINFO[1]} > 04 ]] || - [ ${BASH_VERSINFO[0]} -gt 2 ]; then - declare -r bash205=$BASH_VERSION 2>/dev/null || : - default="-o default" - dirnames="-o dirnames" - filenames="-o filenames" + [ ${BASH_VERSINFO[0]} -gt 2 ]; then + declare -r bash205=$BASH_VERSION 2>/dev/null || : + default="-o default" + dirnames="-o dirnames" + filenames="-o filenames" + compopt=: fi # features supported by bash 2.05b and higher if [ ${BASH_VERSINFO[0]} -eq 2 ] && [[ ${BASH_VERSINFO[1]} = "05b" ]] || - [ ${BASH_VERSINFO[0]} -gt 2 ]; then - declare -r bash205b=$BASH_VERSION 2>/dev/null || : - nospace="-o nospace" + [ ${BASH_VERSINFO[0]} -gt 2 ]; then + declare -r bash205b=$BASH_VERSION 2>/dev/null || : + nospace="-o nospace" fi # features supported by bash 3.0 and higher if [ ${BASH_VERSINFO[0]} -gt 2 ]; then - declare -r bash3=$BASH_VERSION 2>/dev/null || : - bashdefault="-o bashdefault" - plusdirs="-o plusdirs" + declare -r bash3=$BASH_VERSION 2>/dev/null || : + bashdefault="-o bashdefault" + plusdirs="-o plusdirs" +fi +# features supported by bash 4.0 and higher +if [ ${BASH_VERSINFO[0]} -gt 3 ]; then + declare -r bash4=$BASH_VERSION 2>/dev/null || : + compopt=compopt fi # Turn on extended globbing and programmable completion @@ -87,17 +96,16 @@ complete -d pushd # Do NOT break these over multiple lines. # # START exclude -- do NOT remove this line -complete -f -X '!*.?(t)bz?(2)' bunzip2 -# TODO: see #455510 -#complete -f -X '!*.?(t)bz?(2)' bzcat bzcmp bzdiff bzegrep bzfgrep bzgrep -complete -f -X '!*.*' bzcat bzcmp bzdiff bzegrep bzfgrep bzgrep +# bzcmp, bzdiff, bz*grep, bzless, bzmore intentionally not here, see Debian: #455510 +complete -f -X '!*.?(t)bz?(2)' bunzip2 bzcat complete -f -X '!*.@(zip|ZIP|jar|JAR|exe|EXE|pk3|war|wsz|ear|zargo|xpi|sxw|ott|od[fgpst]|epub)' unzip zipinfo complete -f -X '*.Z' compress znew -complete -f -X '!*.@(Z|gz|tgz|Gz|dz)' gunzip -# TODO: see #455510 -#complete -f -X '!*.@(Z|gz|tgz|Gz|dz)' zcmp zdiff zcat zegrep zfgrep zgrep zless zmore -complete -f -X '!*.*' zcmp zdiff zcat zegrep zfgrep zgrep zless zmore +# zcmp, zdiff, z*grep, zless, zmore intentionally not here, see Debian: #455510 +complete -f -X '!*.@(Z|gz|tgz|Gz|dz)' gunzip zcat complete -f -X '!*.Z' uncompress +# lzcmp, lzdiff intentionally not here, see Debian: #455510 +complete -f -X '!*.lzma' lzcat lzegrep lzfgrep lzgrep lzless lzmore unlzma +complete -f -X '!*.@(xz|lzma)' unxz xzcat complete -f -X '!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX)' ee complete -f -X '!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|GIF|JPG|JP?(E)G|TIF?(F)|PNG|P[BGP]M|BMP|X[BP]M|RLE|RGB|PCX|FITS|PM)' xv qiv complete -f -X '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))' gv ggv kghostview @@ -106,12 +114,13 @@ complete -f -X '!*.@(dvi|DVI)?(.@(gz|Z|bz2))' kdvi complete -f -X '!*.@(dvi|DVI)' dvips dviselect dvitype dvipdf advi dvipdfm dvipdfmx complete -f -X '!*.@(pdf|PDF)' acroread gpdf xpdf complete -f -X '!*.@(?(e)ps|?(E)PS|pdf|PDF)' kpdf -complete -f -X '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2)|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX)' evince okular +complete -f -X '!*.@(@(?(e)ps|?(E)PS|pdf|PDF|dvi|DVI)?(.gz|.GZ|.bz2|.BZ2)|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX)' evince +complete -f -X '!*.@(?(e|x)ps|?(E|X)PS|pdf|PDF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb|FB|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2))' okular complete -f -X '!*.@(?(e)ps|?(E)PS|pdf|PDF)' ps2pdf ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr complete -f -X '!*.texi*' makeinfo texi2html complete -f -X '!*.@(?(la)tex|?(LA)TEX|texi|TEXI|dtx|DTX|ins|INS)' tex latex slitex jadetex pdfjadetex pdftex pdflatex texi2dvi complete -f -X '!*.@(mp3|MP3)' mpg123 mpg321 madplay -complete -f -X '!*@(.@(mp?(e)g|MP?(E)G|wma|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|viv|rm|ram|yuv|mov|MOV|qt|QT|wmv|mp[234]|MP[234]|m4[pv]|M4[PV]|mkv|MKV|ogg|OGG|ogm|OGM|wav|WAV|asx|ASX|mng|MNG|srt)|+([0-9]).@(vdr|VDR))' xine aaxine fbxine kaffeine +complete -f -X '!*@(.@(mp?(e)g|MP?(E)G|wma|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|viv|rm|ram|yuv|mov|MOV|qt|QT|wmv|mp[234]|MP[234]|m4[pv]|M4[PV]|mkv|MKV|og[gmv]|OG[GMV]|wav|WAV|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))' xine aaxine fbxine kaffeine complete -f -X '!*.@(avi|asf|wmv)' aviplay complete -f -X '!*.@(rm?(j)|ra?(m)|smi?(l))' realplay complete -f -X '!*.@(mpg|mpeg|avi|mov|qt)' xanim @@ -119,30 +128,32 @@ complete -f -X '!*.@(ogg|OGG|m3u|flac|spx)' ogg123 complete -f -X '!*.@(mp3|MP3|ogg|OGG|pls|m3u)' gqmpeg freeamp complete -f -X '!*.fig' xfig complete -f -X '!*.@(mid?(i)|MID?(I)|cmf|CMF)' playmidi -complete -f -X '!*.@(mid?(i)|MID?(I)|rmi|RMI|rcp|RCP|[gr]36|[GR]36|g18|G18|mod|MOD|xm|XM|it|IT|x3m|X3M|kar|KAR)' timidity +complete -f -X '!*.@(mid?(i)|MID?(I)|rmi|RMI|rcp|RCP|[gr]36|[GR]36|g18|G18|mod|MOD|xm|XM|it|IT|x3m|X3M|s[3t]m|S[3T]M|kar|KAR)' timidity +complete -f -X '!*.@(m[eo]d|M[EO]D|s[3t]m|S[3T]M|xm|XM|it|IT)' modplugplay complete -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' vi vim gvim rvim view rview rgvim rgview gview complete -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' emacs complete -f -X '!*.@(exe|EXE|com|COM|scr|SCR|exe.so)' wine complete -f -X '!*.@(zip|ZIP|z|Z|gz|GZ|tgz|TGZ)' bzme complete -f -X '!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))' netscape mozilla lynx opera galeon curl dillo elinks amaya -complete -f -X '!*.@(sxw|stw|sxg|sgl|doc|dot|rtf|txt|htm|html|odt|ott|odm)' oowriter -complete -f -X '!*.@(sxi|sti|pps|ppt|pot|odp|otp)' ooimpress -complete -f -X '!*.@(sxc|stc|xls|xlw|xlt|csv|ods|ots)' oocalc +complete -f -X '!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|odt|ott|odm)' oowriter +complete -f -X '!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|odp|otp)' ooimpress +complete -f -X '!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|ods|ots)' oocalc complete -f -X '!*.@(sxd|std|sda|sdd|odg|otg)' oodraw complete -f -X '!*.@(sxm|smf|mml|odf)' oomath complete -f -X '!*.odb' oobase complete -f -X '!*.rpm' rpm2cpio complete -f -X '!*.sqlite' sqlite3 complete -f -X '!*.aux' bibtex +complete -f -X '!*.po' poedit gtranslator kbabel lokalize +complete -f -X '!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])' harbour gharbour hbpp +complete -f -X '!*.[Hh][Rr][Bb]' hbrun +complete -f -X '!*.ly' lilypond ly2dvi # FINISH exclude -- do not remove this line # start of section containing compspecs that can be handled within bash # user commands see only users -complete -u su usermod userdel passwd chage write chfn groups slay w sux - -# group commands see only groups -[ -n "$bash205" ] && complete -g groupmod groupdel newgrp 2>/dev/null +complete -u su passwd write chfn groups slay w sux # bg completes with stopped jobs complete -A stopped -P '"%' -S '"' bg @@ -181,14 +192,14 @@ complete -b builtin # have() { - unset -v have - PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null && - have="yes" + unset -v have + PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null && + have="yes" } # use GNU sed if we have it, since its extensions are still used in our code # -[ $UNAME != Linux ] && have gsed && alias sed=gsed +[ $USERLAND != GNU ] && have gsed && alias sed=gsed # This function checks whether a given readline variable # is `on'. @@ -201,64 +212,166 @@ _rl_enabled() # This function shell-quotes the argument quote() { - echo \'${1//\'/\'\\\'\'}\' #'# Help vim syntax highlighting + echo \'${1//\'/\'\\\'\'}\' #'# Help vim syntax highlighting } -# This function quotes the argument in a way so that readline dequoting +# This function quotes the argument in a way so that readline dequoting # results in the original argument quote_readline() { - local t="${1//\\/\\\\}" - echo \'${t//\'/\'\\\'\'}\' #'# Help vim syntax highlighting + if [ -n "$bash4" ] ; then + # This function isn't really necessary on bash 4 + # See: http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00155.html + echo "${1}" + return + fi + local t="${1//\\/\\\\}" + echo \'${t//\'/\'\\\'\'}\' #'# Help vim syntax highlighting } # This function shell-dequotes the argument dequote() { - eval echo "$1" + eval echo "$1" 2> /dev/null } -# Get the word to complete +# Get the word to complete. # This is nicer than ${COMP_WORDS[$COMP_CWORD]}, since it handles cases # where the user is completing in the middle of a word. # (For example, if the line is "ls foobar", # and the cursor is here --------> ^ # it will complete just "foo", not "foobar", which is what the user wants.) +# @param $1 string (optional) Characters out of $COMP_WORDBREAKS which should +# NOT be considered word breaks. This is useful for things like scp where +# we want to return host:path and not only path. +# NOTE: This parameter only applies to bash-4. + +_get_cword() +{ + if [ -n "$bash4" ] ; then + __get_cword4 "$@" + else + __get_cword3 + fi +} # _get_cword() + + +# Get the word to complete on bash-3, where words are not broken by +# COMP_WORDBREAKS characters and the COMP_CWORD variables look like this, for +# example: # +# $ a b:c<TAB> +# COMP_CWORD: 1 +# COMP_CWORDS: +# 0: a +# 1: b:c # -# Accepts an optional parameter indicating which characters out of -# $COMP_WORDBREAKS should NOT be considered word breaks. This is useful -# for things like scp where we want to return host:path and not only path. -_get_cword() +# See also: +# _get_cword, main routine +# __get_cword4, bash-4 variant +# +__get_cword3() { - if [[ "${#COMP_WORDS[COMP_CWORD]}" -eq 0 ]] || [[ "$COMP_POINT" == "${#COMP_LINE}" ]]; then - printf "%s" "${COMP_WORDS[COMP_CWORD]}" - else - local i - local cur="$COMP_LINE" - local index="$COMP_POINT" - for (( i = 0; i <= COMP_CWORD; ++i )); do - while [[ "${#cur}" -ge ${#COMP_WORDS[i]} ]] && [[ "${cur:0:${#COMP_WORDS[i]}}" != "${COMP_WORDS[i]}" ]]; do - cur="${cur:1}" - index="$(( index - 1 ))" - done - if [[ "$i" -lt "$COMP_CWORD" ]]; then - local old_size="${#cur}" - cur="${cur#${COMP_WORDS[i]}}" - local new_size="${#cur}" - index="$(( index - old_size + new_size ))" - fi - done - - if [[ "${COMP_WORDS[COMP_CWORD]:0:${#cur}}" != "$cur" ]]; then - # We messed up! At least return the whole word so things - # keep working - printf "%s" "${COMP_WORDS[COMP_CWORD]}" - else - printf "%s" "${cur:0:$index}" - fi - fi -} + if [[ "${#COMP_WORDS[COMP_CWORD]}" -eq 0 ]] || [[ "$COMP_POINT" == "${#COMP_LINE}" ]]; then + printf "%s" "${COMP_WORDS[COMP_CWORD]}" + else + local i + local cur="$COMP_LINE" + local index="$COMP_POINT" + for (( i = 0; i <= COMP_CWORD; ++i )); do + while [[ + # Current COMP_WORD fits in $cur? + "${#cur}" -ge ${#COMP_WORDS[i]} && + # $cur doesn't match COMP_WORD? + "${cur:0:${#COMP_WORDS[i]}}" != "${COMP_WORDS[i]}" + ]]; do + # Strip first character + cur="${cur:1}" + # Decrease cursor position + index="$(( index - 1 ))" + done + + # Does found COMP_WORD matches COMP_CWORD? + if [[ "$i" -lt "$COMP_CWORD" ]]; then + # No, COMP_CWORD lies further; + local old_size="${#cur}" + cur="${cur#${COMP_WORDS[i]}}" + local new_size="${#cur}" + index="$(( index - old_size + new_size ))" + fi + done + + if [[ "${COMP_WORDS[COMP_CWORD]:0:${#cur}}" != "$cur" ]]; then + # We messed up! At least return the whole word so things + # keep working + printf "%s" "${COMP_WORDS[COMP_CWORD]}" + else + printf "%s" "${cur:0:$index}" + fi + fi +} # __get_cword3() + + +# Get the word to complete on bash-4, where words are splitted by +# COMP_WORDBREAKS characters (default is " \t\n\"'><=;|&(:") and the COMP_CWORD +# variables look like this, for example: +# +# $ a b:c<TAB> +# COMP_CWORD: 3 +# COMP_CWORDS: +# 0: a +# 1: b +# 2: : +# 3: c +# +# @oaram $1 string +# $1 string (optional) Characters out of $COMP_WORDBREAKS which should +# NOT be considered word breaks. This is useful for things like scp where +# we want to return host:path and not only path. +# See also: +# _get_cword, main routine +# __get_cword3, bash-3 variant +# +__get_cword4() +{ + local i + local LC_CTYPE=C + local WORDBREAKS=$COMP_WORDBREAKS + # Strip single quote (') and double quote (") from WORDBREAKS to + # workaround a bug in bash-4.0, where quoted words are split + # unintended, see: + # http://www.mail-archive.com/bug-bash@gnu.org/msg06095.html + # This fixes simple quoting (e.g. $ a "b<TAB> returns "b instead of b) + # but still fails quoted spaces (e.g. $ a "b c<TAB> returns c instead + # of "b c). + WORDBREAKS=${WORDBREAKS//\"/} + WORDBREAKS=${WORDBREAKS//\'/} + if [ -n "$1" ]; then + for (( i=0; i<${#1}; ++i )); do + local char=${1:$i:1} + WORDBREAKS=${WORDBREAKS//$char/} + done + fi + local cur=${COMP_LINE:0:$COMP_POINT} + local tmp=$cur + local word_start=`expr "$tmp" : '.*['"$WORDBREAKS"']'` + while [ "$word_start" -ge 2 ]; do + # Get character before $word_start + local char=${cur:$(( $word_start - 2 )):1} + # If the WORDBREAK character isn't escaped, exit loop + if [ "$char" != "\\" ]; then + break + fi + # The WORDBREAK character is escaped; + # Recalculate $word_start + tmp=${COMP_LINE:0:$(( $word_start - 2 ))} + word_start=`expr "$tmp" : '.*['"$WORDBREAKS"']'` + done + + cur=${cur:$word_start} + printf "%s" "$cur" +} # __get_cword4() + # This function performs file and directory completion. It's better than # simply using 'compgen -f', because it honours spaces in filenames. @@ -267,104 +380,121 @@ _get_cword() # _filedir() { - local IFS=$'\t\n' xspec - - _expand || return 0 - - local -a toks - local tmp - - # TODO: I've removed a "[ -n $tmp ] &&" before `echo $tmp', - # and everything works again. If this bug - # suddenly appears again (i.e. "cd /b<TAB>" - # becomes "cd /"), remember to check for - # other similar conditionals (here and - # _filedir_xspec()). --David - # NOTE: The comment above has been moved outside of the subshell below, - # because quotes-in-comments-in-a-subshell cause errors on - # bash-3.1. See also: - # http://www.mail-archive.com/bug-bash@gnu.org/msg01667.html - toks=( ${toks[@]-} $( - compgen -d -- "$(quote_readline "$cur")" | { - while read -r tmp; do - echo $tmp - done - } - )) - - if [[ "$1" != -d ]]; then - xspec=${1:+"!*.$1"} - toks=( ${toks[@]-} $( - compgen -f -X "$xspec" -- "$(quote_readline "$cur")" | { - while read -r tmp; do - [ -n $tmp ] && echo $tmp - done - } - )) - fi - - COMPREPLY=( "${COMPREPLY[@]}" "${toks[@]}" ) + local IFS=$'\t\n' xspec + + _expand || return 0 + + local -a toks + local tmp + + # TODO: I've removed a "[ -n $tmp ] &&" before `echo $tmp', + # and everything works again. If this bug + # suddenly appears again (i.e. "cd /b<TAB>" + # becomes "cd /"), remember to check for + # other similar conditionals (here and + # _filedir_xspec()). --David + # NOTE: The comment above has been moved outside of the subshell below, + # because quotes-in-comments-in-a-subshell cause errors on + # bash-3.1. See also: + # http://www.mail-archive.com/bug-bash@gnu.org/msg01667.html + toks=( ${toks[@]-} $( + compgen -d -- "$(quote_readline "$cur")" | { + while read -r tmp; do + echo $tmp + done +} +)) + +if [[ "$1" != -d ]]; then + xspec=${1:+"!*.$1"} + toks=( ${toks[@]-} $( + compgen -f -X "$xspec" -- "$(quote_readline "$cur")" | { + while read -r tmp; do + [ -n $tmp ] && echo $tmp + done +} +)) + fi + + COMPREPLY=( "${COMPREPLY[@]}" "${toks[@]}" ) +} + +# This function splits $cur=--foo=bar into $prev=--foo, $cur=bar, making it +# easier to support both "--foo bar" and "--foo=bar" style completions. +# Returns 0 if current option was split, 1 otherwise. +# +_split_longopt() +{ + if [[ "$cur" == --?*=* ]]; then + # Cut also backslash before '=' in case it ended up there + # for some reason. + prev="${cur%%?(\\)=*}" + cur="${cur#*=}" + return 0 + fi + + return 1 } # This function tries to parse the output of $command --help # _parse_help() { - local cmd - cmd=$1 - $cmd --help | \ - grep -- "^[[:space:]]*-" | \ - tr "," " " | \ - awk '{print $1; if ($2 ~ /-.*/) { print $2 } }' | \ - sed -e "s:=.*::g" + local cmd + cmd=$1 + $cmd --help | \ + grep -- "^[[:space:]]*-" | \ + tr "," " " | \ + awk '{print $1; if ($2 ~ /-.*/) { print $2 } }' | \ + sed -e "s:=.*::g" } # This function completes on signal names # _signals() { - local i - - # standard signal completion is rather braindead, so we need - # to hack around to get what we want here, which is to - # complete on a dash, followed by the signal name minus - # the SIG prefix - COMPREPLY=( $( compgen -A signal SIG${cur#-} )) - for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do - COMPREPLY[i]=-${COMPREPLY[i]#SIG} - done + local i + + # standard signal completion is rather braindead, so we need + # to hack around to get what we want here, which is to + # complete on a dash, followed by the signal name minus + # the SIG prefix + COMPREPLY=( $( compgen -A signal SIG${cur#-} )) + for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do + COMPREPLY[i]=-${COMPREPLY[i]#SIG} + done } # This function completes on configured network interfaces # _configured_interfaces() { - if [ -f /etc/debian_version ]; then - # Debian system - COMPREPLY=( $( sed -ne 's|^iface \([^ ]\+\).*$|\1|p' \ - /etc/network/interfaces ) ) - elif [ -f /etc/SuSE-release ]; then - # SuSE system - COMPREPLY=( $( command ls \ - /etc/sysconfig/network/ifcfg-* | \ - sed -ne 's|.*ifcfg-\('$cur'.*\)|\1|p' ) ) - elif [ -f /etc/pld-release ]; then - # PLD Linux - COMPREPLY=( $( command ls -B \ - /etc/sysconfig/interfaces | \ - sed -ne 's|.*ifcfg-\('$cur'.*\)|\1|p' ) ) - else - # Assume Red Hat - COMPREPLY=( $( command ls \ - /etc/sysconfig/network-scripts/ifcfg-* | \ - sed -ne 's|.*ifcfg-\('$cur'.*\)|\1|p' ) ) - fi + if [ -f /etc/debian_version ]; then + # Debian system + COMPREPLY=( $( sed -ne 's|^iface \([^ ]\+\).*$|\1|p' \ + /etc/network/interfaces ) ) + elif [ -f /etc/SuSE-release ]; then + # SuSE system + COMPREPLY=( $( command ls \ + /etc/sysconfig/network/ifcfg-* | \ + sed -ne 's|.*ifcfg-\('"$cur"'.*\)|\1|p' ) ) + elif [ -f /etc/pld-release ]; then + # PLD Linux + COMPREPLY=( $( command ls -B \ + /etc/sysconfig/interfaces | \ + sed -ne 's|.*ifcfg-\('"$cur"'.*\)|\1|p' ) ) + else + # Assume Red Hat + COMPREPLY=( $( command ls \ + /etc/sysconfig/network-scripts/ifcfg-* | \ + sed -ne 's|.*ifcfg-\('"$cur"'.*\)|\1|p' ) ) + fi } # This function completes on available kernels # _kernel_versions() { - COMPREPLY=( $( command ls /lib/modules | grep "^$cur" ) ) + COMPREPLY=( $( compgen -W '$( command ls /lib/modules )' -- "$cur" ) ) } # This function completes on all available network interfaces @@ -373,39 +503,39 @@ _kernel_versions() # _available_interfaces() { - local cmd - - if [ "${1:-}" = -w ]; then - cmd="iwconfig" - elif [ "${1:-}" = -a ]; then - cmd="ifconfig" - else - cmd="ifconfig -a" - fi - - COMPREPLY=( $( eval $cmd 2>/dev/null | \ - sed -ne 's|^\('$cur'[^[:space:][:punct:]]\{1,\}\).*$|\1|p') ) + local cmd + + if [ "${1:-}" = -w ]; then + cmd="iwconfig" + elif [ "${1:-}" = -a ]; then + cmd="ifconfig" + else + cmd="ifconfig -a" + fi + + COMPREPLY=( $( eval $cmd 2>/dev/null | \ + sed -ne 's|^\('"$cur"'[^[:space:][:punct:]]\{1,\}\).*$|\1|p') ) } # This function expands tildes in pathnames # _expand() { - # FIXME: Why was this here? - #[ "$cur" != "${cur%\\}" ] && cur="$cur\\" - - # Expand ~username type directory specifications. We want to expand - # ~foo/... to /home/foo/... to avoid problems when $cur starting with - # a tilde is fed to commands and ending up quoted instead of expanded. - - if [[ "$cur" == \~*/* ]]; then - eval cur=$cur - elif [[ "$cur" == \~* ]]; then - cur=${cur#\~} - COMPREPLY=( $( compgen -P '~' -u $cur ) ) - [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]} - return ${#COMPREPLY[@]} - fi + # FIXME: Why was this here? + #[ "$cur" != "${cur%\\}" ] && cur="$cur\\" + + # Expand ~username type directory specifications. We want to expand + # ~foo/... to /home/foo/... to avoid problems when $cur starting with + # a tilde is fed to commands and ending up quoted instead of expanded. + + if [[ "$cur" == \~*/* ]]; then + eval cur=$cur + elif [[ "$cur" == \~* ]]; then + cur=${cur#\~} + COMPREPLY=( $( compgen -P '~' -u "$cur" ) ) + [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]} + return ${#COMPREPLY[@]} + fi } # This function completes on process IDs. @@ -413,11 +543,11 @@ _expand() [ $UNAME = SunOS -o $UNAME = AIX ] && _pids() { - COMPREPLY=( $( compgen -W '$( command ps -efo pid | sed 1d )' -- $cur )) + COMPREPLY=( $( compgen -W '$( command ps -efo pid | sed 1d )' -- "$cur" )) } || _pids() { - COMPREPLY=( $( compgen -W '$( command ps axo pid | sed 1d )' -- $cur ) ) + COMPREPLY=( $( compgen -W '$( command ps axo pid= )' -- "$cur" ) ) } # This function completes on process group IDs. @@ -425,11 +555,11 @@ _pids() [ $UNAME = SunOS -o $UNAME = AIX ] && _pgids() { - COMPREPLY=( $( compgen -W '$( command ps -efo pgid | sed 1d )' -- $cur )) + COMPREPLY=( $( compgen -W '$( command ps -efo pgid | sed 1d )' -- "$cur" )) } || _pgids() { - COMPREPLY=( $( compgen -W '$( command ps axo pgid | sed 1d )' -- $cur )) + COMPREPLY=( $( compgen -W '$( command ps axo pgid= )' -- "$cur" )) } # This function completes on process names. @@ -437,110 +567,115 @@ _pgids() [ $UNAME = SunOS -o $UNAME = AIX ] && _pnames() { - COMPREPLY=( $( compgen -W '$( command ps -efo comm | \ - sed -e 1d -e "s:.*/::" -e "s/^-//" \ - -e "s/^<defunct>$//")' \ - -- $cur ) ) + COMPREPLY=( $( compgen -W '$( command ps -efo comm | \ + sed -e 1d -e "s:.*/::" -e "s/^-//" \ + -e "s/^<defunct>$//")' \ + -- "$cur" ) ) } || _pnames() { - # FIXME: completes "[kblockd/0]" to "0". Previously it was completed - # to "kblockd" which isn't correct either. "kblockd/0" would be - # arguably most correct, but killall from psmisc 22 treats arguments - # containing "/" specially unless -r is given so that wouldn't quite - # work either. Perhaps it'd be best to not complete these to anything - # for now. - # Not using "ps axo comm" because under some Linux kernels, it - # truncates command names (see e.g. http://bugs.debian.org/497540#19) - COMPREPLY=( $( compgen -W '$( command ps axo command | \ - sed -e "1d; s/ .*//; s:.*/::; s/:$//;" \ - -e "s/^[[(-]//; s/[])]$//" \ - -e "s/^<defunct>$//")' \ - -- $cur ) ) + # FIXME: completes "[kblockd/0]" to "0". Previously it was completed + # to "kblockd" which isn't correct either. "kblockd/0" would be + # arguably most correct, but killall from psmisc 22 treats arguments + # containing "/" specially unless -r is given so that wouldn't quite + # work either. Perhaps it'd be best to not complete these to anything + # for now. + # Not using "ps axo comm" because under some Linux kernels, it + # truncates command names (see e.g. http://bugs.debian.org/497540#19) + COMPREPLY=( $( compgen -W '$( command ps axo command= | \ + sed -e "s/ .*//; s:.*/::; s/:$//;" \ + -e "s/^[[(-]//; s/[])]$//" \ + -e "s/^<defunct>$//")' \ + -- "$cur" ) ) } # This function completes on user IDs # _uids() { - if type getent &>/dev/null; then - COMPREPLY=( $( getent passwd | \ - awk -F: '{if ($3 ~ /^'$cur'/) print $3}' ) ) - elif type perl &>/dev/null; then - COMPREPLY=( $( compgen -W '$( perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"' )' -- $cur ) ) - else - # make do with /etc/passwd - COMPREPLY=( $( awk 'BEGIN {FS=":"} {if ($3 ~ /^'$cur'/) print $3}'\ - /etc/passwd ) ) - fi + if type getent &>/dev/null; then + COMPREPLY=( $( compgen -W '$( getent passwd | cut -d: -f3 )' -- "$cur" ) ) + elif type perl &>/dev/null; then + COMPREPLY=( $( compgen -W '$( perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"' )' -- "$cur" ) ) + else + # make do with /etc/passwd + COMPREPLY=( $( compgen -W '$( cut -d: -f3 /etc/passwd )' -- "$cur" ) ) + fi } # This function completes on group IDs # _gids() { - if type getent &>/dev/null; then - COMPREPLY=( $( getent group | \ - awk -F: '{if ($3 ~ /^'$cur'/) print $3}' ) ) - elif type perl &>/dev/null; then - COMPREPLY=( $( compgen -W '$( perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"' )' -- $cur ) ) - else - # make do with /etc/group - COMPREPLY=( $( awk 'BEGIN {FS=":"} {if ($3 ~ /^'$cur'/) print $3}'\ - /etc/group ) ) - fi + if type getent &>/dev/null; then + COMPREPLY=( $( getent group | \ + awk -F: '{if ($3 ~ /^'"$cur"'/) print $3}' ) ) + elif type perl &>/dev/null; then + COMPREPLY=( $( compgen -W '$( perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"' )' -- "$cur" ) ) + else + # make do with /etc/group + COMPREPLY=( $( awk 'BEGIN {FS=":"} {if ($3 ~ /^'"$cur"'/) print $3}'\ + /etc/group ) ) + fi } # This function completes on services # _services() { - local sysvdir famdir - [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d || sysvdir=/etc/init.d - famdir=/etc/xinetd.d - COMPREPLY=( $( builtin echo $sysvdir/!(*.rpm@(orig|new|save)|*~|functions)) ) + local sysvdir famdir + [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d || sysvdir=/etc/init.d + famdir=/etc/xinetd.d + COMPREPLY=( $( builtin echo $sysvdir/!(*.rpm@(orig|new|save)|*~|functions)) ) - if [ -d $famdir ]; then - COMPREPLY=( "${COMPREPLY[@]}" $( builtin echo $famdir/!(*.rpm@(orig|new|save)|*~)) ) - fi + if [ -d $famdir ]; then + COMPREPLY=( "${COMPREPLY[@]}" $( builtin echo $famdir/!(*.rpm@(orig|new|save)|*~)) ) + fi - COMPREPLY=( $( compgen -W '${COMPREPLY[@]#@($sysvdir|$famdir)/}' -- $cur ) ) + COMPREPLY=( $( compgen -W '${COMPREPLY[@]#@($sysvdir|$famdir)/}' -- "$cur" ) ) } # This function completes on modules # _modules() { - local modpath - modpath=/lib/modules/$1 - COMPREPLY=( $( command ls -R $modpath | \ - sed -ne 's/^\('$cur'.*\)\.k\?o\(\|.gz\)$/\1/p') ) + local modpath + modpath=/lib/modules/$1 + COMPREPLY=( $( command ls -R $modpath | \ + sed -ne 's/^\('"$cur"'.*\)\.k\?o\(\|.gz\)$/\1/p') ) } # This function completes on installed modules # _installed_modules() { - COMPREPLY=( $( compgen -W "$( /sbin/lsmod | \ - awk '{if (NR != 1) print $1}' )" -- $1 ) ) + COMPREPLY=( $( compgen -W "$( PATH="$PATH:/sbin" lsmod | \ + awk '{if (NR != 1) print $1}' )" -- $1 ) ) } # This function completes on user:group format # _usergroup() { - local IFS=$'\n' - cur=${cur//\\\\ / } - if [[ $cur = *@(\\:|.)* ]] && [ -n "$bash205" ]; then - user=${cur%%*([^:.])} - COMPREPLY=( $(compgen -P ${user/\\\\} -g -- ${cur##*[.:]}) ) - elif [[ $cur = *:* ]] && [ -n "$bash205" ]; then - COMPREPLY=( $( compgen -g -- ${cur##*[.:]} ) ) - else - COMPREPLY=( $( compgen -S : -u -- $cur ) ) - fi + local IFS=$'\n' + cur=${cur//\\\\ / } + if [[ $cur = *@(\\:|.)* ]] && [ -n "$bash205" ]; then + user=${cur%%*([^:.])} + COMPREPLY=( $(compgen -P ${user/\\\\} -g -- ${cur##*[.:]}) ) + elif [[ $cur = *:* ]] && [ -n "$bash205" ]; then + COMPREPLY=( $( compgen -g -- ${cur##*[.:]} ) ) + else + COMPREPLY=( $( compgen -S : -u -- "$cur" ) ) + fi } +# This function completes on valid shells +# +_shells() +{ + COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W '$( grep "^[[:space:]]*/" \ + /etc/shells 2>/dev/null )' -- "$cur" ) ) +} # Get real command. # - arg: $1 Command @@ -548,15 +683,15 @@ _usergroup() # Empty string if command not found. # - return: True (0) if command found, False (> 0) if not. _realcommand() { - type -P "$1" > /dev/null && { - if type -p realpath > /dev/null; then - realpath "$(type -P "$1")" - elif type -p readlink > /dev/null; then - readlink -f "$(type -P "$1")" - else - type -P "$1" - fi - } + type -P "$1" > /dev/null && { + if type -p realpath > /dev/null; then + realpath "$(type -P "$1")" + elif type -p readlink > /dev/null; then + readlink -f "$(type -P "$1")" + else + type -P "$1" + fi +} } @@ -564,485 +699,306 @@ _realcommand() { # _count_args() { - args=1 - for (( i=1; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" != -* ]]; then - args=$(($args+1)) - fi - done + args=1 + for (( i=1; i < COMP_CWORD; i++ )); do + if [[ "${COMP_WORDS[i]}" != -* ]]; then + args=$(($args+1)) + fi + done } -# This function complete on PCI IDs +# This function completes on PCI IDs # _pci_ids() { - COMPREPLY=( ${COMPREPLY[@]:-} \ - $( compgen -W "$( lspci -n | awk '{print $3}')" -- $cur ) ) + COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W \ + "$( PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur" ) ) } -# This function complete on USB IDs +# This function completes on USB IDs # _usb_ids() { - COMPREPLY=( ${COMPREPLY[@]:-} \ - $( compgen -W "$( lsusb | awk '{print $6}')" -- $cur ) ) -} - -# start of section containing completion functions for bash built-ins - -# bash alias completion -# -_alias() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - case "$COMP_LINE" in - *[^=]) - COMPREPLY=( $( compgen -A alias -- $cur ) ) - ;; - *=) - COMPREPLY=( "$( alias ${cur%=} 2>/dev/null | \ - sed -e 's|^alias '$cur'\(.*\)$|\1|' )" ) - ;; - esac -} -complete -F _alias $nospace alias - -# bash export completion -# -_export() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - case "$COMP_LINE" in - *=\$*) - COMPREPLY=( $( compgen -v -P '$' -- ${cur#*=\$} ) ) - ;; - *[^=]) - COMPREPLY=( $( compgen -v -S '=' -- $cur ) ) - ;; - *=) - COMPREPLY=( "$( eval echo -n \"$`echo ${cur%=}`\" | - ( echo -n \' - sed -e 's/'\''/'\''\\\'\'''\''/g' - echo -n \' ) )" ) - ;; - esac -} -complete -F _export $default $nospace export - -# bash shell function completion -# -_function() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [[ $1 == @(declare|typeset) ]]; then - if [ "$prev" = -f ]; then - COMPREPLY=( $( compgen -A function -- $cur ) ) - elif [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-a -f -F -i -r -x -p' -- \ - $cur ) ) - fi - elif [ $COMP_CWORD -eq 1 ]; then - COMPREPLY=( $( compgen -A function -- $cur ) ) - else - COMPREPLY=( "() $( type -- ${COMP_WORDS[1]} | sed -e 1,2d )" ) - fi + COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W \ + "$( PATH="$PATH:/sbin" lsusb | awk '{print $6}' )" -- "$cur" ) ) } -complete -F _function function declare typeset - -# bash complete completion -# -_complete() -{ - local cur prev options - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case $prev in - -o) - options="default dirnames filenames" - [ -n "$bash205b" ] && options="$options nospace" - [ -n "$bash3" ] && options="$options bashdefault plusdirs" - COMPREPLY=( $( compgen -W "$options" -- $cur ) ) - return 0 - ;; - - -A) - COMPREPLY=( $( compgen -W 'alias arrayvar binding \ - builtin command directory disabled enabled \ - export file function group helptopic hostname \ - job keyword running service setopt shopt \ - signal stopped user variable' -- $cur ) ) - return 0 - ;; - - -C) - COMPREPLY=( $( compgen -A command -- $cur ) ) - return 0 - ;; - -F) - COMPREPLY=( $( compgen -A function -- $cur ) ) - return 0 - ;; - -@(p|r)) - COMPREPLY=( $( complete -p | sed -e 's|.* ||' | \ - grep "^$cur" ) ) - return 0 - ;; - - esac - - if [[ "$cur" == -* ]]; then - # relevant options completion - options="-a -b -c -d -e -f -g -j -k -s -v -u -A -G -W -P -S -X -F -C" - [ -n "$bash205" ] && options="$options -o" - COMPREPLY=( $( compgen -W "$options" -- $cur ) ) - else - COMPREPLY=( $( compgen -A command -- $cur ) ) - fi -} -complete -F _complete complete # start of section containing completion functions for external programs # a little help for FreeBSD ports users [ $UNAME = FreeBSD ] && complete -W 'index search fetch fetch-list \ - extract patch configure build install reinstall \ - deinstall clean clean-depends kernel buildworld' make +extract patch configure build install reinstall \ +deinstall clean clean-depends kernel buildworld' make # This completes on a list of all available service scripts for the # 'service' command and/or the SysV init.d directory, followed by # that script's available commands # { have service || [ -d /etc/init.d/ ]; } && -_service() -{ - local cur sysvdir - - COMPREPLY=() - prev=${COMP_WORDS[COMP_CWORD-1]} - cur=`_get_cword` - - # don't complete for things like killall, ssh and mysql if it's - # the standalone command, rather than the init script - [[ ${COMP_WORDS[0]} != @(*init.d/!(functions|~)|service) ]] && return 0 - - # don't complete past 2nd token - [ $COMP_CWORD -gt 2 ] && return 0 - - [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d \ - || sysvdir=/etc/init.d - - if [[ $COMP_CWORD -eq 1 ]] && [[ $prev == "service" ]]; then - _services - else - COMPREPLY=( $( compgen -W '`sed -ne "y/|/ /; \ - s/^.*Usage.*{\(.*\)}.*$/\1/p" \ - $sysvdir/${prev##*/} 2>/dev/null`' -- $cur ) ) - fi - - return 0 -} && -complete -F _service service -[ -d /etc/init.d/ ] && complete -F _service $default \ - $(for i in /etc/init.d/*; do echo ${i##*/}; done) - -# chown(1) completion -# -_chown() -{ - local cur - cur=`_get_cword` - - # options completion - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-c -h -f -R -v --changes \ - --dereference --no-dereference --from= --silent --quiet \ - --reference= --recursive --verbose --help --version' -- $cur ) ) - else - _count_args - - case $args in - 1) - _usergroup - ;; - *) - _filedir - ;; - esac - fi -} -complete -F _chown $filenames chown - -# chgrp(1) completion -# -_chgrp() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - cur=${cur//\\\\/} - prev=${COMP_WORDS[COMP_CWORD-1]} - - # options completion - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-c -h -f -R -v --changes \ - --dereference --no-dereference --silent --quiet \ - --reference= --recursive --verbose --help --version' -- $cur ) ) - return 0 - fi - - # first parameter on line or first since an option? - if [ $COMP_CWORD -eq 1 ] && [[ "$cur" != -* ]] || \ - [[ "$prev" == -* ]] && [ -n "$bash205" ]; then - local IFS=$'\n' - COMPREPLY=( $( compgen -g $cur 2>/dev/null ) ) - else - _filedir || return 0 - fi - - return 0 -} -complete -F _chgrp $filenames chgrp - -# umount(8) completion. This relies on the mount point being the third -# space-delimited field in the output of mount(8) -# -_umount() -{ - local cur IFS=$'\n' - - COMPREPLY=() - cur=`_get_cword` - - COMPREPLY=( $( compgen -W '$( mount | cut -d" " -f 3 )' -- $cur ) ) - - return 0 -} -complete -F _umount $dirnames umount - -# mount(8) completion. This will pull a list of possible mounts out of -# /etc/{,v}fstab, unless the word being completed contains a ':', which -# would indicate the specification of an NFS server. In that case, we -# query the server for a list of all available exports and complete on -# that instead. -# -_mount() -{ - local cur i sm host - - COMPREPLY=() - cur=`_get_cword` - [[ "$cur" == \\ ]] && cur="/" - - for i in {,/usr}/{,s}bin/showmount; do [ -x $i ] && sm=$i && break; done - - if [ -n "$sm" ] && [[ "$cur" == *:* ]]; then - COMPREPLY=( $( $sm -e ${cur%%:*} | sed 1d | \ - grep ^${cur#*:} | awk '{print $1}' ) ) - elif [[ "$cur" == //* ]]; then - host=${cur#//} - host=${host%%/*} - if [ -n "$host" ]; then - COMPREPLY=( $( compgen -W "$( echo $( smbclient -d 0 -NL $host 2>/dev/null| - sed -ne '/^['"$'\t '"']*Sharename/,/^$/p' | - sed -ne '3,$s|^[^A-Za-z]*\([^'"$'\t '"']*\).*$|//'$host'/\1|p' ) )" -- "$cur" ) ) - fi - elif [ -r /etc/vfstab ]; then - # Solaris - COMPREPLY=( $( awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' \ - /etc/vfstab | grep "^$cur" ) ) - elif [ ! -e /etc/fstab ]; then - # probably Cygwin - COMPREPLY=( $( mount | awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' \ - | grep "^$cur" ) ) - else - # probably Linux - COMPREPLY=( $( awk '! /^[ \t]*#/ {if ($2 ~ /\//) print $2}' \ - /etc/fstab | grep "^$cur" ) ) - fi - - return 0 -} -complete -F _mount $default $dirnames mount - -# Linux rmmod(8) completion. This completes on a list of all currently -# installed kernel modules. -# -have rmmod && { -_rmmod() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _installed_modules "$cur" - return 0 -} -complete -F _rmmod rmmod - -# Linux insmod(8), modprobe(8) and modinfo(8) completion. This completes on a -# list of all available modules for the version of the kernel currently -# running. -# -_insmod() -{ - local cur prev modpath - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - # behave like lsmod for modprobe -r - if [ $1 = "modprobe" ] && - [ "${COMP_WORDS[1]}" = "-r" ]; then - _installed_modules "$cur" - return 0 - fi - - # do filename completion if we're giving a path to a module - if [[ "$cur" == */* ]]; then - _filedir '@(?(k)o?(.gz))' - return 0 - fi - - if [ $COMP_CWORD -gt 1 ] && - [[ "${COMP_WORDS[COMP_CWORD-1]}" != -* ]]; then - # do module parameter completion - COMPREPLY=( $( /sbin/modinfo -p ${COMP_WORDS[1]} 2>/dev/null | \ - awk '{if ($1 ~ /^parm:/ && $2 ~ /^'$cur'/) { print $2 } \ - else if ($1 !~ /:/ && $1 ~ /^'$cur'/) { print $1 }}' ) ) - else - _modules $(uname -r) - fi - - return 0 -} -complete -F _insmod $filenames insmod modprobe modinfo -} - -# man(1) completion -# -[ $UNAME = GNU -o $UNAME = Linux -o $UNAME = Darwin \ - -o $UNAME = FreeBSD -o $UNAME = SunOS -o $UNAME = Cygwin \ - -o $UNAME = OpenBSD ] && -_man() -{ - local cur prev sect manpath manext mansect UNAME - - manext="@([0-9lnp]|[0-9][px]|man)?(.@(gz|bz2|lzma))" - mansect="@([0-9lnp]|[0-9][px])" - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [[ "$prev" == -l ]]; then - _filedir $manext - return 0 - fi - - _expand || return 0 - - # file based completion if parameter contains / - if [[ "$cur" == */* ]]; then - _filedir $manext - return 0 - fi - - UNAME=$( uname -s ) - # strip OS type and version under Cygwin - UNAME=${UNAME/CYGWIN_*/Cygwin} - if [ $UNAME = GNU -o $UNAME = Linux -o $UNAME = FreeBSD \ - -o $UNAME = Cygwin ]; then - manpath=$( manpath 2>/dev/null || command man --path ) - else - manpath=$MANPATH - fi - - if [ -z "$manpath" ]; then - COMPREPLY=( $( compgen -c -- $cur ) ) - return 0 - fi - - # determine manual section to search - [[ "$prev" == $mansect ]] && sect=$prev || sect='*' - - manpath=$manpath: - if [ -n "$cur" ]; then - manpath="${manpath//://*man$sect/$cur* } ${manpath//://*cat$sect/$cur* }" - else - manpath="${manpath//://*man$sect/ } ${manpath//://*cat$sect/ }" - fi - - # redirect stderr for when path doesn't exist - COMPREPLY=( $( eval command ls "$manpath" 2>/dev/null ) ) - # weed out directory path names and paths to man pages - COMPREPLY=( ${COMPREPLY[@]##*/?(:)} ) - # strip suffix from man pages - COMPREPLY=( ${COMPREPLY[@]%.@(gz|bz2|lzma)} ) - COMPREPLY=( $( compgen -W '${COMPREPLY[@]%.*}' -- "${cur//\\\\/}" ) ) - - if [[ "$prev" != $mansect ]]; then - # File based completion for the rest, prepending ./ if needed - # (man 1.6f needs that for man pages in current dir) - local start=${#COMPREPLY[@]} - _filedir $manext - for (( i=$start; i < ${#COMPREPLY[@]}; i++ )); do - [[ ${COMPREPLY[i]} == */* ]] || COMPREPLY[i]=./${COMPREPLY[i]} - done - fi - - return 0 + _service() + { + local cur prev sysvdir + + COMPREPLY=() + prev=${COMP_WORDS[COMP_CWORD-1]} + cur=`_get_cword` + + # don't complete for things like killall, ssh and mysql if it's + # the standalone command, rather than the init script + [[ ${COMP_WORDS[0]} != @(*init.d/!(functions|~)|service) ]] && return 0 + + # don't complete past 2nd token + [ $COMP_CWORD -gt 2 ] && return 0 + + [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d \ + || sysvdir=/etc/init.d + + if [[ $COMP_CWORD -eq 1 ]] && [[ $prev == "service" ]]; then + _services + else + COMPREPLY=( $( compgen -W '`sed -ne "y/|/ /; \ + s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\1/p" \ + $sysvdir/${prev##*/} 2>/dev/null`' -- "$cur" ) ) + fi + + return 0 + } && + complete -F _service service + [ -d /etc/init.d/ ] && complete -F _service $default \ + $(for i in /etc/init.d/*; do echo ${i##*/}; done) + + # chown(1) completion + # + _chown() + { + local cur prev split=false + cur=`_get_cword` + prev=${COMP_WORDS[COMP_CWORD-1]} + + _split_longopt && split=true + + case "$prev" in + --from) + _usergroup + return 0 + ;; + --reference) + _filedir + return 0 + ;; + esac + + $split && return 0 + + # options completion + if [[ "$cur" == -* ]]; then + COMPREPLY=( $( compgen -W '-c -h -f -R -v --changes \ + --dereference --no-dereference --from --silent --quiet \ + --reference --recursive --verbose --help --version' -- "$cur" ) ) + else + _count_args + + case $args in + 1) + _usergroup + ;; + *) + _filedir + ;; + esac + fi + } + complete -F _chown $filenames chown + + # chgrp(1) completion + # + _chgrp() + { + local cur prev split=false + + COMPREPLY=() + cur=`_get_cword` + cur=${cur//\\\\/} + prev=${COMP_WORDS[COMP_CWORD-1]} + + _split_longopt && split=true + + if [[ "$prev" == --reference ]]; then + _filedir + return 0 + fi + + $split && return 0 + + # options completion + if [[ "$cur" == -* ]]; then + COMPREPLY=( $( compgen -W '-c -h -f -R -v --changes \ + --dereference --no-dereference --silent --quiet \ + --reference --recursive --verbose --help --version' -- "$cur" ) ) + return 0 + fi + + # first parameter on line or first since an option? + if [ $COMP_CWORD -eq 1 ] && [[ "$cur" != -* ]] || \ + [[ "$prev" == -* ]] && [ -n "$bash205" ]; then + local IFS=$'\n' + COMPREPLY=( $( compgen -g "$cur" 2>/dev/null ) ) + else + _filedir || return 0 + fi + + return 0 + } + complete -F _chgrp $filenames chgrp + + # umount(8) completion. This relies on the mount point being the third + # space-delimited field in the output of mount(8) + # + _umount() + { + local cur IFS=$'\n' + + COMPREPLY=() + cur=`_get_cword` + + COMPREPLY=( $( compgen -W '$( mount | cut -d" " -f 3 )' -- "$cur" ) ) + + return 0 + } + complete -F _umount $dirnames umount + + # mount(8) completion. This will pull a list of possible mounts out of + # /etc/{,v}fstab, unless the word being completed contains a ':', which + # would indicate the specification of an NFS server. In that case, we + # query the server for a list of all available exports and complete on + # that instead. + # + _mount() + { + local cur i sm host prev + + COMPREPLY=() + cur=`_get_cword` + [[ "$cur" == \\ ]] && cur="/" + prev=${COMP_WORDS[COMP_CWORD-1]} + + for i in {,/usr}/{,s}bin/showmount; do [ -x $i ] && sm=$i && break; done + + if [ -n "$sm" ] && [[ "$cur" == *:* ]]; then + COMPREPLY=( $( $sm -e ${cur%%:*} | sed 1d | \ + grep ^${cur#*:} | awk '{print $1}' ) ) + elif [[ "$cur" == //* ]]; then + host=${cur#//} + host=${host%%/*} + if [ -n "$host" ]; then + COMPREPLY=( $( compgen -W "$( echo $( smbclient -d 0 -NL $host 2>/dev/null| + sed -ne '/^['"$'\t '"']*Sharename/,/^$/p' | + sed -ne '3,$s|^[^A-Za-z]*\([^'"$'\t '"']*\).*$|//'$host'/\1|p' ) )" -- "$cur" ) ) + fi + elif [ -r /etc/vfstab ]; then + # Solaris + COMPREPLY=( $( compgen -W "$( awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' /etc/vfstab )" -- "$cur" ) ) + elif [ ! -e /etc/fstab ]; then + # probably Cygwin + COMPREPLY=( $( compgen -W "$( mount | awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' )" -- "$cur" ) ) + else + # probably Linux + if [ $prev = -L ]; then + COMPREPLY=( $( compgen -W '$(sed -ne "s/^[[:space:]]*LABEL=\([^[:space:]]*\).*/\1/p" /etc/fstab )' -- "$cur" ) ) + elif [ $prev = -U ]; then + COMPREPLY=( $( compgen -W '$(sed -ne "s/^[[:space:]]*UUID=\([^[:space:]]*\).*/\1/p" /etc/fstab )' -- "$cur" ) ) + else + COMPREPLY=( $( compgen -W "$( awk '! /^[ \t]*#/ {if ($2 ~ /\//) print $2}' /etc/fstab )" -- "$cur" ) ) + fi + fi + + return 0 + } + complete -F _mount $default $dirnames mount + + # Linux rmmod(8) completion. This completes on a list of all currently + # installed kernel modules. + # + have rmmod && { + _rmmod() + { + local cur + + COMPREPLY=() + cur=`_get_cword` + + _installed_modules "$cur" + return 0 + } + complete -F _rmmod rmmod + + # Linux insmod(8), modprobe(8) and modinfo(8) completion. This completes on a + # list of all available modules for the version of the kernel currently + # running. + # + _insmod() + { + local cur prev modpath + + COMPREPLY=() + cur=`_get_cword` + prev=${COMP_WORDS[COMP_CWORD-1]} + + # behave like lsmod for modprobe -r + if [ $1 = "modprobe" ] && + [ "${COMP_WORDS[1]}" = "-r" ]; then + _installed_modules "$cur" + return 0 + fi + + # do filename completion if we're giving a path to a module + if [[ "$cur" == */* ]]; then + _filedir '@(?(k)o?(.gz))' + return 0 + fi + + if [ $COMP_CWORD -gt 1 ] && + [[ "${COMP_WORDS[COMP_CWORD-1]}" != -* ]]; then + # do module parameter completion + COMPREPLY=( $( /sbin/modinfo -p ${COMP_WORDS[1]} 2>/dev/null | \ + awk '{if ($1 ~ /^parm:/ && $2 ~ /^'"$cur"'/) { print $2 } \ + else if ($1 !~ /:/ && $1 ~ /^'"$cur"'/) { print $1 }}' ) ) + else + _modules $(uname -r) + fi + + return 0 + } + complete -F _insmod $filenames insmod modprobe modinfo } -[ $UNAME = GNU -o $UNAME = Linux -o $UNAME = Darwin \ - -o $UNAME = FreeBSD -o $UNAME = SunOS -o $UNAME = Cygwin \ - -o $UNAME = OpenBSD ] && \ -complete -F _man $filenames man apropos whatis # renice(8) completion # _renice() { - local command cur curopt i - - COMPREPLY=() - cur=`_get_cword` - command=$1 - - i=0 - # walk back through command line and find last option - while [ $i -le $COMP_CWORD -a ${#COMPREPLY[@]} -eq 0 ]; do - curopt=${COMP_WORDS[COMP_CWORD-$i]} - case "$curopt" in - -u) - COMPREPLY=( $( compgen -u -- $cur ) ) - ;; - -g) - _pgids - ;; - -p|$command) - _pids - ;; - esac - i=$(( ++i )) - done + local command cur curopt i + + COMPREPLY=() + cur=`_get_cword` + command=$1 + + i=0 + # walk back through command line and find last option + while [ $i -le $COMP_CWORD -a ${#COMPREPLY[@]} -eq 0 ]; do + curopt=${COMP_WORDS[COMP_CWORD-$i]} + case "$curopt" in + -u) + COMPREPLY=( $( compgen -u -- "$cur" ) ) + ;; + -g) + _pgids + ;; + -p|$command) + _pids + ;; + esac + i=$(( ++i )) + done } complete -F _renice renice @@ -1050,18 +1006,18 @@ complete -F _renice renice # _kill() { - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then - # return list of available signals - _signals - else - # return list of available PIDs - _pids - fi + local cur + + COMPREPLY=() + cur=`_get_cword` + + if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then + # return list of available signals + _signals + else + # return list of available PIDs + _pids + fi } complete -F _kill kill @@ -1070,18 +1026,18 @@ complete -F _kill kill [ $UNAME = Linux -o $UNAME = FreeBSD ] || have pkill && _killall() { - local cur + local cur - COMPREPLY=() - cur=`_get_cword` + COMPREPLY=() + cur=`_get_cword` - if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then - _signals - else - _pnames - fi + if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then + _signals + else + _pnames + fi - return 0 + return 0 } [ $UNAME = Linux -o $UNAME = FreeBSD ] && complete -F _killall killall have pkill && complete -F _killall pkill @@ -1091,2147 +1047,337 @@ have pkill && complete -F _killall pkill [ $UNAME = Linux ] || have pgrep && _pgrep() { - local cur + local cur - COMPREPLY=() - cur=`_get_cword` + COMPREPLY=() + cur=`_get_cword` - _pnames + _pnames - return 0 + return 0 } have pgrep && complete -F _pgrep pgrep # Linux pidof(8) completion. [ $UNAME = Linux ] && complete -F _pgrep pidof -# GNU find(1) completion. This makes heavy use of ksh style extended -# globs and contains Linux specific code for completing the parameter -# to the -fstype option. -# -_find() -{ - local cur prev i exprfound onlyonce - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(max|min)depth) - COMPREPLY=( $( compgen -W '0 1 2 3 4 5 6 7 8 9' -- $cur ) ) - return 0 - ;; - -?(a|c)newer|-fls|-fprint?(0|f)|-?(i)?(l)name|-?(i)wholename) - _filedir - return 0 - ;; - -fstype) - # this is highly non-portable - [ -e /proc/filesystems ] && - COMPREPLY=( $( cut -d$'\t' -f 2 /proc/filesystems | \ - grep "^$cur" ) ) - return 0 - ;; - -gid) - _gids - return 0 - ;; - -group) - if [ -n "$bash205" ]; then - COMPREPLY=( $( compgen -g -- $cur 2>/dev/null) ) - fi - return 0 - ;; - -?(x)type) - COMPREPLY=( $( compgen -W 'b c d p f l s' -- $cur ) ) - return 0 - ;; - -uid) - _uids - return 0 - ;; - -user) - COMPREPLY=( $( compgen -u -- $cur ) ) - return 0 - ;; - -exec|-ok) - COMP_WORDS=(COMP_WORDS[0] $cur) - COMP_CWORD=1 - _command - return 0 - ;; - -[acm]min|-[acm]time|-?(i)?(l)?(whole)name|-inum|-?(i)path|-?(i)regex| \ - -links|-perm|-size|-used|-printf) - # do nothing, just wait for a parameter to be given - return 0 - ;; - esac - - _expand || return 0 - - # set exprfound to 1 if there is already an expression present - for i in ${COMP_WORDS[@]}; do - [[ "$i" = [-\(\),\!]* ]] && exprfound=1 && break - done - - # handle case where first parameter is not a dash option - if [ "$exprfound" != 1 ] && [[ "$cur" != [-\(\),\!]* ]]; then - _filedir -d - return 0 - fi - - # complete using basic options - COMPREPLY=( $( compgen -W '-daystart -depth -follow -help -maxdepth \ - -mindepth -mount -noleaf -version -xdev -amin -anewer \ - -atime -cmin -cnewer -ctime -empty -false -fstype \ - -gid -group -ilname -iname -inum -ipath -iregex \ - -wholename \ - -links -lname -mmin -mtime -name -newer -nouser \ - -nogroup -perm -regex -size -true -type -uid -used \ - -user -xtype -exec -fls -fprint -fprint0 -fprintf -ok \ - -print -print0 -printf -prune -ls -wholename -iwholename' -- $cur ) ) - - # this removes any options from the list of completions that have - # already been specified somewhere on the command line, as long as - # these options can only be used once (in a word, "options", in - # opposition to "tests" and "actions", as in the find(1) manpage). - onlyonce=' -daystart -depth -follow -help -maxdepth -mindepth -mount \ - -noleaf -version -xdev ' - COMPREPLY=( $( echo "${COMP_WORDS[@]}" | \ - (while read -d ' ' i; do - [ "$i" == "" ] || - [ "${onlyonce/ ${i%% *} / }" == "$onlyonce" ] && - continue - # flatten array with spaces on either side, - # otherwise we cannot grep on word boundaries of - # first and last word - COMPREPLY=" ${COMPREPLY[@]} " - # remove word from list of completions - COMPREPLY=( ${COMPREPLY/ ${i%% *} / } ) - done - echo "${COMPREPLY[@]}") - ) ) - - _filedir - - return 0 -} -complete -F _find $filenames find - -# Linux iwconfig(8) completion -# -[ $UNAME = Linux ] && have iwconfig && -_iwconfig() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case $prev in - mode) - COMPREPLY=( $( compgen -W 'managed ad-hoc master \ - repeater secondary monitor' -- $cur ) ) - return 0 - ;; - essid) - COMPREPLY=( $( compgen -W 'on off any' -- $cur ) ) - if [ -n "${COMP_IWLIST_SCAN:-}" ]; then - COMPREPLY=( "${COMPREPLY[@]}" \ - $( iwlist ${COMP_WORDS[1]} scan | \ - awk -F '"' '/ESSID/ {print $2}' | \ - grep "^$cur" )) - fi - return 0 - ;; - nwid) - COMPREPLY=( $( compgen -W 'on off' -- $cur ) ) - return 0 - ;; - channel) - COMPREPLY=( $( iwlist ${COMP_WORDS[1]} channel | \ - awk '/^[[:space:]]*Channel/ {print $2}' | \ - grep "^$cur" ) ) - return 0 - ;; - - freq) - COMPREPLY=( $( iwlist ${COMP_WORDS[1]} channel | \ - awk '/^[[:space:]]*Channel/ {print $4"G"}' | \ - grep "^$cur" ) ) - return 0 - ;; - ap) - COMPREPLY=( $( compgen -W 'on off any' -- $cur ) ) - if [ -n "${COMP_IWLIST_SCAN:-}" ]; then - COMPREPLY=( "${COMPREPLY[@]}" \ - $( iwlist ${COMP_WORDS[1]} scan | \ - awk -F ': ' '/Address/ {print $2}' | \ - grep "^$cur" ) ) - fi - return 0 - ;; - rate) - COMPREPLY=( $( compgen -W 'auto fixed' -- $cur ) ) - COMPREPLY=( "${COMPREPLY[@]}" \ - $( iwlist ${COMP_WORDS[1]} rate | \ - awk '/^[[:space:]]*[0-9]/ {print $1"M"}' | \ - grep "^$cur" ) ) - return 0 - ;; - rts) - COMPREPLY=( $( compgen -W 'auto fixed off' -- $cur ) ) - return 0 - ;; - frag) - COMPREPLY=( $( compgen -W 'auto fixed off' -- $cur ) ) - return 0 - ;; - key) - COMPREPLY=( $( compgen -W 'off on open restricted' -- $cur ) ) - return 0 - ;; - enc) - COMPREPLY=( $( compgen -W 'off on open restricted' -- $cur ) ) - return 0 - ;; - power) - COMPREPLY=( $( compgen -W 'period timeout off on' -- $cur ) ) - return 0 - ;; - txpower) - COMPREPLY=( $( compgen -W 'off on auto' -- $cur ) ) - return 0 - ;; - retry) - COMPREPLY=( $( compgen -W 'limit lifetime' -- $cur ) ) - return 0 - ;; - esac - - if [ $COMP_CWORD -eq 1 ]; then - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--help --version' -- $cur ) ) - else - _available_interfaces -w - fi - else - COMPREPLY=( $( compgen -W 'essid nwid mode freq channel sens mode \ - ap nick rate rts frag enc key power txpower commit' -- $cur ) ) - fi - -} && -complete -F _iwconfig iwconfig - -# Linux iwlist(8) completion -# -[ $UNAME = Linux ] && have iwlist && -_iwlist() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [ $COMP_CWORD -eq 1 ]; then - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--help --version' -- $cur ) ) - else - _available_interfaces -w - fi - else - COMPREPLY=( $( compgen -W 'scan scanning freq frequency \ - channel rate bit bitrate key enc encryption power \ - txpower retry ap accesspoint peers event' -- $cur ) ) - fi -} && -complete -F _iwlist iwlist - -# Linux iwspy(8) completion -# -[ $UNAME = Linux ] && have iwspy && -_iwspy() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [ $COMP_CWORD -eq 1 ]; then - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--help --version' -- $cur ) ) - else - _available_interfaces -w - fi - else - COMPREPLY=( $( compgen -W 'setthr getthr off' -- $cur ) ) - fi -} && -complete -F _iwspy iwspy - -# Linux iwpriv(8) completion -# -[ $UNAME = Linux ] && have iwpriv && -_iwpriv() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - roam) - COMPREPLY=( $( compgen -W 'on off' -- $cur ) ) - return 0 - ;; - port) - COMPREPLY=( $( compgen -W 'ad-hoc managed' -- $cur ) ) - return 0 - ;; - esac - - if [ $COMP_CWORD -eq 1 ]; then - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--help --version' -- $cur ) ) - else - _available_interfaces -w - fi - else - COMPREPLY=( $( compgen -W '--all roam port' -- $cur ) ) - fi -} && -complete -F _iwpriv iwpriv - # Red Hat & Debian GNU/Linux if{up,down} completion # -[ $UNAME = Linux ] && { have ifup || have ifdown; } && +[ $USERLAND = GNU ] && { have ifup || have ifdown; } && _ifupdown() { - local cur + local cur - COMPREPLY=() - cur=`_get_cword` + COMPREPLY=() + cur=`_get_cword` - if [ $COMP_CWORD -eq 1 ]; then - _configured_interfaces - COMPREPLY=( $(compgen -W '${COMPREPLY[@]}' -- "$cur") ) - fi + if [ $COMP_CWORD -eq 1 ]; then + _configured_interfaces + COMPREPLY=( $(compgen -W '${COMPREPLY[@]}' -- "$cur") ) + fi - return 0 + return 0 } && complete -F _ifupdown ifup ifdown -[ $UNAME = Linux ] && have ifstatus && complete -F _ifupdown ifstatus +[ $USERLAND = GNU ] && have ifstatus && complete -F _ifupdown ifstatus # Linux ipsec(8) completion (for FreeS/WAN) # [ $UNAME = Linux ] && have ipsec && _ipsec() { - local cur - - COMPREPLY=() - cur=`_get_cword` - - - if [ $COMP_CWORD -eq 1 ]; then - COMPREPLY=( $( compgen -W 'auto barf eroute klipsdebug look \ - manual pluto ranbits rsasigkey \ - setup showdefaults showhostkey spi \ - spigrp tncfg whack' -- $cur ) ) - return 0 - fi - - case ${COMP_WORDS[1]} in - auto) - COMPREPLY=( $( compgen -W '--asynchronous --up --add --delete \ - --replace --down --route --unroute \ - --ready --status --rereadsecrets' \ - -- $cur ) ) - ;; - manual) - COMPREPLY=( $( compgen -W '--up --down --route --unroute \ - --union' -- $cur ) ) - ;; - ranbits) - COMPREPLY=( $( compgen -W '--quick --continuous --bytes' \ - -- $cur ) ) - ;; - setup) - COMPREPLY=( $( compgen -W '--start --stop --restart' -- $cur ) ) - ;; - - *) - ;; - esac - - return 0 -} && -complete -F _ipsec ipsec - -# Postfix completion. -# -have postfix && { -# postfix(1) -# -_postfix() -{ - local cur prev - - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [[ $cur == '-' ]]; then - COMPREPLY=(-c -D -v) - return 0 - fi - if [[ $prev == '-c' ]]; then - _filedir -d - return 0 - fi - if [[ $prev == '-D' ]]; then - COMPREPLY=( $( compgen -W 'start' -- "`_get_cword`" ) ) - return 0 - fi - COMPREPLY=( $( compgen -W 'start stop reload abort flush check' -- \ - "`_get_cword`" ) ) -} -complete -F _postfix postfix - -# postalias(1) and postmap(1) -# -_postmap() -{ - local cur prev len idx - - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [[ $cur == '-' ]]; then - COMPREPLY=(-N -f -i -n -o -p -r -v -w -c -d -q) - return 0 - fi - if [[ $prev == '-c' ]]; then - _filedir -d - return 0 - fi - if [[ $prev == -[dq] ]]; then - return 0 - fi - - if [[ "$cur" == *:* ]]; then - COMPREPLY=( $( compgen -f -- ${cur#*:} ) ) - else - len=${#cur} - idx=0 - for pval in $( /usr/sbin/postconf -m ); do - if [[ "$cur" == "${pval:0:$len}" ]]; then - COMPREPLY[$idx]="$pval:" - idx=$(($idx+1)) - fi - done - if [[ $idx -eq 0 ]]; then - COMPREPLY=( $( compgen -f -- "$cur" ) ) - fi - fi - return 0 -} -complete -F _postmap postmap postalias - -# postcat(1) -# -_postcat() -{ - local cur prev pval len idx qfile - - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [[ $cur == '-' ]]; then - COMPREPLY=(-c -q -v) - return 0 - fi - if [[ $prev == '-c' ]]; then - _filedir -d - return 0 - fi - - qfile=0 - for idx in "${COMP_WORDS[@]}"; do - [[ "$idx" = -q ]] && qfile=1 && break - done - if [[ $qfile == 1 ]]; then - len=${#cur} - idx=0 - for pval in $( mailq | \ - sed -e '1d; $d; /^[^0-9A-Z]\|^$/d; s/[* !].*$//' ); do - if [[ "$cur" == "${pval:0:$len}" ]]; then - COMPREPLY[$idx]=$pval - idx=$(($idx+1)) - fi - done - return 0 - else - _filedir - return 0 - fi -} -complete -F _postcat postcat - -# postconf(1) -# -_postconf() -{ - local cur prev pval len idx eqext - - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - if [[ $cur == '-' ]]; then - COMPREPLY=(-c -d -e -h -m -l -n -v) - return 0 - fi - if [[ $prev == '-c' ]]; then - _filedir -d - return 0 - fi - if [[ $prev == '-e' ]]; then - cur=${cur#[\"\']} - eqext='=' - fi - len=${#cur} - idx=0 - for pval in $( /usr/sbin/postconf | cut -d ' ' -f 1 ); do - if [[ "$cur" == "${pval:0:$len}" ]]; then - COMPREPLY[$idx]="$pval$eqext" - idx=$(($idx+1)) - fi - done - return 0 -} -complete -F _postconf postconf - -# postsuper(1) -# -_postsuper() -{ - local cur prev pval len idx - - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [[ $cur == '-' ]]; then - COMPREPLY=(-c -d -h -H -p -r -s -v) - return 0 - fi - case $prev in - -[dr]) - len=${#cur} - idx=0 - for pval in $( echo ALL; mailq | \ - sed -e '1d; $d; /^[^0-9A-Z]\|^$/d; s/[* !].*$//' ); do - if [[ "$cur" == "${pval:0:$len}" ]]; then - COMPREPLY[$idx]=$pval - idx=$(($idx+1)) - fi - done - return 0 - ;; - -h) - len=${#cur} - idx=0 - for pval in $( echo ALL; mailq | \ - sed -e '1d; $d; /^[^0-9A-Z]\|^$/d; s/[* ].*$//; /!$/d' ); do - if [[ "$cur" == "${pval:0:$len}" ]]; then - COMPREPLY[$idx]=$pval - idx=$(($idx+1)) - fi - done - return 0 - ;; - -H) - len=${#cur} - idx=0 - for pval in $( echo ALL; mailq | \ - sed -e '1d; $d; /^[^0-9A-Z]\|^$/d; /^[0-9A-Z]*[* ]/d; s/!.*$//' ); do - if [[ "$cur" == "${pval:0:$len}" ]]; then - COMPREPLY[$idx]=$pval - idx=$(($idx+1)) - fi - done - return 0 - ;; - esac - COMPREPLY=( $( compgen -W 'hold incoming active deferred' -- $cur ) ) - return 0 -} -complete -F _postsuper postsuper -} - -# cvs(1) completion -# -have cvs && { -set_prefix() -{ - [ -z ${prefix:-} ] || prefix=${cur%/*}/ - [ -r ${prefix:-}CVS/Entries ] || prefix="" -} - -get_entries() -{ - local IFS=$'\n' - [ -r ${prefix:-}CVS/Entries ] && \ - entries=$(cut -d/ -f2 -s ${prefix:-}CVS/Entries) -} - -get_modules() -{ - if [ -n "$prefix" ]; then - COMPREPLY=( $( command ls -d ${cvsroot}/${prefix}/!(CVSROOT) ) ) - else - COMPREPLY=( $( command ls -d ${cvsroot}/!(CVSROOT) ) ) - fi -} - -_cvs() -{ - local cur count mode i cvsroot cvsroots pwd - local -a flags miss files entries changed newremoved - - COMPREPLY=() - cur=`_get_cword` - - count=0 - for i in "${COMP_WORDS[@]}"; do - [ $count -eq $COMP_CWORD ] && break - # Last parameter was the CVSROOT, now go back to mode selection - if [ "${COMP_WORDS[((count))]}" == "$cvsroot" -a "$mode" == "cvsroot" ]; then - mode="" - fi - if [ -z "$mode" ]; then - case $i in - -d) - mode=cvsroot - cvsroot=${COMP_WORDS[((count+1))]} - ;; - @(ad?(d)|new)) - mode=add - ;; - @(adm?(in)|rcs)) - mode=admin - ;; - ann?(notate)) - mode=annotate - ;; - @(checkout|co|get)) - mode=checkout - ;; - @(com?(mit)|ci)) - mode=commit - ;; - di?(f?(f))) - mode=diff - ;; - ex?(p?(ort))) - mode=export - ;; - ?(un)edit) - mode=$i - ;; - hi?(s?(tory))) - mode=history - ;; - im?(p?(ort))) - mode=import - ;; - re?(l?(ease))) - mode=release - ;; - ?(r)log) - mode=log - ;; - @(rdiff|patch)) - mode=rdiff - ;; - @(remove|rm|delete)) - mode=remove - ;; - @(rtag|rfreeze)) - mode=rtag - ;; - st?(at?(us))) - mode=status - ;; - @(tag|freeze)) - mode=tag - ;; - up?(d?(ate))) - mode=update - ;; - *) - ;; - esac - elif [[ "$i" = -* ]]; then - flags=( "${flags[@]}" $i ) - fi - count=$((++count)) - done - - case "$mode" in - add) - if [[ "$cur" != -* ]]; then - set_prefix - if [ $COMP_CWORD -gt 1 -a -r ${prefix:-}CVS/Entries ]; then - get_entries - [ -z "$cur" ] && \ - files=$( command ls -Ad !(CVS) ) || \ - files=$( command ls -d ${cur}* 2>/dev/null ) - for i in "${entries[@]}"; do - files=( ${files[@]/#$i//} ) - done - COMPREPLY=( $( compgen -X '*~' -W '${files[@]}' -- \ - $cur ) ) - fi - else - COMPREPLY=( $( compgen -W '-k -m' -- $cur ) ) - fi - ;; - admin) - if [[ "$cur" = -* ]]; then - COMPREPLY=( $( compgen -W '-i -a -A -e -b -c -k -l -u \ - -L -U -m -M -n -N -o -q -I \ - -s -t -t- -T -V -x -z' -- \ - $cur ) ) - fi - ;; - annotate) - if [[ "$cur" = -* ]]; then - COMPREPLY=( $( compgen -W '-D -F -f -l -R -r' -- $cur ) ) - else - get_entries - COMPREPLY=( $( compgen -W '${entries[@]}' -- $cur ) ) - fi - ;; - checkout) - if [[ "$cur" != -* ]]; then - [ -z "$cvsroot" ] && cvsroot=$CVSROOT - COMPREPLY=( $( cvs -d "$cvsroot" co -c 2> /dev/null | \ - awk '{print $1}' ) ) - COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) ) - else - COMPREPLY=( $( compgen -W '-A -N -P -R -c -f -l -n -p \ - -s -r -D -d -k -j' -- $cur ) ) - fi - ;; - commit) - set_prefix - - if [[ "$cur" != -* ]] && [ -r ${prefix:-}CVS/Entries ]; then - # if $COMP_CVS_REMOTE is not null, 'cvs commit' will - # complete on remotely checked-out files (requires - # passwordless access to the remote repository - if [ -n "${COMP_CVS_REMOTE:-}" ]; then - # this is the least computationally intensive - # way found so far, but other changes - # (something other than changed/removed/new) - # may be missing - changed=( $( cvs -q diff --brief 2>&1 | \ - sed -ne 's/^Files [^ ]* and \([^ ]*\) differ$/\1/p' ) ) - newremoved=( $( cvs -q diff --brief 2>&1 | \ - sed -ne 's/^cvs diff: \([^ ]*\) .*, no comparison available$/\1/p' ) ) - COMPREPLY=( $( compgen -W '${changed[@]:-} \ - ${newremoved[@]:-}' -- $cur ) ) - else - COMPREPLY=( $(compgen $default -- "$cur") ) - fi - else - COMPREPLY=( $( compgen -W '-n -R -l -f -F -m -r' -- \ - $cur ) ) - fi - ;; - cvsroot) - if [ -r ~/.cvspass ]; then - # Ugly escaping because of bash treating ':' specially - cvsroots=$( sed 's/^[^ ]* //; s/:/\\:/g' ~/.cvspass ) - COMPREPLY=( $( compgen -W '$cvsroots' -- $cur ) ) - fi - ;; - export) - if [[ "$cur" != -* ]]; then - [ -z "$cvsroot" ] && cvsroot=$CVSROOT - COMPREPLY=( $( cvs -d "$cvsroot" co -c | awk '{print $1}' ) ) - COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) ) - else - COMPREPLY=( $( compgen -W '-N -f -l -R -n \ - -r -D -d -k' -- $cur ) ) - fi - ;; - diff) - if [[ "$cur" == -* ]]; then - _longopt diff - else - get_entries - COMPREPLY=( $( compgen -W '${entries[@]:-}' -- $cur ) ) - fi - ;; - remove) - if [[ "$cur" != -* ]]; then - set_prefix - if [ $COMP_CWORD -gt 1 -a -r ${prefix:-}CVS/Entries ]; then - get_entries - # find out what files are missing - for i in "${entries[@]}"; do - [ ! -r "$i" ] && miss=( "${miss[@]}" $i ) - done - COMPREPLY=( $(compgen -W '${miss[@]:-}' -- $cur) ) - fi - else - COMPREPLY=( $( compgen -W '-f -l -R' -- $cur ) ) - fi - ;; - import) - if [[ "$cur" != -* ]]; then - # starts with same algorithm as checkout - [ -z "$cvsroot" ] && cvsroot=$CVSROOT - prefix=${cur%/*} - if [ -r ${cvsroot}/${prefix} ]; then - get_modules - COMPREPLY=( ${COMPREPLY[@]#$cvsroot} ) - COMPREPLY=( ${COMPREPLY[@]#\/} ) - fi - pwd=$( pwd ) - pwd=${pwd##*/} - COMPREPLY=( $( compgen -W '${COMPREPLY[@]} $pwd' -- \ - $cur ) ) - else - COMPREPLY=( $( compgen -W '-d -k -I -b -m -W' -- $cur )) - fi - ;; - update) - if [[ "$cur" = -* ]]; then - COMPREPLY=( $( compgen -W '-A -P -C -d -f -l -R -p \ - -k -r -D -j -I -W' -- \ - $cur ) ) - fi - ;; - "") - COMPREPLY=( $( compgen -W 'add admin annotate checkout ci co \ - commit diff delete edit export \ - freeze get history import log new \ - patch rcs rdiff release remove \ - rfreeze rlog rm rtag stat status \ - tag unedit up update -H -Q -q -b \ - -d -e -f -l -n -t -r -v -w -x -z \ - --help --version' -- $cur ) ) - ;; - *) - ;; - esac - - return 0 -} -complete -F _cvs $default cvs -} - -have rpm && { -# helper functions for rpm completion -# -_rpm_installed_packages() -{ - local ver nodig="$1" nosig="$2" - - if [ -r /var/log/rpmpkgs -a \ - /var/log/rpmpkgs -nt /var/lib/rpm/Packages ]; then - # using RHL 7.2 or later - this is quicker than querying the DB - COMPREPLY=( $( sed -ne \ - 's|^\('$cur'[^[:space:]]*\)-[^[:space:]-]\+-[^[:space:]-]\+\.rpm$|\1|p' \ - /var/log/rpmpkgs ) ) - else - _rpm_nodigsig - COMPREPLY=( $( rpm -qa $nodig $nosig --qf='%{NAME} ' "$cur*" ) ) - fi -} - -_rpm_groups() -{ - local IFS=$'\t' - # remove trailing backslash, or grep will complain - cur=${cur%"\\"} - COMPREPLY=( $( rpm -qa $nodig $nosig --queryformat '%{group}\n' | \ - grep "^$cur" ) ) - # backslash escape spaces and translate newlines to tabs - COMPREPLY=( $( echo "${COMPREPLY[@]}" | sed 's/ /\\ /g' | tr '\n' '\t' ) ) -} - -_rpm_nodigsig() -{ - if [ -z "$nodig" -a -z "$nosig" ]; then - local rpmver - - rpmver=$(rpm --version) - rpmver=${rpmver##* } - - if [[ "$rpmver" > "4.0.4" ]]; then - nodig="--nodigest" - fi - if [[ "$rpmver" > "4.0.99" ]]; then - nosig="--nosignature" - fi - fi -} - -# rpm(8) completion -# -_rpm() -{ - local cur prev nodig nosig - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - nodig="" - nosig="" - _rpm_nodigsig - - if [ $COMP_CWORD -eq 1 ]; then - # first parameter on line - case "$cur" in - -b*) - COMPREPLY=( $( compgen -W '-ba -bb -bc -bi -bl -bp -bs'\ - -- $cur ) ) - ;; - -t*) - COMPREPLY=( $( compgen -W '-ta -tb -tc -ti -tl -tp -ts'\ - -- $cur ) ) - ;; - --*) - COMPREPLY=( $( compgen -W '--help --version --initdb \ - --checksig --recompile --rebuild --resign --addsign \ - --rebuilddb --showrc --setperms --setugids --tarbuild \ - --eval --install --upgrade --query --freshen --erase \ - --verify --querytags --rmsource --rmspec --clean \ - --import' -- $cur ) ) - ;; - *) - COMPREPLY=( $( compgen -W '-b -e -E -F -i -q -t -U -V' \ - -- $cur ) ) - ;; - esac - - return 0 - fi - - case "$prev" in - --@(@(db|exclude)path|prefix|relocate|root)) - _filedir -d - return 0 - ;; - --eval|-E) - # get a list of macros - COMPREPLY=( $( rpm --showrc | sed -ne \ - 's/^-\?[0-9]\+[:=][[:space:]]\+\('${cur#%}'[^[:space:](]*\).*/\1/p' ) ) - COMPREPLY=( "${COMPREPLY[@]/#/%}" ) - return 0 - ;; - --pipe) - COMPREPLY=( $( compgen -c -- $cur ) ) - return 0 - ;; - --rcfile) - _filedir - return 0 - ;; - --specfile) - # complete on .spec files - _filedir spec - return 0 - ;; - --whatprovides) - if [[ "$cur" == */* ]]; then - _filedir - else - # complete on capabilities - COMPREPLY=( $( rpm -qa $nodig $nosig --queryformat \ - '%{providename}\n' | grep "^$cur" ) ) - fi - return 0 - ;; - --whatrequires) - # complete on capabilities - COMPREPLY=( $( rpm -qa $nodig $nosig --queryformat \ - '%{requirename}\n' | grep "^$cur" ) ) - return 0 - ;; - --target) - COMPREPLY=( $( compgen -W "$( command rpm --showrc | sed -ne \ - 's/^\s*compatible\s\+build\s\+archs\s*:\s*\(.*\)/\1/ p' )" -- $cur ) ) - return 0 - ;; - esac - - case "${COMP_WORDS[1]}" in - -@([iFU]*|-install|-freshen|-upgrade)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--percent --force --test \ - --replacepkgs --replacefiles --root --excludedocs \ - --includedocs --noscripts --rcfile --ignorearch \ - --dbpath --prefix --ignoreos --nodeps --allfiles \ - --ftpproxy --ftpport --justdb --httpproxy --httpport \ - --noorder --relocate --badreloc --notriggers \ - --excludepath --ignoresize --oldpackage --define \ - --eval --pipe --queryformat --repackage --nosuggests \ - --nodigest --nosignature' -- $cur ) ) - else - _filedir 'rpm' - fi - ;; - -@(e|-erase)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--allmatches --noscripts \ - --notriggers --nodeps --test --repackage' -- $cur ) ) - else - _rpm_installed_packages "$nodig" "$nosig" - fi - ;; - -@(q*|-query)) - # check whether we're doing file completion - if [ "${COMP_LINE#* -*([^ -])f}" != "$COMP_LINE" ]; then - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--scripts --root \ - --rcfile --requires --ftpport --ftpproxy \ - --httpproxy --httpport --provides --triggers \ - --dump --changelog --dbpath \ - --last --filesbypkg \ - --info --list --state \ - --docfiles --configfiles --queryformat \ - --conflicts --obsoletes \ - --nodigest --nosignature \ - --suggests --enhances \ - --triggerscripts' -- $cur ) ) - else - _filedir - fi - elif [ "${COMP_LINE#* -*([^ -])g}" != "$COMP_LINE" ]; then - _rpm_groups - elif [ "${COMP_LINE#* -*([^ -])p}" != "$COMP_LINE" ]; then - # uninstalled package completion - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--scripts --root \ - --rcfile --whatprovides --whatrequires \ - --requires --triggeredby --ftpport --ftpproxy \ - --httpproxy --httpport --provides --triggers \ - --dump --changelog --dbpath --filesbypkg \ - --define --eval --pipe --showrc --info --list \ - --state --docfiles --configfiles --queryformat\ - --conflicts --obsoletes --nodigest \ - --nosignature' -- $cur ) ) - else - _filedir 'rpm' - fi - else - # installed package completion - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--scripts --root \ - --rcfile --whatprovides --whatrequires \ - --requires --triggeredby --ftpport --ftpproxy \ - --httpproxy --httpport --provides --triggers \ - --dump --changelog --dbpath --specfile \ - --querybynumber --last --filesbypkg --define \ - --eval --pipe --showrc --info --list --state \ - --docfiles --configfiles --queryformat \ - --conflicts --obsoletes --pkgid --hdrid \ - --fileid --tid --nodigest --nosignature \ - --triggerscripts' -- $cur ) ) - elif [ "${COMP_LINE#* -*([^ -])a}" == "$COMP_LINE" ]; then - _rpm_installed_packages "$nodig" "$nosig" - fi - fi - ;; - -@(K*|-checksig)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--nopgp --nogpg --nomd5 \ - --nodigest --nosignature' -- $cur ) ) - else - _filedir 'rpm' - fi - ;; - -@([Vy]*|-verify)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--root --rcfile --dbpath \ - --nodeps --nogroup --nolinkto --nomode --nomtime \ - --nordev --nouser --nofiles --noscripts --nomd5 \ - --querytags --specfile --whatrequires --whatprovides \ - --nodigest --nosignature' -- $cur ) ) - # check whether we're doing file completion - elif [ "${COMP_LINE#* -*([^ -])f}" != "$COMP_LINE" ]; then - _filedir - elif [ "${COMP_LINE#* -*([^ -])g}" != "$COMP_LINE" ]; then - _rpm_groups - elif [ "${COMP_LINE#* -*([^ -])p}" != "$COMP_LINE" ]; then - _filedir 'rpm' - else - _rpm_installed_packages "$nodig" "$nosig" - fi - ;; - -[bt]*) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--short-circuit --timecheck \ - --clean --rmsource --rmspec --test --sign --buildroot \ - --target --nobuild --nodeps --nodirtokens' -- $cur ) ) - elif [[ ${COMP_WORDS[1]} == -b* ]]; then - _filedir 'spec' - else - _filedir '@(tgz|tar.@(gz|bz2|lzma))' - fi - ;; - --re@(build|compile)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--nodeps --rmsource \ - --rmspec --sign --nodirtokens --target' -- $cur ) ) - else - _filedir '?(no)src.rpm' - fi - ;; - --tarbuild) - _filedir '@(tgz|tar.@(gz|bz2|lzma))' - ;; - --@(re|add)sign) - _filedir 'rpm' - ;; - --set@(perms|gids)) - _rpm_installed_packages "$nodig" "$nosig" - ;; - --@(clean|rms@(ource|pec))) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--clean --rmsource \ - --rmspec' -- $cur ) ) - else - _filedir 'spec' - fi - ;; - --@(import|dbpath|root)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--import --dbpath --root' \ - -- $cur ) ) - else - _filedir - fi - ;; - esac - - return 0 -} -complete -F _rpm $filenames rpm rpmbuild -} - -# Debian apt-get(8) completion. -# -have apt-get && -_apt_get() -{ - local cur prev special i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do - if [[ ${COMP_WORDS[i]} == @(install|remove|autoremove|purge|source|build-dep) ]]; then - special=${COMP_WORDS[i]} - fi - done - - if [ -n "$special" ]; then - case $special in - remove|autoremove|purge) - if [ -f /etc/debian_version ]; then - # Debian system - COMPREPLY=( $( _comp_dpkg_installed_packages \ - $cur ) ) - else - # assume RPM based - _rpm_installed_packages - fi - return 0 - ;; - *) - COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) ) - return 0 - ;; - - esac - fi - - case "$prev" in - -@(c|-config-file)) - _filedir - return 0 - ;; - - -@(t|-target-release|-default-release)) - COMPREPLY=( $( apt-cache policy | \ - grep "release.o=Debian,a=$cur" | \ - sed -e "s/.*a=\(\w*\).*/\1/" | uniq 2> /dev/null) ) - return 0 - ;; - - esac - - if [[ "$cur" == -* ]]; then - - COMPREPLY=( $( compgen -W '-d -f -h -v -m -q -s -y \ - -u -t -b -c -o --download-only --fix-broken \ - --help --version --ignore-missing \ - --fix-missing --no-download --quiet --simulate \ - --just-print --dry-run --recon --no-act --yes \ - --assume-yes --show-upgraded --only-source \ - --compile --build --ignore-hold \ - --target-release --no-upgrade --force-yes \ - --print-uris --purge --reinstall \ - --list-cleanup --default-release \ - --trivial-only --no-remove --diff-only \ - --no-install-recommends \ - --tar-only --config-file --option --auto-remove' -- $cur ) ) - else - - COMPREPLY=( $( compgen -W 'update upgrade dselect-upgrade \ - dist-upgrade install remove purge source build-dep \ - check clean autoclean autoremove' -- $cur ) ) - - fi - - - return 0 -} && -complete -F _apt_get $filenames apt-get - -# Debian apt-cache(8) completion. -# -have apt-cache && -_apt_cache() -{ - local cur prev special i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - - if [ "$cur" != show ]; then - for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do - if [[ ${COMP_WORDS[i]} == @(add|depends|dotty|madison|policy|rdepends|show?(pkg|src|)) ]]; then - special=${COMP_WORDS[i]} - fi - done - fi - - - if [ -n "$special" ]; then - case $special in - add) - _filedir - return 0 - ;; - - showsrc) - COMPREPLY=( $( apt-cache dumpavail | \ - grep "^Source: $cur" | sort | \ - uniq | cut -f2 -d" " ) ) - return 0 - ;; - - *) - COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) ) - return 0 - ;; - - esac - fi - - - case "$prev" in - -@(c|p|s|-config-file|-@(pkg|src)-cache)) - _filedir - return 0 - ;; - search) - if [[ "$cur" != -* ]]; then - return 0 - fi - ;; - esac - - if [[ "$cur" == -* ]]; then - - COMPREPLY=( $( compgen -W '-h -v -p -s -q -i -f -a -g -c \ - -o --help --version --pkg-cache --src-cache \ - --quiet --important --full --all-versions \ - --no-all-versions --generate --no-generate \ - --names-only --all-names --recurse \ - --config-file --option --installed' -- $cur ) ) - else - - COMPREPLY=( $( compgen -W 'add gencaches show showpkg showsrc \ - stats dump dumpavail unmet search search \ - depends rdepends pkgnames dotty xvcg \ - policy madison' -- $cur ) ) - - fi - - - return 0 -} && -complete -F _apt_cache $filenames apt-cache - + local cur -# Debian aptitude(1) completion -# -have aptitude && { -have grep-status && { -_comp_dpkg_hold_packages() -{ - grep-status -P -e "^$1" -a -FStatus 'hold' -n -s Package -} -} || { -_comp_dpkg_hold_packages() -{ - grep -B 2 'hold' /var/lib/dpkg/status | grep "Package: $1" \ - | cut -d\ -f2 -} -} + COMPREPLY=() + cur=`_get_cword` -_aptitude() -{ - local cur dashoptions prev special i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - - dashoptions='-S -u -i -h --help --version -s --simulate -d \ - --download-only -P --prompt -y --assume-yes -F \ - --display-format -O --sort -w --width -f -r -g \ - --with-recommends --with-suggests -R -G \ - --without-recommends --without-suggests -t \ - --target-release -V --show-versions -D --show-deps\ - -Z -v --verbose --purge-unused --schedule-only' - - for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do - if [[ ${COMP_WORDS[i]} == @(install|reinstall|hold|unhold|markauto|unmarkauto|dist-upgrade|full-upgrade|download|show|forbid-version|purge|remove|changelog|why|why-not|keep|keep-all|build-dep) ]]; then - special=${COMP_WORDS[i]} - fi - #exclude some mutually exclusive options - [[ ${COMP_WORDS[i]} == '-u' ]] && dashoptions=${dashoptions/-i} - [[ ${COMP_WORDS[i]} == '-i' ]] && dashoptions=${dashoptions/-u} - done - - if [[ -n "$special" ]]; then - case $special in - @(install|hold|markauto|unmarkauto|dist-upgrade|full-upgrade|download|show|changelog|why|why-not|build-dep)) - COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) ) - return 0 - ;; - @(purge|remove|reinstall|forbid-version)) - COMPREPLY=( $( _comp_dpkg_installed_packages $cur ) ) - return 0 - ;; - unhold) - COMPREPLY=( $( _comp_dpkg_hold_packages $cur ) ) - return 0 - ;; - - esac - fi - - case $prev in - # don't complete anything if these options are found - @(autoclean|clean|forget-new|search|upgrade|safe-upgrade|update|keep-all)) - return 0 - ;; - - -S) - _filedir - return 0 - ;; - - -@(t|-target-release|-default-release)) - COMPREPLY=( $( apt-cache policy | \ - grep "release.o=Debian,a=$cur" | \ - sed -e "s/.*a=\(\w*\).*/\1/" | uniq 2> /dev/null ) ) - return 0 - ;; - - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W "$dashoptions" -- $cur ) ) - else - COMPREPLY=( $( compgen -W 'update upgrade safe-upgrade forget-new clean \ - autoclean install reinstall remove \ - hold unhold purge markauto unmarkauto why why-not \ - dist-upgrade full-upgrade download search show \ - forbid-version changelog keep-all' -- $cur ) ) - fi - - - return 0 -} -complete -F _aptitude $default aptitude -} -# Debian apt-build(1) completion. -# -have apt-build && -_apt_build() -{ - local cur prev special i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do - if [[ ${COMP_WORDS[i]} == @(install|remove|source|info|clean) ]]; then - special=${COMP_WORDS[i]} - fi - done - - if [ -n "$special" ]; then - case $special in - @(install|source|info)) - COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) ) - return 0 - ;; - remove) - COMPREPLY=( $( _comp_dpkg_installed_packages \ - $cur ) ) - return 0 - ;; - *) - return 0 - ;; - esac - fi - - case "$prev" in - - --@(patch|build-dir|repository-dir)) - _filedir - return 0 - ;; - - -@(h|-help)) - return 0 - ;; - - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--help --show-upgraded -u --build-dir \ - --repository-dir --build-only \ - --build-command --reinstall --rebuild \ - --remove-builddep --no-wrapper --purge \ - --patch --patch-strip -p --yes -y \ - --version -v --no-source' -- $cur ) ) - - else - COMPREPLY=( $( compgen -W 'update upgrade install remove \ - source dist-upgrade world clean info \ - clean-build update-repository ' -- $cur ) ) - fi - - - return 0 -} && -complete -F _apt_build $filenames apt-build + if [ $COMP_CWORD -eq 1 ]; then + COMPREPLY=( $( compgen -W 'auto barf eroute klipsdebug look \ + manual pluto ranbits rsasigkey \ + setup showdefaults showhostkey spi \ + spigrp tncfg whack' -- "$cur" ) ) + return 0 + fi -# chsh(1) completion -# -_chsh() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [ "$prev" = "-s" ]; then - if [ -f /etc/debian_version ]; then - COMPREPLY=( $( </etc/shells ) ) - else - COMPREPLY=( $( chsh -l | grep "^$cur" ) ) - fi - else - COMPREPLY=( $( compgen -u -- $cur ) ) - fi - - return 0 -} -complete -F _chsh chsh + case ${COMP_WORDS[1]} in + auto) + COMPREPLY=( $( compgen -W '--asynchronous --up --add --delete \ + --replace --down --route --unroute \ + --ready --status --rereadsecrets' \ + -- "$cur" ) ) + ;; + manual) + COMPREPLY=( $( compgen -W '--up --down --route --unroute \ + --union' -- "$cur" ) ) + ;; + ranbits) + COMPREPLY=( $( compgen -W '--quick --continuous --bytes' \ + -- "$cur" ) ) + ;; + setup) + COMPREPLY=( $( compgen -W '--start --stop --restart' -- "$cur" ) ) + ;; + *) + ;; + esac -# chkconfig(8) completion -# -have chkconfig && -_chkconfig() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - @([1-6]|--@(list|add|del))) - _services - return 0 - ;; - --level) - COMPREPLY=( $( compgen -W '1 2 3 4 5 6' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--list --add --del --level' -- $cur ) ) - else - if [ $COMP_CWORD -eq 2 -o $COMP_CWORD -eq 4 ]; then - COMPREPLY=( $( compgen -W 'on off reset' -- $cur ) ) - else - _services - fi - fi + return 0 } && -complete -F _chkconfig chkconfig +complete -F _ipsec ipsec # This function provides simple user@host completion # _user_at_host() { - local cur + local cur - COMPREPLY=() - cur=`_get_cword` + COMPREPLY=() + cur=`_get_cword` - if [[ $cur == *@* ]]; then - _known_hosts - else - COMPREPLY=( $( compgen -u -- "$cur" ) ) - fi + if [[ $cur == *@* ]]; then + _known_hosts_real "$cur" + else + COMPREPLY=( $( compgen -u -- "$cur" ) ) + fi - return 0 + return 0 } shopt -u hostcomplete && complete -F _user_at_host $nospace talk ytalk finger -# This function performs host completion based on ssh's known_hosts files, -# defaulting to standard host completion if they don't exist. -# -# Arguments: -a Use aliases -# -c Use `:' suffix -# -F configfile Use `configfile' for configuration settings +# NOTE: Using this function as a helper function is deprecated. Use +# `_known_hosts_real' instead. _known_hosts() { - local configfile - local cur curd ocur user suffix aliases global_kh user_kh hosts i host - local -a kh khd config - - COMPREPLY=() - cur=`_get_cword` - ocur=$cur - - local OPTIND=1 - while getopts "acF:" flag "$@"; do - case $flag in - a) aliases='yes' ;; - c) suffix=':' ;; - F) configfile="$OPTARG" ;; - esac - done - - [[ $cur == *@* ]] && user=${cur%@*}@ && cur=${cur#*@} - kh=() - - # ssh config files - if [ -n "$configfile" ]; then - [ -r "$configfile" ] && - config=( "${config[@]}" "$configfile" ) - else - [ -r /etc/ssh/ssh_config ] && - config=( "${config[@]}" "/etc/ssh/ssh_config" ) - [ -r "${HOME}/.ssh/config" ] && - config=( "${config[@]}" "${HOME}/.ssh/config" ) - [ -r "${HOME}/.ssh2/config" ] && - config=( "${config[@]}" "${HOME}/.ssh2/config" ) - fi - - if [ ${#config[@]} -gt 0 ]; then - # expand path (if present) to global known hosts file - global_kh=$( eval echo "$( sed -ne 's/^[ \t]*[Gg][Ll][Oo][Bb][Aa][Ll][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/\1/p' "${config[@]}" )" ) - # expand path (if present) to user known hosts file - user_kh=$( eval echo "$( sed -ne 's/^[ \t]*[Uu][Ss][Ee][Rr][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/\1/p' "${config[@]}" )" ) - fi - - # Global known_hosts files - [ -r "$global_kh" ] && - kh=( "${kh[@]}" "$global_kh" ) - if [ -z "$configfile" ]; then - [ -r /etc/ssh/ssh_known_hosts ] && - kh=( "${kh[@]}" /etc/ssh/ssh_known_hosts ) - [ -r /etc/ssh/ssh_known_hosts2 ] && - kh=( "${kh[@]}" /etc/ssh/ssh_known_hosts2 ) - [ -r /etc/known_hosts ] && - kh=( "${kh[@]}" /etc/known_hosts ) - [ -r /etc/known_hosts2 ] && - kh=( "${kh[@]}" /etc/known_hosts2 ) - [ -d /etc/ssh2/knownhosts ] && - khd=( "${khd[@]}" /etc/ssh2/knownhosts/*pub ) - fi - - # User known_hosts files - [ -r "$user_kh" ] && - kh=( "${kh[@]}" "$user_kh" ) - if [ -z "$configfile" ]; then - [ -r ~/.ssh/known_hosts ] && - kh=( "${kh[@]}" ~/.ssh/known_hosts ) - [ -r ~/.ssh/known_hosts2 ] && - kh=( "${kh[@]}" ~/.ssh/known_hosts2 ) - [ -d ~/.ssh2/hostkeys ] && - khd=( "${khd[@]}" ~/.ssh2/hostkeys/*pub ) - fi - - # If we have known_hosts files to use - if [ ${#kh[@]} -gt 0 -o ${#khd[@]} -gt 0 -o -n "$configfile" ]; then - # Escape slashes and dots in paths for awk - cur=${cur//\//\\\/} - cur=${cur//\./\\\.} - curd=$cur - - if [[ "$cur" == [0-9]*.* ]]; then - # Digits followed by a dot - just search for that - cur="^$cur.*" - elif [[ "$cur" == [0-9]* ]]; then - # Digits followed by no dot - search for digits followed - # by a dot - cur="^$cur.*\." - elif [ -z "$cur" ]; then - # A blank - search for a dot or an alpha character - cur="[a-z.]" - else - cur="^$cur" - fi - - if [ ${#kh[@]} -gt 0 ]; then - - # FS needs to look for a comma separated list - COMPREPLY=( $( awk 'BEGIN {FS=","} - /^\s*[^|\#]/ {for (i=1; i<=2; ++i) { \ - gsub(" .*$", "", $i); \ - if ($i ~ /'$cur'/) {print $i} \ - }}' "${kh[@]}" 2>/dev/null ) ) - fi - if [ ${#khd[@]} -gt 0 ]; then - # Needs to look for files called - # .../.ssh2/key_22_<hostname>.pub - # dont fork any processes, because in a cluster environment, - # there can be hundreds of hostkeys - for i in "${khd[@]}" ; do - if [[ "$i" == *key_22_$curd*.pub ]] && [ -r "$i" ] ; then - host=${i/#*key_22_/} - host=${host/%.pub/} - COMPREPLY=( "${COMPREPLY[@]}" $host ) - fi - done - fi - # append any available aliases from config files - if [ ${#config[@]} -gt 0 ] && [ -n "$aliases" ]; then - local host_aliases=$( sed -ne 's/^[ \t]*[Hh][Oo][Ss][Tt]\([Nn][Aa][Mm][Ee]\)\?['"$'\t '"']\+\([^#*?]*\)\(#.*\)\?$/\2/p' "${config[@]}" ) - hosts=$( compgen -W "$host_aliases" -- $ocur ) - COMPREPLY=( "${COMPREPLY[@]}" $hosts ) - fi - - # Now add results of normal hostname completion - COMPREPLY=( "${COMPREPLY[@]}" $( compgen -A hostname -- $ocur ) ) - - # apply suffix - for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do - COMPREPLY[i]=$user${COMPREPLY[i]}$suffix - done - elif [ -z "$configfile" ]; then - # Just do normal hostname completion - COMPREPLY=( $( compgen -A hostname -S "$suffix" -- $cur ) ) - fi - - return 0 -} -complete -F _known_hosts traceroute traceroute6 tracepath tracepath6 \ - ping ping6 fping fping6 telnet host nslookup rsh rlogin ftp dig ssh-installkeys mtr + local options + COMPREPLY=() -# rsync(1) completion -# -have rsync && -_rsync() -{ - local cur prev shell i userhost path - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - _expand || return 0 - - case "$prev" in - --@(config|password-file|include-from|exclude-from)) - _filedir - return 0 - ;; - -@(T|-temp-dir|-compare-dest)) - _filedir -d - return 0 - ;; - -@(e|-rsh)) - COMPREPLY=( $( compgen -W 'rsh ssh' -- $cur ) ) - return 0 - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W '-v -q -c -a -r -R -b -u -l -L -H \ - -p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \ - -z -h -4 -6 --verbose --quiet --checksum \ - --archive --recursive --relative --backup \ - --backup-dir --suffix= --update --links \ - --copy-links --copy-unsafe-links --safe-links \ - --hard-links --perms --owner --group --devices\ - --times --sparse --dry-run --whole-file \ - --no-whole-file --one-file-system \ - --block-size= --rsh= --rsync-path= \ - --cvs-exclude --existing --ignore-existing \ - --delete --delete-excluded --delete-after \ - --ignore-errors --max-delete= --partial \ - --force --numeric-ids --timeout= \ - --ignore-times --size-only --modify-window= \ - --temp-dir= --compare-dest= --compress \ - --exclude= --exclude-from= --include= \ - --include-from= --version --daemon --no-detach\ - --address= --config= --port= --blocking-io \ - --no-blocking-io --stats --progress \ - --log-format= --password-file= --bwlimit= \ - --write-batch= --read-batch= --help' -- $cur )) - ;; - *:*) - # find which remote shell is used - shell=ssh - for (( i=1; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then - shell=${COMP_WORDS[i+1]} - break - fi - done - if [[ "$shell" == ssh ]]; then - # remove backslash escape from : - cur=${cur/\\:/:} - userhost=${cur%%?(\\):*} - path=${cur#*:} - # unescape spaces - path=${path//\\\\\\\\ / } - if [ -z "$path" ]; then - # default to home dir of specified - # user on remote host - path=$(ssh -o 'Batchmode yes' \ - $userhost pwd 2>/dev/null) - fi - # escape spaces; remove executables, aliases, pipes - # and sockets; add space at end of file names - COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \ - command ls -aF1d "$path*" 2>/dev/null | \ - sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \ - -e 's/[^\/]$/& /g' ) ) - fi - ;; - *) - _known_hosts -c -a - _filedir - ;; - esac - - return 0 -} && -complete -F _rsync $nospace $filenames rsync + # NOTE: Using `_known_hosts' as a helper function and passing options + # to `_known_hosts' is deprecated: Use `_known_hosts_real' instead. + [ "$1" = -a ] || [ "$2" = -a ] && options=-a + [ "$1" = -c ] || [ "$2" = -c ] && options="$options -c" + _known_hosts_real $options "$(_get_cword)" +} + +# Helper function for completing _known_hosts. +# This function performs host completion based on ssh's known_hosts files. +# Also hosts from HOSTFILE (compgen -A hostname) are added, unless +# COMP_KNOWN_HOSTS_WITH_HOSTFILE is set to an empty value. +# Usage: _known_hosts_real [OPTIONS] CWORD +# Options: -a Use aliases +# -c Use `:' suffix +# -F configfile Use `configfile' for configuration settings +# -p PREFIX Use PREFIX +# Return: Completions, starting with CWORD, are added to COMPREPLY[] +_known_hosts_real() +{ + local configfile flag prefix + local cur curd awkcur user suffix aliases global_kh user_kh hosts i host + local -a kh khd config + + local OPTIND=1 + while getopts "acF:p:" flag "$@"; do + case $flag in + a) aliases='yes' ;; + c) suffix=':' ;; + F) configfile=$OPTARG ;; + p) prefix=$OPTARG ;; + esac + done + [ $# -lt $OPTIND ] && echo "error: $FUNCNAME: missing mandatory argument CWORD" + cur=${!OPTIND}; let "OPTIND += 1" + [ $# -ge $OPTIND ] && echo "error: $FUNCNAME("$@"): unprocessed arguments:"\ + $(while [ $# -ge $OPTIND ]; do echo ${!OPTIND}; shift; done) + + [[ $cur == *@* ]] && user=${cur%@*}@ && cur=${cur#*@} + kh=() + + # ssh config files + if [ -n "$configfile" ]; then + [ -r "$configfile" ] && + config=( "${config[@]}" "$configfile" ) + else + [ -r /etc/ssh/ssh_config ] && + config=( "${config[@]}" "/etc/ssh/ssh_config" ) + [ -r "${HOME}/.ssh/config" ] && + config=( "${config[@]}" "${HOME}/.ssh/config" ) + [ -r "${HOME}/.ssh2/config" ] && + config=( "${config[@]}" "${HOME}/.ssh2/config" ) + fi -# Linux route(8) completion -# -[ $UNAME = Linux ] && -_route() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [ "$prev" = dev ]; then - COMPREPLY=( $( ifconfig -a | sed -ne 's|^\('$cur'[^ ]*\).*$|\1|p' )) - return 0 - fi - - COMPREPLY=( $( compgen -W 'add del -host -net netmask metric mss \ - window irtt reject mod dyn reinstate dev \ - default gw' -- $cur ) ) - - COMPREPLY=( $( echo " ${COMP_WORDS[@]}" | \ - (while read -d ' ' i; do - [ "$i" == "" ] && continue - # flatten array with spaces on either side, - # otherwise we cannot grep on word - # boundaries of first and last word - COMPREPLY=" ${COMPREPLY[@]} " - # remove word from list of completions - COMPREPLY=( ${COMPREPLY/ $i / } ) - done - echo "${COMPREPLY[@]}") - ) ) - return 0 -} -[ $UNAME = Linux ] && complete -F _route route + if [ ${#config[@]} -gt 0 ]; then + local OIFS=$IFS IFS=$'\n' + # expand path (if present) to global known hosts file + global_kh=($( sed -ne 's/^[ \t]*[Gg][Ll][Oo][Bb][Aa][Ll][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/"\1"/p' "${config[@]}" )) + for (( i=0; i < ${#global_kh[@]}; i++ )); do + global_kh[i]=$(echo "${global_kh[i]//\"/}") + done + # expand path (if present) to user known hosts file + user_kh=($( sed -ne 's/^[ \t]*[Uu][Ss][Ee][Rr][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/"\1"/p' "${config[@]}" )) + for (( i=0; i < ${#user_kh[@]}; i++ )); do + user_kh[i]=$(echo "${user_kh[i]//\"/}") + done + IFS=$OIFS + fi -# GNU make(1) completion -# -have make || have gmake || have gnumake || have pmake && -_make() -{ - local file makef makef_dir="." makef_inc cur prev i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - # --name value style option - case $prev in - -@(f|o|W)) - _filedir - return 0 - ;; - -@(I|C)) - _filedir -d - return 0 - ;; - esac - - # --name=value style option - if [[ "$cur" == *=* ]]; then - prev=${cur/=*/} - cur=${cur/*=/} - case "$prev" in - --@(file|makefile)) - _filedir - return 0 - ;; - --@(directory|include-dir)) - _filedir -d - return 0 - ;; - esac - fi - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-b -m -B -C -d -e -f -h -i -I\ - -j -l -k -n -o -p -q -r -R - s -S -t -v -w -W \ - --always-make --directory= --debug \ - --environment-overrides --file= --makefile= --help \ - --ignore-errors --include-dir= --jobs --load-average \ - --max-load --keep-going --just-print --dry-run \ - --recon --old-file= --assume-old= --print-data-base \ - --question --no-builtin-rules --no-builtin-variables \ - --silent --quiet --no-keep-goind --stop --touch \ - --version --print-directory --no-print-directory \ - --what-if= --new-file= --assume-new= \ - --warn-undefined-variables' -- $cur ) ) - else - # before we check for makefiles, see if a path was specified - # with -C - for (( i=0; i < ${#COMP_WORDS[@]}; i++ )); do - if [[ ${COMP_WORDS[i]} == -C ]]; then - # eval for tilde expansion - eval makef_dir=${COMP_WORDS[i+1]} - break - fi - done - - # before we scan for targets, see if a Makefile name was - # specified with -f - for (( i=0; i < ${#COMP_WORDS[@]}; i++ )); do - if [[ ${COMP_WORDS[i]} == -f ]]; then - # eval for tilde expansion - eval makef=${COMP_WORDS[i+1]} - break - fi - done - - [ -n "$makef" ] && makef="-f ${makef}" - [ -n "$makef_dir" ] && makef_dir="-C ${makef_dir}" - - COMPREPLY=( $( make -qp $makef $makef_dir 2>/dev/null | \ - awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \ - {split($1,A,/ /);for(i in A)print A[i]}' | \ - command grep "^$cur" )) - - fi -} && -complete -f -F _make $filenames make gmake gnumake pmake + # Global known_hosts files + [ -r "$global_kh" ] && + kh=( "${kh[@]}" "${global_kh[@]}" ) + if [ -z "$configfile" ]; then + [ -r /etc/ssh/ssh_known_hosts ] && + kh=( "${kh[@]}" /etc/ssh/ssh_known_hosts ) + [ -r /etc/ssh/ssh_known_hosts2 ] && + kh=( "${kh[@]}" /etc/ssh/ssh_known_hosts2 ) + [ -r /etc/known_hosts ] && + kh=( "${kh[@]}" /etc/known_hosts ) + [ -r /etc/known_hosts2 ] && + kh=( "${kh[@]}" /etc/known_hosts2 ) + [ -d /etc/ssh2/knownhosts ] && + khd=( "${khd[@]}" /etc/ssh2/knownhosts/*pub ) + fi -# 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\)\)\?\|gz\|bz2\?\|lzma\)' - ;; - *[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)' - regex='t\(ar\.\)\?lzma\?' - ;; - *) - _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 + # User known_hosts files + [ -r "$user_kh" ] && + kh=( "${kh[@]}" "${user_kh[@]}" ) + if [ -z "$configfile" ]; then + [ -r ~/.ssh/known_hosts ] && + kh=( "${kh[@]}" ~/.ssh/known_hosts ) + [ -r ~/.ssh/known_hosts2 ] && + kh=( "${kh[@]}" ~/.ssh/known_hosts2 ) + [ -d ~/.ssh2/hostkeys ] && + khd=( "${khd[@]}" ~/.ssh2/hostkeys/*pub ) + fi -# jar(1) completion -# -have jar && -_jar() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [ $COMP_CWORD = 1 ]; then - COMPREPLY=( $( compgen -W 'c t x u' -- $cur ) ) - return 0 - fi - - case "${COMP_WORDS[1]}" in - *c*f) - _filedir - ;; - *f) - _filedir '?([ejw]ar|zip|[EJW]AR|ZIP)' - ;; - *) - _filedir - ;; - esac -} && -complete -F _jar $filenames jar + # If we have known_hosts files to use + if [ ${#kh[@]} -gt 0 -o ${#khd[@]} -gt 0 -o -n "$configfile" ]; then + # Escape slashes and dots in paths for awk + awkcur=${cur//\//\\\/} + awkcur=${awkcur//\./\\\.} + curd=$awkcur + + if [[ "$awkcur" == [0-9]*.* ]]; then + # Digits followed by a dot - just search for that + awkcur="^$awkcur.*" + elif [[ "$awkcur" == [0-9]* ]]; then + # Digits followed by no dot - search for digits followed + # by a dot + awkcur="^$awkcur.*\." + elif [ -z "$awkcur" ]; then + # A blank - search for a dot or an alpha character + awkcur="[a-z.]" + else + awkcur="^$awkcur" + fi + + if [ ${#kh[@]} -gt 0 ]; then + # FS needs to look for a comma separated list + COMPREPLY=( $( awk 'BEGIN {FS=","} + /^\s*[^|\#]/ {for (i=1; i<=2; ++i) { \ + gsub(" .*$", "", $i); \ + gsub("[\\[\\]]", "", $i); \ + gsub(":[0-9]+$", "", $i); \ + if ($i ~ /'"$awkcur"'/) {print $i} \ + }}' "${kh[@]}" 2>/dev/null ) ) + fi + if [ ${#khd[@]} -gt 0 ]; then + # Needs to look for files called + # .../.ssh2/key_22_<hostname>.pub + # dont fork any processes, because in a cluster environment, + # there can be hundreds of hostkeys + for i in "${khd[@]}" ; do + if [[ "$i" == *key_22_$awkcurd*.pub ]] && [ -r "$i" ] ; then + host=${i/#*key_22_/} + host=${host/%.pub/} + COMPREPLY=( "${COMPREPLY[@]}" $host ) + fi + done + fi + # append any available aliases from config files + if [ ${#config[@]} -gt 0 ] && [ -n "$aliases" ]; then + local host_aliases=$( sed -ne 's/^[ \t]*[Hh][Oo][Ss][Tt]\([Nn][Aa][Mm][Ee]\)\?['"$'\t '"']\+\([^#*?]*\)\(#.*\)\?$/\2/p' "${config[@]}" ) + hosts=$( compgen -W "$host_aliases" -- "$cur" ) + COMPREPLY=( "${COMPREPLY[@]}" $hosts ) + fi + + # Add hosts reported by avahi, if it's available + # and if the daemon is started. + # The original call to avahi-browse also had "-k", to avoid + # lookups into avahi's services DB. We don't need the name + # of the service, and if it contains ";", it may mistify + # the result. But on Gentoo (at least), -k isn't available + # (even if mentioned in the manpage), so... + if type avahi-browse >&/dev/null; then + if [ -n "$(pidof avahi-daemon)" ]; then + COMPREPLY=( "${COMPREPLY[@]}" $( + compgen -W "$( avahi-browse -cpr _workstation._tcp | \ + grep ^= | cut -d\; -f7 | sort -u )" -- "$cur" ) ) + fi + fi + + # apply suffix and prefix + for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do + COMPREPLY[i]=$prefix$user${COMPREPLY[i]}$suffix + done + fi -# Linux iptables(8) completion -# -have iptables && -_iptables() -{ - local cur prev table chain - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - chain='s/^Chain \([^ ]\+\).*$/\1/p' - - if [[ $COMP_LINE == *-t\ *filter* ]]; then - table="-t filter" - elif [[ $COMP_LINE == *-t\ *nat* ]]; then - table="-t nat" - elif [[ $COMP_LINE == *-t\ *mangle* ]]; then - table="-t mangle" - fi - - case "$prev" in - -*[AIDRPFXLZ]) - COMPREPLY=( $( compgen -W '`iptables $table -nL | \ - sed -ne "s/^Chain \([^ ]\+\).*$/\1/p"`' -- $cur ) ) - ;; - -*t) - COMPREPLY=( $( compgen -W 'nat filter mangle' -- $cur ) ) - ;; - -j) - if [ "$table" = "-t filter" -o "$table" = "" ]; then - COMPREPLY=( $( compgen -W 'ACCEPT DROP LOG ULOG REJECT \ - `iptables $table -nL | sed -ne "$chain" \ - -e "s/INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUTING//"`' -- \ - $cur ) ) - elif [ "$table" = "-t nat" ]; then - COMPREPLY=( $( compgen -W 'ACCEPT DROP LOG ULOG REJECT \ - MIRROR SNAT DNAT MASQUERADE `iptables $table -nL | \ - sed -ne "$chain" -e "s/OUTPUT|PREROUTING|POSTROUTING//"`' \ - -- $cur ) ) - elif [ "$table" = "-t mangle" ]; then - COMPREPLY=( $( compgen -W 'ACCEPT DROP LOG ULOG REJECT \ - MARK TOS `iptables $table -nL | sed -ne "$chain" \ - -e "s/INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUTING//"`' -- \ - $cur ) ) - fi - ;; - *) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-i -o -s -d -p -f -m --append \ - --delete --insert --replace --list --flush --zero --new \ - --delete-chain --policy --rename-chain --proto --source \ - --destination --in-interface --jump --match --numeric \ - --out-interface --table --verbose --line-numbers --exact \ - --fragment --modprobe= --set-counters --version' -- "$cur") ) - fi - ;; - esac + # Add results of normal hostname completion, unless `COMP_KNOWN_HOSTS_WITH_HOSTFILE' + # is set to an empty value. + if [ -n "${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1}" ]; then + COMPREPLY=( "${COMPREPLY[@]}" $( compgen -A hostname -P "$prefix$user" -S "$suffix" -- "$cur" ) ) + fi -} && -complete -F _iptables iptables + return 0 +} +complete -F _known_hosts traceroute traceroute6 tracepath tracepath6 \ +ping ping6 fping fping6 telnet host nslookup rsh rlogin ftp dig ssh-installkeys mtr -# tcpdump(8) completion +# This meta-cd function observes the CDPATH variable, so that cd additionally +# completes on directories under those specified in CDPATH. # -have tcpdump && -_tcpdump() +_cd() { - local cur - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(r|w|F)) - _filedir - return 0 - ;; - -i) - _available_interfaces -a - return 0 - ;; - esac - - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-a -d -e -f -l -n -N -O -p \ - -q -R -S -t -u -v -x -C -F -i -m -r -s -T -w \ - -E' -- $cur ) ) - fi - -} && -complete -F _tcpdump tcpdump + local IFS=$'\t\n' cur=`_get_cword` i j k -# autorpm(8) completion -# -have autorpm && -_autorpm() -{ - local cur + # try to allow variable completion + if [[ "$cur" == ?(\\)\$* ]]; then + COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\\)$}" ) ) + return 0 + fi - COMPREPLY=() - cur=`_get_cword` + # Enable -o filenames option, see Debian bug #272660 + compgen -f /non-existing-dir/ >/dev/null - COMPREPLY=( $( compgen -W '--notty --debug --help --version \ - auto add fullinfo info help install list \ - remove set' -- $cur ) ) + # Use standard dir completion if no CDPATH or parameter starts with /, + # ./ or ../ + if [ -z "${CDPATH:-}" ] || [[ "$cur" == ?(.)?(.)/* ]]; then + _filedir -d + return 0 + fi -} && -complete -F _autorpm autorpm + local -r mark_dirs=$(_rl_enabled mark-directories && echo y) + local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y) + + # we have a CDPATH, so loop on its contents + for i in ${CDPATH//:/$'\t'}; do + # create an array of matched subdirs + k="${#COMPREPLY[@]}" + for j in $( compgen -d $i/$cur ); do + if [[ ( $mark_symdirs && -h $j || $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then + j="${j}/" + fi + COMPREPLY[k++]=${j#$i/} + done + done + + _filedir -d + + if [[ ${#COMPREPLY[@]} -eq 1 ]]; then + i=${COMPREPLY[0]} + if [ "$i" == "$cur" ] && [[ $i != "*/" ]]; then + COMPREPLY[0]="${i}/" + fi + fi -# This meta-cd function observes the CDPATH variable, so that cd additionally -# completes on directories under those specified in CDPATH. -# -_cd() -{ - local IFS=$'\t\n' cur=`_get_cword` i j k - - # try to allow variable completion - if [[ "$cur" == ?(\\)\$* ]]; then - COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\\)$}" ) ) - return 0 - fi - - # Enable -o filenames option, see Debian bug #272660 - compgen -f /non-existing-dir/ >/dev/null - - # Use standard dir completion if no CDPATH or parameter starts with /, - # ./ or ../ - if [ -z "${CDPATH:-}" ] || [[ "$cur" == ?(.)?(.)/* ]]; then - _filedir -d - return 0 - fi - - local -r mark_dirs=$(_rl_enabled mark-directories && echo y) - local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y) - - # we have a CDPATH, so loop on its contents - for i in ${CDPATH//:/$'\t'}; do - # create an array of matched subdirs - k="${#COMPREPLY[@]}" - for j in $( compgen -d $i/$cur ); do - if [[ ( $mark_symdirs && -h $j || $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then - j="${j}/" - fi - COMPREPLY[k++]=${j#$i/} - done - done - - _filedir -d - - if [[ ${#COMPREPLY[@]} -eq 1 ]]; then - i=${COMPREPLY[0]} - if [ "$i" == "$cur" ] && [[ $i != "*/" ]]; then - COMPREPLY[0]="${i}/" - fi - fi - - return 0 + return 0 } if shopt -q cdable_vars; then complete -v -F _cd $nospace cd @@ -3242,17 +1388,17 @@ fi # a wrapper method for the next one, when the offset is unknown _command() { - local offset i - - # find actual offset, as position of the first non-option - offset=1 - for (( i=1; i <= COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" != -* ]]; then - offset=$i - break - fi - done - _command_offset $offset + local offset i + + # find actual offset, as position of the first non-option + offset=1 + for (( i=1; i <= COMP_CWORD; i++ )); do + if [[ "${COMP_WORDS[i]}" != -* ]]; then + offset=$i + break + fi + done + _command_offset $offset } # A meta-command completion function for commands like sudo(8), which need to @@ -3262,6055 +1408,220 @@ _command() # _command_offset() { - local cur func cline cspec noglob cmd i char_offset word_offset \ - _COMMAND_FUNC _COMMAND_FUNC_ARGS - - word_offset=$1 - - # rewrite current completion context before invoking - # actual command completion - - # find new first word position, then - # rewrite COMP_LINE and adjust COMP_POINT - local first_word=${COMP_WORDS[$word_offset]} - for (( i=0; i <= ${#COMP_LINE}; i++ )); do - if [[ "${COMP_LINE:$i:${#first_word}}" == "$first_word" ]]; then - char_offset=$i - break - fi - done - COMP_LINE=${COMP_LINE:$char_offset} - COMP_POINT=$(( COMP_POINT - $char_offset )) - - # shift COMP_WORDS elements and adjust COMP_CWORD - for (( i=0; i <= COMP_CWORD - $word_offset; i++ )); do - COMP_WORDS[i]=${COMP_WORDS[i+$word_offset]} - done - for (( i; i <= COMP_CWORD; i++ )); do - unset COMP_WORDS[i]; - done - COMP_CWORD=$(( $COMP_CWORD - $word_offset )) - - COMPREPLY=() - cur=`_get_cword` - - if [[ $COMP_CWORD -eq 0 ]]; then - COMPREPLY=( $( compgen -c -- $cur ) ) - else - cmd=${COMP_WORDS[0]} - if complete -p $cmd &>/dev/null; then - cspec=$( complete -p $cmd ) - if [ "${cspec#* -F }" != "$cspec" ]; then - # complete -F <function> - - # get function name - func=${cspec#*-F } - func=${func%% *} - - if [[ ${#COMP_WORDS[@]} -ge 2 ]]; then - $func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" "${COMP_WORDS[${#COMP_WORDS[@]}-2]}" - else - $func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" - fi - - # remove any \: generated by a command that doesn't - # default to filenames or dirnames (e.g. sudo chown) - # FIXME: I'm pretty sure this does not work! - if [ "${cspec#*-o }" != "$cspec" ]; then - cspec=${cspec#*-o } - cspec=${cspec%% *} - if [[ "$cspec" != @(dir|file)names ]]; then - COMPREPLY=("${COMPREPLY[@]//\\\\:/:}") - fi - fi - elif [ -n "$cspec" ]; then - cspec=${cspec#complete}; - cspec=${cspec%%$cmd}; - COMPREPLY=( $( eval compgen "$cspec" -- "$cur" ) ); - fi - fi - fi - - [ ${#COMPREPLY[@]} -eq 0 ] && _filedir -} -complete -F _command $filenames nohup exec nice eval time ltrace then \ - else do vsound command xargs tsocks - -_root_command() -{ - PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin _command $1 $2 $3 -} -complete -F _root_command $filenames sudo fakeroot really gksudo gksu kdesudo - -# ant(1) completion -# -have ant && { -_ant() -{ - local cur prev buildfile i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -buildfile|-f) - _filedir 'xml' - return 0 - ;; - -logfile) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - # relevant options completion - COMPREPLY=( $( compgen -W '-help -projecthelp -version -quiet \ - -verbose -debug -emacs -logfile -logger \ - -listener -buildfile -f -D -find' -- $cur ) ) - else - # available targets completion - # find which buildfile to use - buildfile=build.xml - for (( i=1; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" == -buildfile ]]; then - buildfile=${COMP_WORDS[i+1]} - break - fi - done - [ ! -f $buildfile ] && return 0 - - # parse buildfile for targets - COMPREPLY=( $( awk -F'"' '/<target name="/ {print $2}' \ - $buildfile | grep "^$cur" ) - $( awk -F"'" "/<target name='/ "'{print $2}' \ - $buildfile | grep "^$cur" ) - $( awk -F'"' '/<target [^n]/ {if ($1 ~ /name=/) { print $2 } else if ($3 ~ /name=/) {print $4} else if ($5 ~ /name=/) {print $6}}' \ - $buildfile | grep "^$cur" ) ) - fi -} -have complete-ant-cmd.pl && \ - complete -C complete-ant-cmd.pl -F _ant $filenames ant || \ - complete -F _ant $filenames ant -} - -have nslookup && -_nslookup() -{ - local cur - - COMPREPLY=() - cur=${COMP_WORDS[COMP_CWORD]#-} - - COMPREPLY=( $( compgen -P '-' -W 'all class= debug d2 domain= \ - srchlist= defname search port= querytype= \ - type= recurse retry root timeout vc \ - ignoretc' -- $cur ) ) -} && -complete -F _nslookup nslookup - -# mysqladmin(1) completion -# -have mysqladmin && -_mysqladmin() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -u) - COMPREPLY=( $( compgen -u -- $cur ) ) - return 0 - ;; - *) - ;; - esac - - COMPREPLY=( $( compgen -W '-# -f -? -C -h -p -P -i -r -E -s -S -t -u \ - -v -V -w' -- $cur ) ) - - COMPREPLY=( "${COMPREPLY[@]}" \ - $( compgen -W 'create drop extended-status flush-hosts \ - flush-logs flush-status flush-tables \ - flush-threads flush-privileges kill \ - password ping processlist reload refresh \ - shutdown status variables version' \ - -- $cur ) ) -} && -complete -F _mysqladmin mysqladmin - -# gzip(1) completion -# -have gzip && -_gzip() -{ - local cur prev xspec helpopts - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - helpopts=`_parse_help gzip` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W "$helpopts -2 -3 -4 -5 -6 -7 -8" \ - -- "$cur" ) ) - return 0 - fi - - local IFS=$'\t\n' - - xspec="*.?(t)gz" - if [[ "$prev" == --* ]]; then - [[ "$prev" == --decompress || \ - "$prev" == --list || \ - "$prev" == --test ]] && xspec="!"$xspec - [[ "$prev" == --force ]] && xspec= - elif [[ "$prev" == -* ]]; then - [[ "$prev" == -*[dlt]* ]] && xspec="!"$xspec - [[ "$prev" == -*f* ]] && xspec= - elif [ "$prev" = '>' ]; then - xspec= - elif [ "$prev" = '<' ]; then - xspec= - fi - - _expand || return 0 - - COMPREPLY=( $( compgen -f -X "$xspec" -- $cur ) \ - $( compgen -d -- $cur ) ) -} && -complete -F _gzip $filenames gzip - -# bzip2(1) completion -# -have bzip2 && -_bzip2() -{ - local cur prev xspec - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-c -d -f -h -k -L -q -s \ - -t -v -V -z -1 -2 -3 -4 -5 -6 -7 -8 -9 \ - --help --decompress --compress --keep --force \ - --test --stdout --quiet --verbose --license \ - --version --small --fast --best' -- $cur ) ) - return 0 - fi - - local IFS=$'\t\n' - - xspec="*.bz2" - if [[ "$prev" == --* ]]; then - [[ "$prev" == --decompress || \ - "$prev" == --list || \ - "$prev" == --test ]] && xspec="!"$xspec - [[ "$prev" == --compress ]] && xspec= - elif [[ "$prev" == -* ]]; then - [[ "$prev" == -*[dt]* ]] && xspec="!"$xspec - [[ "$prev" == -*z* ]] && xspec= - fi - - _expand || return 0 - - COMPREPLY=( $( compgen -f -X "$xspec" -- $cur ) \ - $( compgen -d -- $cur ) ) -} && -complete -F _bzip2 $filenames bzip2 - -# openssl(1) completion -# -have openssl && { -_openssl_sections() -{ - local config - - config=/etc/ssl/openssl.cnf - [ ! -f $config ] && config=/usr/share/ssl/openssl.cnf - for (( i=2; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" == -config ]]; then - config=${COMP_WORDS[i+1]} - break - fi - done - [ ! -f $config ] && return 0 - - COMPREPLY=( $( awk '/\[.*\]/ {print $2} ' $config | grep "^$cur" ) ) -} - -_openssl() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - - if [ $COMP_CWORD -eq 1 ]; then - COMPREPLY=( $( compgen -W 'asn1parse ca ciphers crl crl2pkcs7 \ - dgst dh dhparam dsa dsaparam enc errstr gendh gendsa \ - genrsa nseq passwd pkcs12 pkcs7 pkcs8 rand req rsa \ - rsautl s_client s_server s_time sess_id smime speed \ - spkac verify version x509 md2 md4 md5 mdc2 rmd160 sha \ - sha1 base64 bf bf-cbc bf-cfb bf-ecb bf-ofb cast \ - cast-cbc cast5-cbc cast5-cfb cast5-ecb cast5-ofb des \ - des-cbc des-cfb des-ecb des-ede des-ede-cbc \ - des-ede-cfb des-ede-ofb des-ede3 des-ede3-cbc \ - des-ede3-cfb des-ede3-ofb des-ofb des3 desx rc2 \ - rc2-40-cbc rc2-64-cbc rc2-cbc rc2-cfb rc2-ecb rc2-ofb \ - rc4 rc4-40' -- $cur ) ) - else - prev=${COMP_WORDS[COMP_CWORD-1]} - case ${COMP_WORDS[1]} in - asn1parse) - case $prev in - -inform) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - -@(in|out|oid)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -in -out -noout -offset \ - -length -i -oid -strparse' -- $cur ) ) - fi - ;; - ca) - case $prev in - -@(config|revoke|cert|in|out|spkac|ss_cert)) - _filedir - return 0 - ;; - -outdir) - _filedir -d - return 0 - ;; - -@(name|crlexts|extensions)) - _openssl_sections - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-verbose -config -name \ - -gencrl -revoke -crldays -crlhours -crlexts \ - -startdate -enddate -days -md -policy -keyfile \ - -key -passin -cert -in -out -notext -outdir \ - -infiles -spkac -ss_cert -preserveDN -batch \ - -msie_hack -extensions' -- $cur ) ) - fi - ;; - ciphers) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-v -ssl2 -ssl3 -tls1' -- $cur ) ) - fi - ;; - crl) - case $prev in - -@(in|out)form) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - -@(in|out|CAfile)) - _filedir - return 0 - ;; - -CAPath) - _filedir -d - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform -text -in -out -noout \ - -hash -issuer -lastupdate -nextupdate -CAfile -CApath' -- $cur ) ) - fi - ;; - crl2pkcs7) - case $prev in - -@(in|out)form) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - -@(in|out)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform -in -out -print_certs' -- $cur ) ) - fi - ;; - dgst) - case $prev in - -@(out|sign|verify|prvrify|signature)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-md5 -md4 -md2 -sha1 -sha -mdc2 -ripemd160 -dss1 \ - -c -d -hex -binary -out -sign -verify -prverify -signature' -- $cur ) ) - else - _filedir - fi - ;; - dsa) - case $prev in - -@(in|out)form) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - -@(in|out)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform -in -passin -out -passout -des -des3 -idea -text -noout \ - -modulus -pubin -pubout' -- $cur ) ) - fi - ;; - dsaparam) - case $prev in - -@(in|out)form) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - -@(in|out|rand)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform -in -out -noout \ - -text -C -rand -genkey' -- $cur ) ) - fi - ;; - enc) - case $prev in - -@(in|out|kfile)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-ciphername -in -out -pass \ - -e -d -a -A -k -kfile -S -K -iv -p -P -bufsize -debug' -- $cur ) ) - fi - ;; - dhparam) - case $prev in - -@(in|out)form) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - -@(in|out|rand)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform -in -out -dsaparam -noout \ - -text -C -2 -5 -rand' -- $cur ) ) - fi - ;; - gendsa) - case $prev in - -@(out|rand)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-out -des -des3 -idea -rand' -- $cur ) ) - else - _filedir - fi - ;; - genrsa) - case $prev in - -@(out|rand)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-out -passout -des -des3 -idea -f4 -3 -rand' -- $cur ) ) - fi - ;; - pkcs7) - case $prev in - -@(in|out)form) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - -@(in|out)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform -in -out -print_certs -text -noout' -- $cur ) ) - fi - ;; - rand) - case $prev in - -@(out|rand)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-out -rand -base64' -- $cur ) ) - fi - ;; - req) - case "$prev" in - -@(in|out|key)form) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - - -@(in|out|rand|key|keyout|config)) - _filedir - return 0 - ;; - -extensions) - _openssl_sections - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform -in \ - -passin -out -passout -text -noout -verify \ - -modulus -new -rand -newkey -newkey -nodes \ - -key -keyform -keyout -md5 -sha1 -md2 -mdc2 \ - -config -x509 -days -asn1-kludge -newhdr \ - -extensions -reqexts section' -- $cur ) ) - fi - ;; - rsa) - case $prev in - -@(in|out)form) - COMPREPLY=( $( compgen -W 'DER NET PEM' -- $cur ) ) - return 0 - ;; - -@(in|out)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform -in -passin -out -passout \ - -sgckey -des -des3 -idea -text -noout -modulus -check -pubin \ - -pubout -engine' -- $cur ) ) - fi - ;; - rsautl) - case $prev in - -@(in|out|inkey)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-in -out -inkey -pubin -certin -sign -verify \ - -encrypt -decrypt -pkcs -ssl -raw -hexdump -asn1parse' -- $cur ) ) - fi - ;; - s_client) - case $prev in - -connect) - _known_hosts - return 0 - ;; - -@(cert|key|CAfile|rand)) - _filedir - return 0 - ;; - -CApath) - _filedir -d - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-connect -verify -cert -key -CApath -CAfile \ - -reconnect -pause -showcerts -debug -msg -nbio_test -state -nbio \ - -crlf -ign_eof -quiet -ssl2 -ssl3 -tls1 -no_ssl2 -no_ssl3 -no_tls1 \ - -bugs -cipher -starttls -engine -rand' -- $cur ) ) - fi - ;; - s_server) - case $prev in - -@(cert|key|dcert|dkey|dhparam|CAfile|rand)) - _filedir - return 0 - ;; - -CApath) - _filedir -d - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-accept -context -verify -Verify -cert -key \ - -dcert -dkey -dhparam -nbio -nbio_test -crlf -debug -msg -state -CApath \ - -CAfile -nocert -cipher -quiet -no_tmp_rsa -ssl2 -ssl3 -tls1 -no_ssl2 \ - -no_ssl3 -no_tls1 -no_dhe -bugs -hack -www -WWW -HTTP -engine -id_prefix \ - -rand' -- $cur ) ) - fi - ;; - s_time) - case $prev in - -connect) - _known_hosts - return 0 - ;; - -@(cert|key|CAfile)) - _filedir - return 0 - ;; - -CApath) - _filedir -d - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-connect -www -cert -key -CApath -CAfile -reuse \ - -new -verify -nbio -time -ssl2 -ssl3 -bugs -cipher' -- $cur ) ) - fi - ;; - - sess_id) - case $prev in - -@(in|out)form) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - -@(in|out)) - _filedir - return 0 - ;; - esac - - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform -in -out -text -noout \ - -context ID' -- $cur ) ) - fi - ;; - smime) - case $prev in - -@(in|out)form) - COMPREPLY=( $( compgen -W 'SMIME DER PEM' -- $cur ) ) - return 0 - ;; - -@(in|out|certfile|signer|recip|inkey|content|rand)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-encrypt -decrypt -sign -verify -pk7out -des -des3 \ - -rc2-40 -rc2-64 -rc2-128 -aes128 -aes192 -aes256 -in -certfile -signer \ - -recip -inform -passin -inkey -out -outform -content -to -from -subject \ - -text -rand' -- $cur ) ) - else - _filedir - fi - ;; - speed) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-engine' -- $cur ) ) - else - COMPREPLY=( $( compgen -W 'md2 mdc2 md5 hmac sha1 rmd160 idea-cbc \ - rc2-cbc rc5-cbc bf-cbc des-cbc des-ede3 rc4 rsa512 rsa1024 rsa2048 \ - rsa4096 dsa512 dsa1024 dsa2048 idea rc2 des rsa blowfish' -- $cur ) ) - fi - ;; - verify) - case $prev in - -@(CAfile|untrusted)) - _filedir - return 0 - ;; - -CApath) - _filedir -d - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-CApath -CAfile -purpose -untrusted -help -issuer_checks \ - -verbose -certificates' -- $cur ) ) - else - _filedir - fi - ;; - x509) - case "$prev" in - -@(in|out|CA|CAkey|CAserial|extfile)) - _filedir - return 0 - ;; - -@(in|out)form) - COMPREPLY=( $( compgen -W 'DER PEM NET' -- $cur ) ) - return 0 - ;; - -@(key|CA|CAkey)form) - COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) ) - return 0 - ;; - -extensions) - _openssl_sections - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-inform -outform \ - -keyform -CAform -CAkeyform -in -out \ - -serial -hash -subject -issuer -nameopt \ - -email -startdate -enddate -purpose \ - -dates -modulus -fingerprint -alias \ - -noout -trustout -clrtrust -clrreject \ - -addtrust -addreject -setalias -days \ - -set_serial -signkey -x509toreq -req \ - -CA -CAkey -CAcreateserial -CAserial \ - -text -C -md2 -md5 -sha1 -mdc2 -clrext \ - -extfile -extensions -engine' -- $cur ) ) - fi - ;; - @(md5|md4|md2|sha1|sha|mdc2|ripemd160)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-c -d' -- $cur ) ) - else - _filedir - fi - ;; - esac - fi - - return 0 -} -complete -F _openssl $default openssl -} - -# screen(1) completion -# -have screen && -_screen() -{ - local cur prev preprev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - [ "$COMP_CWORD" -ge 2 ] && preprev=${COMP_WORDS[COMP_CWORD-2]} - - if [ "$preprev" = "-d" -o "$preprev" = "-D" -a "$prev" = "-r" -o \ - "$prev" = "-R" ]; then - # list all - COMPREPLY=( $( command screen -ls | \ - sed -ne 's|^['$'\t'']\+\('$cur'[0-9]\+\.[^'$'\t'']\+\).*$|\1|p' ) ) - else - case "$prev" in - -[rR]) - # list detached - COMPREPLY=( $( command screen -ls | \ - sed -ne 's|^['$'\t'']\+\('$cur'[0-9]\+\.[^'$'\t'']\+\).*Detached.*$|\1|p' ) ) - ;; - -[dDx]) - # list attached - COMPREPLY=( $( command screen -ls | \ - sed -ne 's|^['$'\t'']\+\('$cur'[0-9]\+\.[^'$'\t'']\+\).*Attached.*$|\1|p' ) ) - ;; - -s) - # shells - COMPREPLY=( $( grep ^${cur:-[^#]} /etc/shells ) ) - ;; - *) - ;; - esac - fi - - return 0 -} && -complete -F _screen $default screen - -# lftp(1) bookmark completion -# -have lftp && -_lftp() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [ $COMP_CWORD -eq 1 ] && [ -f ~/.lftp/bookmarks ]; then - COMPREPLY=( $( compgen -W '$( sed -ne "s/^\(.*\)'$'\t''.*$/\1/p" \ - ~/.lftp/bookmarks )' -- $cur ) ) - fi - - return 0 -} && -complete -F _lftp $default lftp - -# ncftp(1) bookmark completion -# -have ncftp && -_ncftp() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [ $COMP_CWORD -eq 1 ] && [ -f ~/.ncftp/bookmarks ]; then - COMPREPLY=( $( compgen -W '$( sed -ne "s/^\([^,]\{1,\}\),.*$/\1/p" \ - ~/.ncftp/bookmarks )' -- $cur ) ) - fi - - return 0 -} && -complete -F _ncftp $default ncftp - -# gdb(1) completion -# -have gdb && -_gdb() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [ $COMP_CWORD -eq 1 ]; then - local IFS - if [[ "$cur" == */* ]]; then - # compgen -c works as expected if $cur contains any slashes. - IFS=$'\n' - COMPREPLY=( $( PATH="$PATH:." compgen -d -c -- "$cur" ) ) - else - # otherwise compgen -c contains Bash's built-in commands, - # functions and aliases. Thus we need to retrieve the program - # names manually. - IFS=":" - local path_array=( $(echo "$PATH" | sed 's/::\+/:/g;s/^:\|:$//g') ) - IFS=$'\n' - COMPREPLY=( $( compgen -d -W '$(find "${path_array[@]}" . \ - -mindepth 1 -maxdepth 1 -not -type d -executable -printf "%f\\n" 2>/dev/null)' \ - -- "$cur" ) ) - fi - elif [ $COMP_CWORD -eq 2 ]; then - prev=${prev##*/} - COMPREPLY=( $( compgen -fW "$( command ps axo comm,pid | \ - awk '{if ($1 ~ /^'"$prev"'/) print $2}' ) )" \ - -- "$cur" ) ) - fi -} && -complete -F _gdb $default gdb + local cur func cline cspec noglob cmd i char_offset word_offset \ + _COMMAND_FUNC _COMMAND_FUNC_ARGS + + word_offset=$1 + + # rewrite current completion context before invoking + # actual command completion + + # find new first word position, then + # rewrite COMP_LINE and adjust COMP_POINT + local first_word=${COMP_WORDS[$word_offset]} + for (( i=0; i <= ${#COMP_LINE}; i++ )); do + if [[ "${COMP_LINE:$i:${#first_word}}" == "$first_word" ]]; then + char_offset=$i + break + fi + done + COMP_LINE=${COMP_LINE:$char_offset} + COMP_POINT=$(( COMP_POINT - $char_offset )) + + # shift COMP_WORDS elements and adjust COMP_CWORD + for (( i=0; i <= COMP_CWORD - $word_offset; i++ )); do + COMP_WORDS[i]=${COMP_WORDS[i+$word_offset]} + done + for (( i; i <= COMP_CWORD; i++ )); do + unset COMP_WORDS[i]; + done + COMP_CWORD=$(( $COMP_CWORD - $word_offset )) -# Postgresql completion -# -have psql && { -_pg_databases() -{ - return - COMPREPLY=( $( psql -l 2>/dev/null | \ - sed -e '1,/^-/d' -e '/^(/,$d' | \ - awk '{print $1}' | grep "^$cur" ) ) -} - -_pg_users() -{ - #COMPREPLY=( $( psql -qtc 'select usename from pg_user' template1 2>/dev/null | \ - # grep "^ $cur" ) ) - #[ ${#COMPREPLY[@]} -eq 0 ] && COMPREPLY=( $( compgen -u -- $cur ) ) - COMPREPLY=( $( compgen -u -- $cur ) ) -} + COMPREPLY=() + cur=`_get_cword` -# createdb(1) completion -# -_createdb() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(h|-host=)) - _known_hosts - return 0 - ;; - -@(U|-username=)) - _pg_users - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-D -T -E -h -p -U -W -e -q \ - --location= --template= --encoding= --host= --port= \ - --username= --password --echo --quiet --help' -- $cur )) - else - _pg_databases - fi -} -complete -F _createdb $default createdb + if [[ $COMP_CWORD -eq 0 ]]; then + COMPREPLY=( $( compgen -c -- "$cur" ) ) + else + cmd=${COMP_WORDS[0]} + if complete -p $cmd &>/dev/null; then + cspec=$( complete -p $cmd ) + if [ "${cspec#* -F }" != "$cspec" ]; then + # complete -F <function> + + # get function name + func=${cspec#*-F } + func=${func%% *} + + if [[ ${#COMP_WORDS[@]} -ge 2 ]]; then + $func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" "${COMP_WORDS[${#COMP_WORDS[@]}-2]}" + else + $func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" + fi + + # remove any \: generated by a command that doesn't + # default to filenames or dirnames (e.g. sudo chown) + # FIXME: I'm pretty sure this does not work! + if [ "${cspec#*-o }" != "$cspec" ]; then + cspec=${cspec#*-o } + cspec=${cspec%% *} + if [[ "$cspec" != @(dir|file)names ]]; then + COMPREPLY=("${COMPREPLY[@]//\\\\:/:}") + fi + fi + elif [ -n "$cspec" ]; then + cspec=${cspec#complete}; + cspec=${cspec%%$cmd}; + COMPREPLY=( $( eval compgen "$cspec" -- "$cur" ) ); + fi + fi + fi -# dropdb(1) completion -# -_dropdb() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(h|-host=)) - _known_hosts - return 0 - ;; - -@(U|-username=)) - _pg_users - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-h -p -U -W -e -q \ - --host= --port= --username= --password \ - --interactive --echo --quiet --help' -- $cur ) ) - else - _pg_databases - fi + [ ${#COMPREPLY[@]} -eq 0 ] && _filedir } -complete -F _dropdb $default dropdb +complete -F _command $filenames nohup exec nice eval time ltrace then \ + else do vsound command xargs tsocks -# psql(1) completion -# -_psql() +_root_command() { - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -h|--host) - _known_hosts - return 0 - ;; - -U|--username) - _pg_users - return 0 - ;; - -d|--dbname) - _pg_databases - return 0 - ;; - -@(o|f)|--output|--file) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - # return list of available options - COMPREPLY=( $( compgen -W '-a --echo-all -A --no-align \ - -c --command -d --dbname -e --echo-queries \ - -E --echo-hidden -f --file -F --filed-separator \ - -h --host -H --html -l --list -n -o --output \ - -p --port -P --pset -q -R --record-separator \ - -s --single-step -S --single-line -t --tuples-only \ - -T --table-attr -U --username -v --variable \ - -V --version -W --password -x --expanded -X --nopsqlrc \ - -? --help ' -- $cur ) ) - else - # return list of available databases - _pg_databases - fi -} -complete -F _psql $default psql + PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin _command $1 $2 $3 } +complete -F _root_command $filenames sudo fakeroot really gksudo gksu kdesudo _longopt() { - local cur opt - - cur=`_get_cword` - - if [[ "$cur" == --*=* ]]; then - opt=${cur%%=*} - # cut backslash that gets inserted before '=' sign - opt=${opt%\\*} - cur=${cur#*=} - _filedir - # FIXME: see #297065... adding "-o nospace" (or $nospace), - # should do the trick, but seems not working... ideas? - COMPREPLY=( $( compgen -P "$opt=" -W '${COMPREPLY[@]}' -- $cur)) - return 0 - fi - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( $1 --help 2>&1 | sed -e '/--/!d' \ - -e 's/.*\(--[-A-Za-z0-9]\+=\?\).*/\1/' | \ - command grep "^$cur" | sort -u ) ) - elif [[ "$1" == rmdir ]]; then - _filedir -d - else - _filedir - fi -} -# makeinfo and texi2dvi are defined elsewhere. -for i in a2ps autoconf automake bc gprof ld nm objcopy objdump readelf strip \ - bison diff patch enscript cp df dir du ln ls mkfifo mknod mv rm \ - touch vdir awk gperf grep grub indent less m4 sed shar date \ - tee who texindex cat csplit cut expand fmt fold head \ - md5sum nl od paste pr ptx sha1sum sort split tac tail tr unexpand \ - uniq wc ldd bash id irb mkdir rmdir; do - have $i && complete -F _longopt $filenames $i -done - -# These commands use filenames, so '-o filenames' is not needed. -for i in env netstat seq uname units wget; do - have $i && complete -F _longopt $default $i -done -unset i - -# gcc(1) completion -# -# The only unusual feature is that we don't parse "gcc --help -v" output -# directly, because that would include the options of all the other backend -# tools (linker, assembler, preprocessor, etc) without any indication that -# you cannot feed such options to the gcc driver directly. (For example, the -# linker takes a -z option, but you must type -Wl,-z for gcc.) Instead, we -# ask the driver ("g++") for the name of the compiler ("cc1"), and parse the -# --help output of the compiler. -# -have gcc && -_gcc() -{ - local cur cc backend - - COMPREPLY=() - cur=`_get_cword` - - _expand || return 0 - - case "$1" in - gcj) - backend=jc1 - ;; - gpc) - backend=gpc1 - ;; - *77) - backend=f771 - ;; - *) - backend=cc1 # (near-)universal backend - ;; - esac - - if [[ "$cur" == -* ]]; then - cc=$( $1 -print-prog-name=$backend ) - # sink stderr: - # for C/C++/ObjectiveC it's useless - # for FORTRAN/Java it's an error - COMPREPLY=( $( $cc --help 2>/dev/null | tr '\t' ' ' | \ - sed -e '/^ *-/!d' -e 's/ *-\([^ ]*\).*/-\1/' | \ - command grep "^$cur" | sort -u ) ) - else - _filedir - fi -} && -complete $filenames -F _gcc gcc g++ c++ g77 gcj gpc -[ $UNAME = GNU -o $UNAME = Linux -o $UNAME = Cygwin ] && \ -[ -n "${have:-}" ] && complete $filenames -F _gcc cc - -# Linux cardctl(8) completion -# -have cardctl && -_cardctl() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [ $COMP_CWORD -eq 1 ]; then - COMPREPLY=( $( compgen -W 'status config ident suspend \ - resume reset eject insert scheme' \ - -- $cur ) ) - fi -} && -complete -F _cardctl cardctl - -# This function is required by _dpkg() and _dpkg-reconfigure() -# -# TODO: Ubuntu (and Debian) folks removed the "have grep-status" part. In my Debian I got it, -# and I believe it's ok if we leave it like it is now. Was that removed because -# of Ubuntu's (and Debian's? :() inner weirdness? :) -- David (hanska-guest) -have dpkg && { -#have grep-status && { -#_comp_dpkg_installed_packages() -#{ -# grep-status -P -e "^$1" -a -FStatus 'install ok installed' -n -s Package -#} -#} || { -_comp_dpkg_installed_packages() -{ - grep -A 1 "Package: $1" /var/lib/dpkg/status | \ - grep -B 1 -Ee "ok installed|half-installed|unpacked| \ - half-configured|config-files" \ - -Ee "^Essential: yes" | \ - grep "Package: $1" | cut -d\ -f2 -} -#} - -# Debian dpkg(8) completion -# -_dpkg() -{ - local cur prev i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - i=$COMP_CWORD - - _expand || return 0 - - # find the last option flag - if [[ $cur != -* ]]; then - while [[ $prev != -* && $i != 1 ]]; do - i=$((i-1)) - prev=${COMP_WORDS[i-1]} - done - fi - - case "$prev" in - -@(c|i|A|I|f|e|x|X|-@(install|unpack|record-avail|contents|info|fsys-tarfile|field|control|extract))) - _filedir '?(u)deb' - return 0 - ;; - -@(b|-build)) - _filedir -d - return 0 - ;; - -@(s|p|l|-@(status|print-avail|list))) - COMPREPLY=( $( apt-cache pkgnames $cur 2>/dev/null ) ) - return 0 - ;; - -@(S|-search)) - _filedir - return 0 - ;; - -@(r|L|P|-@(remove|purge|listfiles))) - COMPREPLY=( $( _comp_dpkg_installed_packages $cur ) ) - return 0 - ;; - *) - - COMPREPLY=( $( compgen -W '-i --install --unpack -A --record-avail \ - --configure -r --remove -P --purge --get-selections \ - --set-selections --update-avail --merge-avail \ - --clear-avail --command-fd --forget-old-unavail -s \ - --status -p --print-avail -L --listfiles -l --list \ - -S --search -C --audit --print-architecture \ - --print-gnu-build-architecture \ - --print-installation-architecture \ - --compare-versions --help --version --force-help \ - --force-all --force-auto-select --force-downgrade \ - --force-configure-any --force-hold --force-bad-path \ - --force-not-root --force-overwrite \ - --force-overwrite-diverted --force-bad-verify \ - --force-depends-version --force-depends \ - --force-confnew --force-confold --force-confdef \ - --force-confmiss --force-conflicts --force-architecture\ - --force-overwrite-dir --force-remove-reinstreq \ - --force-remove-essential -Dh \ - --debug=help --licence --admindir= --root= --instdir= \ - -O --selected-only -E --skip-same-version \ - -G --refuse-downgrade -B --auto-deconfigure \ - --no-debsig --no-act -D --debug= --status-fd \ - -b --build -I --info -f --field -c --contents \ - -x --extract -X --vextract --fsys-tarfile -e --control \ - --ignore-depends= --abort-after' -- $cur ) ) - ;; - esac - - -} -complete -F _dpkg $filenames dpkg dpkg-deb -} - -# Debian GNU dpkg-reconfigure(8) completion -# -have dpkg-reconfigure && -_dpkg_reconfigure() -{ - local cur prev opt - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - - case "$prev" in - -@(f|-frontend)) - opt=( $( echo /usr/share/perl5/Debconf/FrontEnd/* ) ) - opt=( ${opt[@]##*/} ) - opt=( ${opt[@]%.pm} ) - COMPREPLY=( $( compgen -W '${opt[@]}' -- $cur ) ) - return 0 - ;; - -@(p|-priority)) - COMPREPLY=( $( compgen -W 'low medium high critical' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-f --frontend -p --priority -a --all \ - -u --unseen-only -h --help -s --showold \ - --force --terse' -- $cur ) ) - else - COMPREPLY=( $( _comp_dpkg_installed_packages $cur ) ) - fi -} && -complete -F _dpkg_reconfigure $default dpkg-reconfigure - -# Debian dpkg-source completion -# -have dpkg-source && -_dpkg_source() -{ - local cur prev options work i action packopts unpackopts - - packopts="-c -l -F -V -T -D -U -W -E -sa -i -I -sk -sp -su -sr -ss -sn -sA -sK -sP -sU -sR" - unpackopts="-sp -sn -su" - options=`echo "-x -b $packopts $unpackopts" | xargs echo | sort -u | xargs echo` - - COMPREPLY=() - if [ "$1" != "dpkg-source" ]; then - return 1 - fi - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - action="options" - for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do - if [[ ${COMP_WORDS[$i]} == "-x" ]]; then - action=unpack - elif [[ ${COMP_WORDS[$i]} == "-b" ]]; then - action=pack - elif [[ ${COMP_WORDS[$i]} == "-h" ]]; then - action=help - fi - done - # if currently seeing a complete option, return just itself. - for i in $options; do - if [ "$cur" = "$i" ]; then - COMPREPLY=( "$cur" ) - return 0 - fi - done - case "$action" in - "unpack") - if [ "$cur" = "-" -o "$cur" = "-s" ]; then - COMPREPLY=( $unpackopts ) - return 0 - fi - case "$prev" in - "-x") - COMPREPLY=( $( compgen -d -- "$cur" ) \ - $( compgen -f -X '!*.dsc' -- "$cur" ) ) - return 0 - ;; - *) - COMPREPLY=( $unpackopts $(compgen -d -f -- "$cur" ) ) - return 0 - ;; - esac - return 0 - ;; - "pack") - if [ "$cur" = "-" ]; then - COMPREPLY=( $packopts ) - return 0 - fi - if [ "$cur" = "-s" ]; then - COMPREPLY=( "-sa" "-sk" "-sp" "-su" "-sr" "-ss" "-sn" \ - "-sA" "-sK" "-sP" "-sU" "-sR" ) - return 0 - fi - case "$prev" in - "-b") - COMPREPLY=( $( compgen -d -- "$cur" ) ) - return 0 - ;; - "-c"|"-l"|"-T"|"-i"|"-I") - # -c: get controlfile - # -l: get per-version info from this file - # -T: read variables here, not debian/substvars - # -i: <regexp> filter out files to ignore diffs of. - # -I: filter out files when building tarballs. - # return directory names and file names - COMPREPLY=( $( compgen -d -f ) ) - return 0 - ;; - "-F") - # -F: force change log format - COMPREPLY=( $( ( cd /usr/lib/dpkg/parsechangelog; compgen -f "$cur" ) ) ) - return 0 - ;; - "-V"|"-D") - # -V: set a substitution variable - # we don't know anything about possible variables or values - # so we don't try to suggest any completion. - COMPREPLY=() - return 0 - ;; - "-D") - # -D: override or add a .dsc field and value - # if $cur doesn't contain a = yet, suggest variable names - if echo -- "$cur" | grep -q "="; then - # $cur contains a "=" - COMPREPLY=() - return 0 - else - COMPREPLY=( Format Source Version Binary Maintainer Uploader Architecture Standards-Version Build-Depends Files ) - return 0 - fi - ;; - "-U") - # -U: remove a field - # Suggest possible fieldnames - COMPREPLY=( Format Source Version Binary Maintainer Uploader Architecture Standards-Version Build-Depends Files ) - return 0 - ;; - *) - COMPREPLY=( $packopts ) - return 0 - ;; - esac - return 0 - ;; - *) - # if seeing a partial option, return possible completions. - if [ "$cur" = "-s" ]; then - COMPREPLY=( "-sa" "-sk" "-sp" "-su" "-sr" "-ss" "-sn" \ - "-sA" "-sK" "-sP" "-sU" "-sR" ) - return 0 - fi - # else return all possible options. - COMPREPLY=( $options ) - return 0 - ;; - esac -} && -complete -F _dpkg_source dpkg-source - -# Debian Linux dselect(8) completion. -# -have dselect && -_dselect() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - --admindir) - _filedir -d - return 0 - ;; - - -@(D|debug)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--admindir --help --version --licence \ - --license --expert --debug' -- $cur ) ) - else - COMPREPLY=( $( compgen -W 'access update select install config \ - remove quit' -- $cur ) ) - fi - - - return 0 -} && -complete -F _dselect $filenames dselect - -# Java completion -# - -# available path elements completion -have java && { -_java_path() -{ - cur=${cur##*:} - _filedir '@(jar|zip)' -} - -# exact classpath determination -_java_find_classpath() -{ - local i - - # search first in current options - for (( i=1; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" == -@(cp|classpath) ]]; then - classpath=${COMP_WORDS[i+1]} - break - fi - done - - # default to environment - [ -z "$classpath" ] && classpath=$CLASSPATH - - # default to current directory - [ -z "$classpath" ] && classpath=. -} - -# exact sourcepath determination -_java_find_sourcepath() -{ - local i - - # search first in current options - for (( i=1; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" == -sourcepath ]]; then - sourcepath=${COMP_WORDS[i+1]} - break - fi - done - - # default to classpath - if [ -z "$sourcepath" ]; then - _java_find_classpath - sourcepath=$classpath - fi -} - -# available classes completion -_java_classes() -{ - local classpath i - - # find which classpath to use - _java_find_classpath - - # convert package syntax to path syntax - cur=${cur//.//} - # parse each classpath element for classes - for i in ${classpath//:/ }; do - if [ -r $i ] && [[ "$i" == *.@(jar|zip) ]]; then - if type zipinfo &> /dev/null; then - COMPREPLY=( "${COMPREPLY[@]}" $( zipinfo -1 \ - "$i" | grep "^$cur" | grep '\.class$' | \ - grep -v "\\$" ) ) - else - COMPREPLY=( "${COMPREPLY[@]}" $( jar tf "$i" \ - "$cur" | grep "\.class$" | grep -v "\\$" ) ) - fi - - elif [ -d $i ]; then - i=${i%/} - - # See bug #496828 - COMPREPLY=( "${COMPREPLY[@]}" $( find "$i" -type f \ - -maxdepth 1 -path "$i/$cur*.class" 2>/dev/null | \ - grep -v "\\$" | sed -e "s|^$i/||" ) ) - - # FIXME: if we have foo.class and foo/, the completion - # returns "foo/"... how to give precedence to files - # over directories? - fi - done - - # remove class extension - COMPREPLY=( ${COMPREPLY[@]%.class} ) - # convert path syntax to package syntax - COMPREPLY=( ${COMPREPLY[@]//\//.} ) -} - -# available packages completion -_java_packages() -{ - local sourcepath i - - # find which sourcepath to use - _java_find_sourcepath - - # convert package syntax to path syntax - cur=${cur//.//} - # parse each sourcepath element for packages - for i in ${sourcepath//:/ }; do - if [ -d $i ]; then - COMPREPLY=( "${COMPREPLY[@]}" $( command ls -F -d \ - $i/$cur* 2>/dev/null | sed -e 's|^'$i'/||' ) ) - fi - done - # keep only packages - COMPREPLY=( $( echo "${COMPREPLY[@]}" | tr " " "\n" | grep "/$" ) ) - # remove packages extension - COMPREPLY=( ${COMPREPLY[@]%/} ) - # convert path syntax to package syntax - cur=${COMPREPLY[@]//\//.} -} - -# java completion -# -_java() -{ - local cur prev i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - for ((i=1; i < $COMP_CWORD; i++)); do - case ${COMP_WORDS[$i]} in - -cp|-classpath) - ((i++)) # skip the classpath string. - ;; - -*) - # this is an option, not a class/jarfile name. - ;; - *) - # once we've seen a class, just do filename completion - _filedir - return 0 - ;; - esac - done - - case $prev in - -@(cp|classpath)) - _java_path - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - # relevant options completion - COMPREPLY=( $( compgen -W '-client -hotspot -server -classic \ - -cp -classpath -D -verbose -verbose:class \ - -verbose:gc -version:jni -version \ - -showversion -? -help -X -jar \ - -ea -enableassertions -da -disableassertions \ - -esa -enablesystemassertions \ - -dsa -disablesystemassertions ' -- $cur ) ) - else - if [[ "$prev" == -jar ]]; then - # jar file completion - _filedir jar - else - # classes completion - _java_classes - fi - fi -} -complete -F _java $filenames java -} - -# javadoc completion -# -have javadoc && -_javadoc() -{ - COMPREPLY=() - local cur prev - - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case $prev in - -@(overview|helpfile|stylesheetfile)) - _filedir - return 0 - ;; - -d) - _filedir -d - return 0 - ;; - -@(classpath|bootclasspath|docletpath|sourcepath|extdirs)) - _java_path - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - # relevant options completion - COMPREPLY=( $( compgen -W '-overview -public -protected \ - -package -private -help -doclet -docletpath \ - -sourcepath -classpath -exclude -subpackages \ - -breakiterator -bootclasspath -source -extdirs \ - -verbose -locale -encoding -J -d -use -version \ - -author -docfilessubdirs -splitindex \ - -windowtitle -doctitle -header -footer -bottom \ - -link -linkoffline -excludedocfilessubdir \ - -group -nocomment -nodeprecated -noqualifier \ - -nosince -nodeprecatedlist -notree -noindex \ - -nohelp -nonavbar -quiet -serialwarn -tag \ - -taglet -tagletpath -charset -helpfile \ - -linksource -stylesheetfile -docencoding' -- \ - $cur ) ) - else - # source files completion - _filedir java - # packages completion - _java_packages - fi -} && -complete -F _javadoc $filenames javadoc - -# javac completion -# -have javac && -_javac() -{ - COMPREPLY=() - local cur prev - - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case $prev in - -d) - _filedir -d - return 0 - ;; - -@(classpath|bootclasspath|sourcepath|extdirs)) - _java_path - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - # relevant options completion - COMPREPLY=( $( compgen -W '-g -g:none -g:lines -g:vars\ - -g:source -O -nowarn -verbose -deprecation -classpath\ - -sourcepath -bootclasspath -extdirs -d -encoding -source\ - -target -help' -- $cur ) ) - else - # source files completion - _filedir java - fi -} && -complete -F _javac $filenames javac - -# PINE address-book completion -# -have pine && -_pineaddr() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - COMPREPLY=( $( compgen -W '$( awk "{print \$1}" ~/.addressbook 2>/dev/null)' \ - -- $cur ) ) -} && -complete -F _pineaddr $default pine - -# mutt completion -# -# Mutt doesn't have an "addressbook" like Pine, but it has aliases and -# a "query" function to retrieve addresses, so that's what we use here. -have mutt || have muttng && { -_muttaddr() -{ - _muttaliases - _muttquery - - cur=`_get_cword` - COMPREPLY=( "${COMPREPLY[@]}" $( compgen -u -- $cur ) ) - - return 0 -} - -_muttconffiles() -{ - local file sofar - local -a newconffiles - - sofar=" $1 " - shift - while [[ "$1" ]]; do - newconffiles=( $(sed -rn 's|^source[[:space:]]+([^[:space:]]+).*$|\1|p' $(eval echo $1) ) ) - for file in "${newconffiles[@]}"; do - [[ ! "$file" ]] || [[ "${sofar/ ${file} / }" != "$sofar" ]] && - continue - sofar="$sofar $file" - sofar=" $(eval _muttconffiles \"$sofar\" $file) " - done - shift - done - echo $sofar -} - -_muttaliases() -{ - local cur muttrc - local -a conffiles aliases - cur=`_get_cword =` - - [ -f ~/.${muttcmd}/${muttcmd}rc ] && muttrc="~/.${muttcmd}/${muttcmd}rc" - [ -f ~/.${muttcmd}rc ] && muttrc="~/.${muttcmd}rc" - [ -z "$muttrc" ] && return 0 - - conffiles=( $(eval _muttconffiles $muttrc $muttrc) ) - aliases=( $( sed -rn 's|^alias[[:space:]]+([^[:space:]]+).*$|\1|p' \ - $(eval echo "${conffiles[@]}") ) ) - COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "${aliases[*]}" -- $cur ) ) - - return 0 -} - -_muttquery() -{ - local cur querycmd - local -a queryresults - cur=`_get_cword` - - querycmd="$( $muttcmd -Q query_command | sed -r 's|^query_command=\"(.*)\"$|\1|; s|%s|'$cur'|' )" - if [ -z "$cur" -o -z "$querycmd" ]; then - queryresults=() - else - queryresults=( $( $querycmd | \ - sed -nr '2,$s|^([^[:space:]]+).*|\1|p' ) ) - fi - - COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "${queryresults[*]}" \ - -- $cur ) ) - - return 0 -} - -_muttfiledir() -{ - local cur folder spoolfile - cur=`_get_cword` - - # This is currently not working so well. Perhaps this function should - # just call _filedir() for the moment. - if [[ $cur == [=+]* ]]; then - folder="$( $muttcmd -Q folder | sed -r 's|^folder=\"(.*)\"$|\1|' )" - : folder:=~/Mail - - # Match any file in $folder beginning with $cur - # (minus the leading '=' sign). - COMPREPLY=( $( compgen -f -- "$folder/${cur:1}" ) ) - COMPREPLY=( ${COMPREPLY[@]#$folder/} ) - return 0 - elif [ "$cur" == !* ]; then - spoolfile="$( $muttcmd -Q spoolfile | sed -r 's|^spoolfile=\"(.*)\"$|\1|' )" - [ ! -z "$spoolfile" ] && eval cur="${cur/^!/$spoolfile}"; - fi - _filedir - - return 0 -} - -_mutt() -{ - local cur prev - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - COMPREPLY=() - - [ ${COMP_WORDS[0]} == muttng ] && muttcmd="muttng" || muttcmd="mutt" - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W '-A -a -b -c -e -f -F -H -i -m -n \ - -p -Q -R -s -v -x -y -z -Z -h' \ - -- $cur ) ) - return 0 - ;; - *) - case "$prev" in - -@(a|f|F|H|i)) - _muttfiledir - return 0 - ;; - -A) - _muttaliases - return 0 - ;; - -@(e|m|Q|s|h|p|R|v|y|z|Z)) - return 0 - ;; - *) - _muttaddr - return 0 - ;; - esac - ;; - esac - -} -complete -F _mutt $default $filenames mutt muttng -} + local cur prev -_configure_func() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - # if $COMP_CONFIGURE_HINTS is not null, then completions of the form - # --option=SETTING will include 'SETTING' as a contextual hint - [[ "$cur" != -* ]] && return 0 - - if [ -n "$COMP_CONFIGURE_HINTS" ]; then - COMPREPLY=( $( $1 --help 2>&1 | awk '/^ --[A-Za-z]/ { print $1; if ($2 ~ /--[A-Za-z]/) print $2 }' | sed -e 's/[[,].*//g' | grep ^$cur ) ) - else - COMPREPLY=( $( $1 --help 2>&1 | awk '/^ --[A-Za-z]/ { print $1; if ($2 ~ /--[A-Za-z]/) print $2 }' | sed -e 's/[[,=].*//g' | grep ^$cur ) ) - fi -} -complete -F _configure_func $default configure - -# Debian reportbug(1) completion -# -have reportbug && -_reportbug() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -f|--filename|-i|--include|--mta|-o|--output) - _filedir - return 0 - ;; - -B|--bts) - COMPREPLY=( $( compgen -W "debian guug kde mandrake help" -- \ - $cur )) - return 0 - ;; - -e|--editor|--mua) - COMP_WORDS=(COMP_WORDS[0] $cur) - COMP_CWORD=1 - _command - return 0 - ;; - --mode) - COMPREPLY=( $( compgen -W "novice standard expert" -- $cur ) ) - return 0 - ;; - -S|--severity) - COMPREPLY=( $( compgen -W "grave serious important normal \ - minor wishlist" -- $cur ) ) - return 0 - ;; - -u|--ui|--interface) - COMPREPLY=( $( compgen -W "newt text gnome" -- $cur ) ) - return 0 - ;; - -t|--type) - COMPREPLY=( $( compgen -W "gnats debbugs" -- $cur ) ) - return 0 - ;; - -T|--tags) - COMPREPLY=( $( compgen -W "none \ - woody potato sarge sarge-ignore etch etch-ignore \ - lenny lenny-ignore sid experimental confirmed \ - d-i fixed fixed-in-experimental fixed-upstream \ - help l10n moreinfo patch pending security \ - unreproducible upstream wontfix ipv6 lfs" -- $cur )) - return 0 - ;; - *) - ;; - esac - - COMPREPLY=($( compgen -W '-h --help -v --version -a --af -b \ - --no-query-bts --query-bts -B --bts -c --configure \ - --no-config-files --check-available -d --debug \ - --no-check-available -e --editor --email -f \ - --filename -g --gnupg -H --header -i --include -j \ - --justification -l --ldap --no-ldap -L --list-cc -m \ - --maintonly --mode --mua --mta --mutt -n --mh --nmh \ - -o --output -p --print -P --pgp --proxy --http_proxy\ - -q --quiet -Q --query-only --realname --report-quiet \ - --reply-to --replyto -s --subject -S --severity \ - --smtphost -t --type -T --tags --template -V -x \ - --no-cc --package-version -z --no-compress \ - --ui --interface -u \ - wnpp boot-floppies kernel bugs.debian.org \ - cdimage.debian.org general installation-reports \ - listarchives lists.debian.org mirrors nm.debian.org \ - press project qa.debian.org release-notes \ - security.debian.org tech-ctte upgrade-reports \ - www.debian.org' -- $cur ) \ - $( apt-cache pkgnames -- $cur 2> /dev/null) ) - _filedir - return 0 -} && -complete -F _reportbug $filenames reportbug - -# Debian querybts(1) completion -# -have querybts && -_querybts() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -B|--bts) - COMPREPLY=( $( compgen -W "debian guug kde mandrake help" -- \ - $cur )) - return 0 - ;; - -u|--ui|--interface) - COMPREPLY=($( compgen -W "newt text gnome" -- $cur )) - return 0 - ;; - *) - ;; - esac - - COMPREPLY=($( compgen -W '-h --help -v --version -A --archive \ - -B --bts -l --ldap --no-ldap --proxy= --http_proxy= \ - -s --source -w --web -u --ui --interface \ - wnpp boot-floppies kernel bugs.debian.org \ - cdimage.debian.org general installation-reports \ - listarchives lists.debian.org mirrors nm.debian.org \ - press project qa.debian.org release-notes \ - security.debian.org tech-ctte upgrade-reports \ - www.debian.org' -- $cur ) \ - $( apt-cache pkgnames -- $cur 2> /dev/null) ) -} && -complete -F _querybts $filenames querybts - -# update-alternatives completion -# -have update-alternatives && { -installed_alternatives() -{ - local admindir - # find the admin dir - for i in alternatives dpkg/alternatives rpm/alternatives; do - [ -d /var/lib/$i ] && admindir=/var/lib/$i && break - done - for (( i=1; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" == --admindir ]]; then - admindir=${COMP_WORDS[i+1]} - break - fi - done - COMPREPLY=( $( command ls $admindir | grep "^$cur" ) ) -} - -_update_alternatives() -{ - local cur prev mode args i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - --@(altdir|admindir)) - _filedir -d - return 0 - ;; - --@(help|version)) - return 0 - ;; - esac - - # find which mode to use and how many real args used so far - for (( i=1; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" == --@(install|remove|auto|display|config|remove-all) ]]; then - mode=${COMP_WORDS[i]} - args=$(($COMP_CWORD - i)) - break - fi - done - - case $mode in - --install) - case $args in - 1) - _filedir - ;; - 2) - installed_alternatives - ;; - 3) - _filedir - ;; - esac - ;; - --remove) - case $args in - 1) - installed_alternatives - ;; - 2) - _filedir - ;; - esac - ;; - --auto) - installed_alternatives - ;; - --remove-all) - installed_alternatives - ;; - --display) - installed_alternatives - ;; - --config) - installed_alternatives - ;; - *) - COMPREPLY=( $( compgen -W '--verbose --quiet --help --version \ - --altdir --admindir' -- $cur ) \ - $( compgen -W '--install --remove --auto --display \ - --config' -- $cur ) ) - esac -} -complete -F _update_alternatives update-alternatives -} - -# Python completion -# -have python && -_python() -{ - local prev cur - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]##*/} - - case "$prev" in - -Q) - COMPREPLY=( $( compgen -W "old new warn warnall" -- $cur ) ) - return 0 - ;; - -W) - COMPREPLY=( $( compgen -W "ignore default all module once error" -- $cur ) ) - return 0 - ;; - -c) - _filedir '@(py|pyc|pyo)' - return 0 - ;; - !(python|-?)) - [[ ${COMP_WORDS[COMP_CWORD-2]} != -@(Q|W) ]] && _filedir - ;; - esac - - - # if '-c' is already given, complete all kind of files. - for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do - if [[ ${COMP_WORDS[i]} == -c ]]; then - _filedir - fi - done - - - if [[ "$cur" != -* ]]; then - _filedir '@(py|pyc|pyo)' - else - COMPREPLY=( $( compgen -W "- -d -E -h -i -O -Q -S -t -u \ - -U -v -V -W -x -c" -- $cur ) ) - fi - - - - return 0 -} && -complete -F _python $filenames python - -# Perl completion -# -have perl && -{ -_perlmodules() -{ - COMPREPLY=( $( compgen -P "$prefix" -W "$( perl -e 'sub mods { my ($base,$dir)=@_; return if $base !~ /^\Q$ENV{cur}/; chdir($dir) or return; for (glob(q[*.pm])) {s/\.pm$//; print qq[$base$_\n]}; mods(/^(?:[.\d]+|$Config{archname}-$Config{osname}|auto)$/ ? undef : qq[${base}${_}\\\\:\\\\:],qq[$dir/$_]) for grep {-d} glob(q[*]); } mods(undef,$_) for @INC;' )" -- $cur ) ) -} - -_perl() -{ - local cur prev prefix temp - local optPrefix optSuffix - - COMPREPLY=() cur=`_get_cword` prev=${COMP_WORDS[COMP_CWORD-1]} - prefix="" - - # If option not followed by whitespace, reassign prev and cur - if [[ "$cur" == -?* ]]; then - temp=$cur - prev=${temp:0:2} - cur=${temp:2} - optPrefix=-P$prev - optSuffix=-S/ - prefix=$prev - fi - # only handle module completion for now - case "$prev" in - -I|-x) - local IFS=$'\t\n' - COMPREPLY=( $( compgen -d $optPrefix $optSuffix -- "$cur" ) ) - return 0 - ;; - -m|-M) - _perlmodules - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-C -s -T -u -U -W -X -h -v -V -c -w -d \ - -D -p -n -a -F -l -0 -I -m -M -P -S -x -i -e ' -- $cur ) ) - else - _filedir - fi -} -complete -F _perl $nospace $filenames perl - -_perldoc() -{ - local cur prev prefix temp - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - prefix="" - - # completing an option (may or may not be separated by a space) - if [[ "$cur" == -?* ]]; then - temp=$cur - prev=${temp:0:2} - cur=${temp:2} - prefix=$prev + if _split_longopt; then + case "$prev" in + *[Dd][Ii][Rr]*) + _filedir -d + ;; + *[Ff][Ii][Ll][Ee]*) + _filedir + ;; + esac + return 0 fi - # complete builtin perl functions - case $prev in - -f) - COMPREPLY=( $( compgen -W 'chomp chop chr crypt hex index lc \ - lcfirst length oct ord pack q qq reverse rindex sprintf \ - substr tr uc ucfirst y m pos quotemeta s split study qr abs \ - atan2 cos exp hex int log oct rand sin sqrt srand pop push \ - shift splice unshift grep join map qw reverse sort unpack \ - delete each exists keys values binmode close closedir \ - dbmclose dbmopen die eof fileno flock format getc print \ - printf read readdir rewinddir seek seekdir select syscall \ - sysread sysseek syswrite tell telldir truncate warn write \ - pack read syscall sysread syswrite unpack vec -X chdir chmod \ - chown chroot fcntl glob ioctl link lstat mkdir open opendir \ - readlink rename rmdir stat symlink umask unlink utime caller \ - continue do dump eval exit goto last next redo return \ - sub wantarray caller import local my our package use defined \ - formline reset scalar undef \ - alarm exec fork getpgrp getppid getpriority kill pipe qx \ - setpgrp setpriority sleep system times wait waitpid \ - import no package require use bless dbmclose dbmopen package \ - ref tie tied untie use accept bind connect getpeername \ - getsockname getsockopt listen recv send setsockopt shutdown \ - socket socketpair msgctl msgget msgrcv msgsnd semctl semget \ - semop shmctl shmget shmread shmwrite endgrent endhostent \ - endnetent endpwent getgrent getgrgid getgrnam getlogin \ - getpwent getpwnam getpwuid setgrent setpwent endprotoent \ - endservent gethostbyaddr gethostbyname gethostent \ - getnetbyaddr getnetbyname getnetent getprotobyname \ - getprotobynumber getprotoent getservbyname getservbyport \ - getservent sethostent setnetent setprotoent setservent \ - gmtime localtime time times' -- $cur ) ) - return 0 - ;; - esac - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-h -v -t -u -m -l -F -X -f -q' -- $cur )) + COMPREPLY=( $( compgen -W "$( $1 --help 2>&1 | sed -e '/--/!d' \ + -e 's/.*\(--[-A-Za-z0-9]\+\).*/\1/' |sort -u )"\ + -- "$cur" ) ) + elif [[ "$1" == rmdir ]]; then + _filedir -d else - # return available modules (unless it is clearly a file) - if [[ "$cur" != */* ]]; then - _perlmodules - COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W '$( PAGER=/bin/cat man perl | sed -ne "/perl.*Perl overview/,/perlwin32/p" | awk "\$NF=2 { print \$1}" | grep perl )' -- $cur ) ) - fi + _filedir fi } -complete -F _perldoc $default perldoc -} - -# rcs(1) completion -# -have rcs && -_rcs() -{ - local cur prev file dir i - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - file=${cur##*/} - dir=${cur%/*} - - # deal with relative directory - [ "$file" = "$dir" ] && dir=. - - COMPREPLY=( $( compgen -f "$dir/RCS/$file" ) ) - - for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do - file=${COMPREPLY[$i]##*/} - dir=${COMPREPLY[$i]%RCS/*} - COMPREPLY[$i]=$dir$file - done - - COMPREPLY=( "${COMPREPLY[@]}" $( compgen -G "$dir/$file*,v" ) ) - - for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do - COMPREPLY[$i]=${COMPREPLY[$i]%,v} - done - - # default to files if nothing returned and we're checking in. - # otherwise, default to directories - [ ${#COMPREPLY[@]} -eq 0 -a $1 = ci ] && _filedir || _filedir -d -} && -complete -F _rcs $filenames ci co rlog rcs rcsdiff - -# lilo(8) completion -# -have lilo && { -_lilo_labels() -{ - COMPREPLY=( $( awk -F'=' '/label/ {print $2}' \ - /etc/lilo.conf | sed -e 's/"//g' | grep "^$cur" ) ) -} - -_lilo() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case $prev in - -@(C|i|m|s|S)) - _filedir - return 0 - ;; - -r) - _filedir -d - return 0 - ;; - -@(I|D|R)) - # label completion - _lilo_labels - return 0 - ;; - -@(A|b|M|u|U)) - # device completion - cur=${cur:=/dev/} - _filedir - return 0 - ;; - -T) - # topic completion - COMPREPLY=( $( compgen -W 'help ChRul EBDA geom geom= \ - table= video' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - # relevant options completion - COMPREPLY=( $( compgen -W '-A -b -c -C -d -f -g -i -I -l -L -m \ - -M -p -P -q -r -R -s -S -t -T -u -U -v -V -w -x -z' -- \ - $cur ) ) - fi -} -complete -F _lilo lilo -} - -# links completion -# -have links && -_links() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - case "$cur" in - --*) - COMPREPLY=( $( compgen -W '--help' -- $cur ) ) - ;; - -*) - COMPREPLY=( $( compgen -W '-async-dns -max-connections \ - -max-connections-to-host -retries \ - -receive-timeout -unrestartable-receive-timeout\ - -format-cache-size -memory-cache-size \ - -http-proxy -ftp-proxy -download-dir \ - -assume-codepage -anonymous -dump -no-connect \ - -source -version -help' -- $cur ) ) - ;; - *) - if [ -r ~/.links/links.his ]; then - COMPREPLY=( $( compgen -W '$( < ~/.links/links.his )' \ - -- $cur ) ) - fi - _filedir '@(htm|html)' - return 0 - ;; - esac - - return 0 -} && -complete -F _links $filenames links - -[ $UNAME = FreeBSD ] && { -# FreeBSD package management tool completion -# -_pkg_delete() -{ - local cur pkgdir prev - - pkgdir=${PKG_DBDIR:-/var/db/pkg}/ - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - [ "$prev" = "-o" -o "$prev" = "-p" -o "$prev" = "-W" ] && return 0 - - COMPREPLY=( $( compgen -d $pkgdir$cur ) ) - COMPREPLY=( ${COMPREPLY[@]#$pkgdir} ) - - return 0 -} -complete -F _pkg_delete $dirnames pkg_delete pkg_info -have pkg_deinstall && complete -F _pkg_delete $dirnames pkg_deinstall - -# FreeBSD kernel module commands -# -_kldload() -{ - local cur moddir - - moddir=/modules/ - [ -d $moddir ] || moddir=/boot/kernel/ - cur=`_get_cword` - - COMPREPLY=( $( compgen -f $moddir$cur ) ) - COMPREPLY=( ${COMPREPLY[@]#$moddir} ) - COMPREPLY=( ${COMPREPLY[@]%.ko} ) - - return 0 -} -complete -F _kldload $filenames kldload - -_kldunload() -{ - local cur - cur=`_get_cword` - COMPREPLY=( $(kldstat | sed -ne "s/^.*[ \t]\+\($cur[a-z_]\+\).ko$/\1/p") ) -} -complete -F _kldunload $filenames kldunload -} - -# FreeBSD portupgrade completion -# -have portupgrade && -_portupgrade() -{ - local cur pkgdir prev - - pkgdir=${PKG_DBDIR:-/var/db/pkg}/ - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - [ "$prev" = "-l" -o "$prev" = "-L" -o "$prev" = "-o" ] && return 0 - - COMPREPLY=( $( compgen -d $pkgdir$cur ) ) - COMPREPLY=( ${COMPREPLY[@]#$pkgdir} ) - COMPREPLY=( ${COMPREPLY[@]%-*} ) - - return 0 -} && -complete -F _portupgrade $dirnames portupgrade - -# FreeBSD portinstall completion -# -have portinstall && -_portinstall() -{ - local cur portsdir prev indexfile - local -a COMPREPLY2 - - portsdir=${PORTSDIR:-/usr/ports}/ - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - # First try INDEX-5 - indexfile=$portsdir/INDEX-5 - # Then INDEX if INDEX-5 does not exist or system is not FreeBSD 5.x - [ "${OSTYPE%.*}" = "freebsd5" -a -f $indexfile ] || - indexfile=$portsdir/INDEX - - [ "$prev" = "-l" -o "$prev" = "-L" -o "$prev" = "-o" ] && return 0 - - COMPREPLY=( $( egrep "^$cur" < $indexfile | cut -d'|' -f1 ) ) - COMPREPLY2=( $( egrep "^[^\|]+\|$portsdir$cur" < $indexfile | \ - cut -d'|' -f2 ) ) - COMPREPLY2=( ${COMPREPLY2[@]#$portsdir} ) - COMPREPLY=( "${COMPREPLY[@]}" "${COMPREPLY2[@]}" ) - - return 0 -} && -complete -F _portinstall $dirnames portinstall - -# Slackware Linux removepkg completion -# -have removepkg && [ -f /etc/slackware-version ] && -_removepkg() -{ - local packages cur - - COMPREPLY=() - cur=`_get_cword` +# makeinfo and texi2dvi are defined elsewhere. +for i in a2ps autoconf automake bc gprof ld nm objcopy objdump readelf strip \ + bison diff patch enscript cp df dir du ln ls mkfifo mknod mv rm \ + touch vdir awk gperf grep grub indent less m4 sed shar date \ + tee who texindex cat csplit cut expand fmt fold head \ + md5sum nl od paste pr ptx sha1sum sort split tac tail tr unexpand \ + uniq wc ldd bash id irb mkdir rmdir; do + have $i && complete -F _longopt $filenames $i +done - COMPREPLY=( $( (cd /var/log/packages; compgen -f -- "$cur") ) ) -} && -complete -F _removepkg $filenames removepkg && - complete $dirnames -f -X '!*.tgz' installpkg upgradepkg explodepkg +# These commands do not use filenames, so '-o filenames' is not needed. +for i in env netstat seq uname units wget; do + have $i && complete -F _longopt $default $i +done +unset i # look(1) completion # have look && _look() { - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [ $COMP_CWORD = 1 ]; then - COMPREPLY=( $( compgen -W '$(look $cur 2>/dev/null)' ) ) - fi -} && -complete -F _look $default look - -# ypcat(1) and ypmatch(1) completion -# -have ypmatch && -_ypmatch() -{ - local cur map - - COMPREPLY=() - cur=`_get_cword` - - [ $1 = ypcat ] && [ $COMP_CWORD -gt 1 ] && return 0 - [ $1 = ypmatch ] && [ $COMP_CWORD -gt 2 ] && return 0 - - if [ $1 = ypmatch ] && [ $COMP_CWORD -eq 1 ] && \ - [ ${#COMP_WORDS[@]} -eq 3 ]; then - map=${COMP_WORDS[2]} - COMPREPLY=( $( compgen -W '$( ypcat $map | \ - cut -d':' -f 1 )' -- $cur) ) - else - [ $1 = ypmatch ] && [ $COMP_CWORD -ne 2 ] && return 0 - COMPREPLY=( $( compgen -W \ - '$( echo $(ypcat -x | cut -d"\"" -f 2))' -- $cur)) - fi - - return 0 -} && -complete -F _ypmatch ypmatch ypcat - -#xrandr(1) completion -# -have xrandr && -_xrandr() -{ - local cur prev output modes - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - --output) - local outputs=$(xrandr|grep 'connected'|awk '{print $1}') - COMPREPLY=( $(compgen -W "$outputs" -- $cur)) - return 0 - ;; - --mode) - for(( i = 1; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" == "--output" ]]; then - output=${COMP_WORDS[i+1]} - break - fi - done - modes=$(xrandr|sed -e "1,/$output/ d" \ - -e "/connected/,$ d"|awk '{print $1}') - COMPREPLY=( $( compgen -W "$modes" -- $cur)) - return 0 - ;; - esac - - case "$cur" in - *) - COMPREPLY=( $(compgen -W '-d -display -help -o \ - --orientation -q --query -s --size\ - -r --rate -v --version -x -y --screen \ - --verbose --dryrun --prop --fb --fbmm --dpi \ - --output --auto --mode --preferred --pos \ - --reflect --rotate --left-of --right-of \ - --above --below --same-as --set --off --crtc \ - --newmode --rmmode --addmode --delmode' -- $cur)) - return 0 - ;; - esac - - return 0 -} && -complete -F _xrandr xrandr - - - -# mplayer(1) completion -# -have mplayer && { -_mplayer_options_list() -{ - cur=${cur%\\} - COMPREPLY=( $( $1 $2 help 2> /dev/null | \ - sed -e '1,/^Available/d' | awk '{print $1}' | \ - sed -e 's/:$//' -e 's/^'${2#-}'$//' -e 's/<.*//' | \ - grep "^$cur" ) ) -} - -_mplayer() -{ - local cmd cur prev skinsdir IFS=$' \t\n' i j k=0 - - COMPREPLY=() - cmd=${COMP_WORDS[0]} - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(ac|afm|vc|vfm|ao|vo|vop|fstype|demuxer|vf|af)) - _mplayer_options_list mplayer $prev - return 0 - ;; - -@(oac|ovc|of)) - _mplayer_options_list mencoder $prev - return 0 - ;; - -audiofile) - _filedir '@(mp3|MP3|mpg|MPG|ogg|OGG|w?(a)v|W?(A)V|mid|MID|flac|FLAC|mka|MKA|ape|APE)' - return 0 - ;; - -font) - _filedir '@(desc|ttf)' - return 0 - ;; - -sub) - _filedir '@(srt|SRT|sub|SUB|txt|TXT|utf|UTF|rar|RAR|mpsub|smi|js|ssa|SSA|aas|AAS)' - return 0 - ;; - -vobsub) - _filedir '@(idx|IDX|ifo|IFO|sub|SUB)' - IFS=$'\t\n' - COMPREPLY=( $( for i in "${COMPREPLY[@]}"; do - if [ -f $i -a -r $i ]; then - echo ${i%.*} - else - echo $i - fi - done ) ) - IFS=$' \t\n' - return 0 - ;; - -ifo) - _filedir '@(ifo|IFO)' - return 0 - ;; - -cuefile) - _filedir '@(bin|BIN|cue|CUE)' - return 0 - ;; - -skin) - # if you don't have installed mplayer in /usr you - # may want to set the MPLAYER_SKINS_DIR global variable - if [ -n "$MPLAYER_SKINS_DIR" ]; then - skinsdir=$MPLAYER_SKINS_DIR - else - skinsdir=/usr/share/mplayer/Skin - fi - - IFS=$'\t\n' - for i in ~/.mplayer/Skin $skinsdir; do - if [ -d $i -a -r $i ]; then - for j in $( compgen -d $i/$cur ); do - COMPREPLY[$k]=${j#$i/} - k=$((++k)) - done - fi - done - IFS=$' \t\n' - return 0 - ;; - -@(mixer|@(cdrom|dvd)-device|dvdauth|fb|zrdev)) - cur=${cur:=/dev/} - _filedir - return 0 - ;; - -@(edl?(out)|lircconf|menu-cfg|playlist|csslib|dumpfile)| \ - -@(subfile|vobsub|aofile|fbmodeconfig|include|o|dvdkey)| \ - -passlogfile) - _filedir - return 0 - ;; - -@(auto@(q|sync)|loop|menu-root|speed|sstep|aid|alang)| \ - -@(?(@(audio|sub)-)demuxer|bandwidth|cache|chapter)| \ - -@(dvd?(angle)|fps|frames|mc|passwd|user|sb|srate|ss|vcd)| \ - -@(vi?(d|vo)|ffactor|sid|slang|spu@(align|aa|gauss))| \ - -@(vobsubid|delay|bpp|brightness|contrast|dfbopts|display)| \ - -@(fbmode|geometry|guiwid|hue|icelayer|screen[wh]|wid)| \ - -@(monitor@(aspect|-@(dotclock|[hv]freq))|panscan|saturation)| \ - -@(xineramascreen|zr@(crop|norm|quality|[xy]doff|[vh]dec))| \ - -@(aspect|pp|x|y|xy|z|stereo|audio-@(density|delay|preload))| \ - -@(endpos|osdlevel|ffourcc|sws|channels|skiplimit|format)| \ - -@(ofps|aa@(driver|@(osd|sub)color)|vobsubout?(i@(ndex|d)))| \ - -sub@(-bg-@(alpha|color)|cp|delay|fps|pos|align|width)| \ - -sub@(font-@(blur|outline|autoscale|encoding|@(osd|text)-scale))) - return 0 - ;; - -lavdopts) - COMPREPLY=( $( compgen -W 'ec er= bug= idct= gray' \ - -- $cur ) ) - return 0 - ;; - -lavcopts) - COMPREPLY=( $( compgen -W 'vcodec= vqmin= vqscale= \ - vqmax= mbqmin= mbqmax= vqdiff= \ - vmax_b_frames= vme= vhq v4mv \ - keyint= vb_strategy= vpass= \ - aspect= vbitrate= vratetol= \ - vrc_maxrate= vrc_minrate= \ - vrc_buf_size= vb_qfactor= vi_qfactor= \ - vb_qoffset= vi_qoffset= vqblur= \ - vqcomp= vrc_eq= vrc_override= \ - vrc_init_cplx= vqsquish= vlelim= \ - vcelim= vstrict= vdpart vpsize= gray \ - vfdct= idct= lumi_mask= dark_mask= \ - tcplx_mask= scplx_mask= naq ildct \ - format= pred qpel precmp= cmp= \ - subcmp= predia= dia= trell last_pred= \ - preme= subq= psnr mpeg_quant aic umv' \ - -- $cur ) ) - return 0 - ;; - -ssf) - COMPREPLY=( $( compgen -W 'lgb= cgb= ls= cs= chs= \ - cvs=' -- $cur ) ) - return 0 - ;; - -jpeg) - COMPREPLY=( $( compgen -W 'noprogressive progressive \ - nobaseline baseline optimize= \ - smooth= quality= outdir=' -- $cur ) ) - return 0 - ;; - -xvidopts) - COMPREPLY=( $( compgen -W 'dr2 nodr2' -- $cur ) ) - return 0 - ;; - -xvidencopts) - COMPREPLY=( $( compgen -W 'pass= bitrate= \ - fixed_quant= me_quality= 4mv \ - rc_reaction_delay_factor= \ - rc_averaging_period= rc_buffer= \ - quant_range= min_key_interval= \ - max_key_interval= mpeg_quant \ - mod_quant lumi_mask hintedme \ - hintfile debug keyframe_boost= \ - kfthreshold= kfreduction=' -- $cur ) ) - return 0 - ;; - -divx4opts) - COMPREPLY=( $( compgen -W 'br= key= deinterlace q= \ - min_quant= max_quant= rc_period= \ - rc_reaction_period= crispness= \ - rc_reaction_ratio= pass= vbrpass= \ - help' -- $cur ) ) - return 0 - ;; - -info) - COMPREPLY=( $( compgen -W 'name= artist= genre= \ - subject= copyright= srcform= \ - comment= help' -- $cur ) ) - return 0 - ;; - -lameopts) - COMPREPLY=( $( compgen -W 'vbr= abr cbr br= q= aq= \ - ratio= vol= mode= padding= fast \ - preset= help' -- $cur ) ) - return 0 - ;; - -rawaudio) - COMPREPLY=( $( compgen -W 'on channels= rate= \ - samplesize= format=' -- $cur ) ) - return 0 - ;; - -rawvideo) - COMPREPLY=( $( compgen -W 'on fps= sqcif qcif cif \ - 4cif pal ntsc w= h= y420 yv12 yuy2 \ - y8 format= size=' -- $cur ) ) - return 0 - ;; - -aop) - COMPREPLY=( $( compgen -W 'list= delay= format= fout= \ - volume= mul= softclip' -- $cur ) ) - return 0 - ;; - -dxr2) - COMPREPLY=( $( compgen -W 'ar-mode= iec958-encoded \ - iec958-decoded mute ucode= 75ire bw \ - color interlaced macrovision= norm= \ - square-pixel ccir601-pixel cr-left= \ - cr-right= cr-top= cr-bot= ck-rmin= \ - ck-gmin= ck-bmin= ck-rmax= ck-gmax= \ - ck-bmax= ck-r= ck-g= ck-b= \ - ignore-cache= ol-osd= olh-cor= \ - olw-cor= olx-cor= oly-cor= overlay \ - overlay-ratio= update-cache' -- $cur )) - return 0 - ;; - -tv) - COMPREPLY=( $( compgen -W 'on noaudio driver= device= \ - input= freq= outfmt= width= height= \ - buffersize= norm= channel= chanlist= \ - audiorate= forceaudio alsa amode= \ - forcechan= adevice= audioid= volume= \ - bass= treble= balance= fps= \ - channels= immediatemode=' -- $cur ) ) - return 0 - ;; - -mf) - COMPREPLY=( $( compgen -W 'on w= h= fps= type=' \ - -- $cur ) ) - return 0 - ;; - -cdda) - COMPREPLY=( $( compgen -W 'speed= paranoia= \ - generic-dev= sector-size= overlap= \ - toc-bias toc-offset= skip noskip' \ - -- $cur ) ) - return 0 - ;; - -input) - COMPREPLY=( $( compgen -W 'conf= ar-delay ar-rate \ - keylist cmdlist js-dev file' -- $cur ) ) - return 0 - ;; - -af) - COMPREPLY=( $( compgen -W 'resample resample= \ - channels channels= format format= \ - volume volume= delay delay= pan \ - pan= sub sub= surround surround=' \ - -- $cur ) ) - return 0 - ;; - -af-adv) - COMPREPLY=( $( compgen -W 'force= list=' -- $cur ) ) - return 0 - ;; - -profile) - _mplayer_options_list $cmd $prev - return 0 - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W '-aid -alang -audio-demuxer \ - -audiofile -cdrom-device -cache -cdda \ - -channels -chapter -csslib -demuxer \ - -dvd -dvd-device -dvdangle -dvdauth \ - -dvdkey -dvdnav -forceidx -fps -frames \ - -hr-mp3-seek -idx -mc -mf -ni -nobps \ - -passwd -rawaudio -rtsp-stream-over-tcp\ - -skipopening -sb -srate -ss -tv -user \ - -vcd -vid -vivo -ifo -ffactor -font \ - -noautosub -nooverlapsub -sid -slang \ - -sub -subcc -subcp -sub-demuxer \ - -subdelay -subfont-autoscale \ - -subfont-blur -subfont-encoding \ - -subfont-osd-scale -subfont-outline \ - -subfont-text-scale -subfps -subfile \ - -subpos -unicode -utf8 -vobsub \ - -vobsubid -ac -afm -aspect -flip \ - -lavdopts -noaspect -nosound -pp -ssf \ - -stereo -sws -vc -vfm -vop -xvidopts\ - -xy -zoom -bandwidth -cuefile \ - -noextbased -rawvideo -overlapsub \ - -sub-bg-alpha -sub-bg-color -subalign \ - -subwidth -sub-no-text-pp -spualign \ - -spuaa -spugauss -pphelp -verbose -v \ - -noni -noidx -nohr-mp3-seek -extbased \ - -bps -oldpp -nozoom -noflip -nounicode \ - -noutf8 -profile -vf -af' -- $cur ) ) - # add mplayer specific options - [[ "$cmd" == @(?(g)mplayer) ]] && COMPREPLY=( "${COMPREPLY[@]}" \ - $(compgen -W '-autoq -autosync -benchmark \ - -framedrop -h -help -hardframedrop \ - -identify -input -lircconf -loop \ - -nojoystick -nolirc -nortc -playlist \ - -quiet -really-quiet -rnd -sdp -skin \ - -slave -softsleep -speed -sstep \ - -use-stdin -dumpaudio -dumpfile \ - -dumpstream -dumpvideo -dumpmicrodvdsub\ - -dumpmpsub -dumpsrtsub -dumpjacosub \ - -dumpsami -dumpsub -osdlevel -af \ - -af-adv -ao -aofile -aop -delay -mixer \ - -nowaveheader -bpp -brightness \ - -contrast -display -double -dr -dxr2 \ - -fb -fbmode -fbmodeconfig -forcexv -fs \ - -geometry -hue -icelayer -jpeg \ - -monitor-dotclock -monitor-hfreq \ - -monitor-vfreq -monitoraspect \ - -nograbpointer -noslices -panscan \ - -rootwin -saturation -screenw -screenh \ - -stop-xscreensaver -vm -vo -vsync -wid \ - -xineramascreen -z -zrbw -zrcrop \ - -zrdev -zrfd -zrhelp -zrnorm -zrquality \ - -zrvdec -zrhdec -zrxdoff -zrydoff -y \ - -edl -edlout -enqueue -fixed-vo \ - -menu -menu-root -menu-cfg -shuffle \ - -format -aahelp -dfbopts -fstype \ - -guiwid -nokeepaspect -x --help \ - -aaosdcolor -aasubcolor -aadriver \ - -aaextended -aaeight' -- $cur) ) - # add mencoder specific options - [[ "$cmd" = mencoder ]] && COMPREPLY=( "${COMPREPLY[@]}" \ - $(compgen -W '-audio-density -audio-delay \ - -audio-preload -divx4opts -endpos \ - -ffourcc -include -info -lameopts \ - -lavcopts -noskip -o -oac -ofps -ovc \ - -passlogfile -skiplimit -vobsubout \ - -vobsuboutindex -vobsuboutid \ - -xvidencopts -of --verbose' -- $cur) ) - ;; - *) - _filedir '@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|ASF|vob|VOB|bin|BIN|dat|DAT|vcd|VCD|ps|PS|pes|PES|fl[iv]|FL[IV]|viv|VIV|rm?(j)|RM?(J)|ra?(m)|RA?(M)|yuv|YUV|mov|MOV|qt|QT|mp[234]|MP[234]|m4[av]|M4[AV]|og[gmavx]|OG[GMAVX]|w?(a)v|W?(A)V|dump|DUMP|mk[av]|MK[AV]|m4a|M4A|aac|AAC|m2v|M2V|dv|DV|rmvb|RMVB|mid|MID|ts|TS|3g[p2]|mpc|MPC|flac|FLAC|vro|VRO|divx|DIVX|aif?(f)|AIF?(F)|m2ts|M2TS|vdr|VDR|xvid|XVID|ape|APE)' - ;; - esac - - return 0 -} -complete $filenames -F _mplayer mplayer mencoder gmplayer kplayer -} - -# KDE dcop completion -# -have dcop && -_dcop() -{ - local cur compstr - - COMPREPLY=() - cur=`_get_cword` - if [ -z $cur ]; then - compstr=${COMP_WORDS[*]} - else - compstr=$( command echo ${COMP_WORDS[*]} | sed "s/ $cur$//" ) - fi - COMPREPLY=( $( compgen -W '$( command $compstr | sed s/\(.*\)// )' -- $cur ) ) -} && -complete -F _dcop dcop - -# wvdial(1) completion -# -have wvdial && -_wvdial() -{ - local cur prev config i IFS=$'\t\n' - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case $prev in - --config) - _filedir - return 0 - ;; - esac - - case $cur in - -*) - COMPREPLY=( $( compgen -W '--config --chat \ - --remotename --help --version --no-syslog' \ - -- $cur ) ) - ;; - *) - # start with global and personal config files - config="/etc/wvdial.conf"$'\t'"$HOME/.wvdialrc" - # replace with command line config file if present - for (( i=1; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" == "--config" ]]; then - config=${COMP_WORDS[i+1]} - break - fi - done - # parse config files for sections and - # remove default section - COMPREPLY=( $( sed -ne \ - "s|^\[Dialer \($cur.*\)\]$|\1|p" \ - $config 2>/dev/null |grep -v '^Defaults$')) - # escape spaces - COMPREPLY=${COMPREPLY// /\\ } - ;; - esac - -} && -complete -F _wvdial wvdial - -# gpg(1) completion -# -have gpg && -_gpg() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(s|-sign|-clearsign|-decrypt-files|-load-extension)) - _filedir - return 0 - ;; - --@(export|@(?(l|nr|nrl)sign|edit)-key)) - # return list of public keys - COMPREPLY=( $( compgen -W "$( gpg --list-keys 2>/dev/null | sed -ne 's@^pub.*/\([^ ]*\).*$@\1@p;s@^.*\(<\([^>]*\)>\).*$@\2@p')" -- "$cur" )) - return 0 - ;; - -@(r|-recipient)) - COMPREPLY=( $( compgen -W "$( gpg --list-keys 2>/dev/null | sed -ne 's@^.*<\([^>]*\)>.*$@\1@p')" -- "$cur" )) - if [ -e ~/.gnupg/gpg.conf ]; then - COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$( sed -ne 's@^[ \t]*group[ \t][ \t]*\([^=]*\).*$@\1@p' ~/.gnupg/gpg.conf )" -- "$cur") ) - fi - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-s -b -e -f -c -d -a -r -u -Z -o -v\ - -q -n -N $(gpg --dump-options)' -- $cur ) ) - fi - -} && -complete -F _gpg $default gpg - -# iconv(1) completion -# -have iconv && -_iconv() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(f|t|-@(from|to)-code)) - COMPREPLY=( $( compgen -W \ - '$( iconv --list | sed -e "s@//@@;" )' -- "$cur" ) ) - return 0 - ;; - esac - - - if [[ "$cur" = -* ]]; then - COMPREPLY=( $( compgen -W '--from-code -f --to-code -t --list - --output -o --verbose' -- "$cur" ) ) - return 0 - fi -} && -complete -F _iconv $default iconv - -# dict(1) completion -# -{ have dict || have rdict; } && { -_dictdata() -{ - dict $host $port $1 2>/dev/null | sed -ne \ - 's/^['$'\t '']['$'\t '']*\([^'$'\t '']*\).*$/\1/p' -} - -_dict() -{ - local cur prev host port db dictfile - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - dictfile=/usr/share/dict/words - - for (( i=1; i < COMP_CWORD; i++ )); do - case "${COMP_WORDS[i]}" in - -@(h|--host)) - host=${COMP_WORDS[i+1]} - [ -n "$host" ] && host="-h $host" - i=$((++i)) - ;; - -@(p|-port)) - port=${COMP_WORDS[i+1]} - [ -n "$port" ] && port="-p $port" - i=$((++i)) - ;; - -@(d|-database)) - db=${COMP_WORDS[i+1]} - [ -n "$db" ] && host="-d $db" - i=$((++i)) - ;; - *) - ;; - esac - done - - if [[ "$cur" = -* ]]; then - COMPREPLY=( $( compgen -W '-h --host -p --port -d --database \ - -m --match -s --strategy -c --config -C \ - --nocorrect -D --dbs -S --strats -H \ - --serverhelp -i --info -I --serverinfo \ - -a --noauth -u --user -k --key -V --version \ - -L --license --help -v --verbose -r --raw \ - -P --pager --debug --html --pipesize --client' \ - -- "$cur" ) ) - return 0 - fi - - case "$prev" in - -@(d|-database|i|info)) - COMPREPLY=( $( compgen -W '$( _dictdata -D )' -- "$cur" ) ) - return 0 - ;; - -@(s|-strategy)) - COMPREPLY=( $( compgen -W '$( _dictdata -S )' -- "$cur" ) ) - return 0 - ;; - *) - ;; - esac - - [ -r $dictfile ] && \ - COMPREPLY=( $( compgen -W '$( cat $dictfile )' -- "$cur" ) ) -} -complete -F _dict $default dict rdict -} - -# cdrecord(1) completion -# -(have cdrecord || have wodim) && -_cdrecord() -{ - local cur prev i generic_options track_options track_mode - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - # foo=bar style option - if [[ "$cur" == *=* ]]; then - prev=${cur/=*/} - cur=${cur/*=/} - case "$prev" in - @(text|cue)file) - _filedir - return 0 - ;; - blank) - COMPREPLY=( $( compgen -W 'help all fast \ - track unreserve trtail unclose session' \ - -- $cur ) ) - return 0 - ;; - driveropts) - COMPREPLY=( $( compgen -W 'burnfree noburnfree\ - varirec= audiomaster forcespeed noforcespeed\ - speedread nospeedread singlesession \ - nosinglesession hidecdr nohidecdr tattooinfo\ - tattoofile=' -- $cur ) ) - return 0 - ;; - esac - fi - - generic_options=(-version -v -V -d -silent -s -force -immed -dummy \ - -dao -raw -raw96r -raw96p -raw16 -multi -msinfo -toc \ - -atip -fix -nofix -waiti -load -lock -eject -format \ - -setdropts -checkdrive -prcap -inq -scanbus -reset \ - -abort -overburn -ignsize -useinfo -packet -noclose \ - -text debug= kdebug= kd= minbuf= speed= blank= fs= \ - dev= gracetime= timeout= driver= driveropts= \ - defpregap= pktsize= mcn= textfile= cuefile=) - track_options=(-audio -swab -data -mode2 -xa -xa1 -xa2 -xamix -cdi \ - -isosize -pad padsize= -nopad -shorttrack -noshorttrack\ - pregap= -preemp -nopreemp -copy -nocopy -scms tcsize= \ - isrc= index=) - # look if previous was either a file or a track option - track_mode=0 - if [ $COMP_CWORD -gt 1 ]; then - if [ -f "$prev" ]; then - track_mode=1 - else - for (( i=0; i < ${#track_options[@]}; i++ )); do - if [[ "${track_options[i]}" == "$prev" ]]; then - track_mode=1 - break - fi - done - fi - fi - - # files are always eligible completion - _filedir - # track options are always available - COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W '${track_options[@]}' -- $cur ) ) - # general options are no more available after file or track option - if [ $track_mode -eq 0 ]; then - COMPREPLY=( "${COMPREPLY[@]}" \ - $( compgen -W '${generic_options[@]}' -- $cur ) ) - fi - -} && -complete -F _cdrecord $filenames cdrecord wodim - -# mkisofs(8) completion -# -(have mkisofs || have genisoimage) && -_mkisofs() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(o|abstract|biblio|check-session|copyright|log-file|root-info|prep-boot|*-list)) - _filedir - return 0 - ;; - -*-charset) - COMPREPLY=( $( mkisofs -input-charset help 2>&1 | \ - tail +3 | grep "^$cur") ) - return 0 - ;; - -uid) - _uids - return 0 - ;; - -gid) - _gids - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-abstract -A -allow-lowercase \ - -allow-multidot -biblio -cache-inodes \ - -no-cache-inodes -b -eltorito-alt-boot -B -G \ - -hard-disk-boot -no-emul-boot -no-boot \ - -boot-load-seg -boot-load-size \ - -boot-info-table -C -c -check-oldname \ - -check-session -copyright -d -D -dir-mode \ - -dvd-video -f -file-mode -gid -gui \ - -graft-points -hide -hide-list -hidden \ - -hidden-list -hide-joliet -hide-joliet-list \ - -hide-joliet-trans-tbl -hide-rr-moved \ - -input-charset -output-charset -iso-level -J \ - -joliet-long -jcharset -l -L -log-file -m \ - -exclude-list -max-iso9660-filenames -M -N \ - -new-dir-mode -nobak -no-bak -force-rr -no-rr \ - -no-split-symlink-components \ - -no-split-symlink-fields -o -pad -no-pad \ - -path-list -P -p -print-size -quiet -R -r \ - -relaxed-filenames -sort -split-output \ - -stream-media-size -stream-file-name -sysid -T\ - -table-name -ucs-level -udf -uid \ - -use-fileversion -U -no-iso-translate -V \ - -volset -volset-size -volset-seqno -v -x -z \ - -hfs -apple -map -magic -hfs-creator \ - -hfs-type -probe -no-desktop -mac-name \ - -boot-hfs-file -part -auto -cluster-size \ - -hide-hfs -hide-hfs-list -hfs-volid \ - -icon-position -root-info -prep-boot \ - -input-hfs-charset -output-hfs-charset \ - -hfs-unlock -hfs-bless -hfs-parms --cap \ - --netatalk --double --ethershare --ushare \ - --exchange --sgi --xinet --macbin --single \ - --dave --sfm --osx-double --osx-hfs' -- $cur )) - else - _filedir - fi - -} && -complete -F _mkisofs $filenames mkisofs genisoimage - -# mc(1) completion -# -have mc && -_mc() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - # -name value style option - case "$prev" in - -@(e|v|l|P)) - _filedir - return 0 - ;; - esac - - # --name=value style option - if [[ "$cur" == *=* ]]; then - prev=${cur/=*/} - cur=${cur/*=/} - case "$prev" in - --@(edit|view|ftplog|printwd)) - _filedir - return 0 - ;; - esac - fi - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-a --stickchars -b --nocolor -c \ - --color -C --colors= -d --nomouse -e --edit= -f \ - --datadir -k --resetsoft -l --ftplog= -P --printwd= \ - -s --slow -t --termcap -u --nosubshell -U --subshell \ - -v --view= -V --version -x --xterm -h --help' -- $cur ) ) - else - _filedir -d - fi -} && -complete -F _mc $filenames mc - -# yum(8) completion -# -have yum && { -_yum_list() -{ - if [[ "$1" == all ]] ; then - # Try to strip in between headings like "Available Packages" - # This will obviously only work for English :P - COMPREPLY=( $( yum -d 0 -C list $1 "$cur*" 2>/dev/null | \ - grep -iv '^\(Available\|Installed\|Updated\) Packages' | \ - sed -e 's/[[:space:]].*//' ) ) - else - # Drop first line (e.g. "Updated Packages") - COMPREPLY=( $( yum -d 0 -C list $1 "$cur*" 2>/dev/null | \ - sed -ne 1d -e 's/[[:space:]].*//p' ) ) - fi -} - -_yum() -{ - local cur prev special - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do - if [[ ${COMP_WORDS[i]} == @(install|update|upgrade|remove|erase|deplist|info) ]]; then - special=${COMP_WORDS[i]} - fi - done - - if [ -n "$special" ]; then - case $special in - install) - _yum_list available - return 0 - ;; - deplist|info) - _yum_list all - return 0 - ;; - upgrade|update) - _yum_list updates - return 0 - ;; - remove|erase) - # _rpm_installed_packages is not arch-qualified - _yum_list installed - return 0 - ;; - esac - fi - - case $cur in - --*) - COMPREPLY=( $( compgen -W '--installroot --version --help --enablerepo --disablerepo --exclude --obsoletes --noplugins' -- $cur ) ) - return 0 - ;; - -*) - COMPREPLY=( $( compgen -W '-c -e -d -y -t -R -C -h' -- $cur ) ) - return 0 - ;; - esac - - case $prev in - list) - COMPREPLY=( $( compgen -W 'all available updates installed extras obsoletes recent' -- $cur ) ) - ;; - clean) - COMPREPLY=( $( compgen -W 'packages headers metadata cache dbcache all' -- $cur ) ) - ;; - localinstall|localupdate) - # TODO: should not match *src.rpm - _filedir rpm - ;; - -c) - _filedir - ;; - --installroot) - _filedir -d - ;; - *) - COMPREPLY=( $( compgen -W 'install update check-update upgrade remove list \ - search info provides clean groupinstall groupupdate \ - grouplist deplist erase groupinfo groupremove \ - localinstall localupdate makecache resolvedep \ - shell whatprovides' -- $cur ) ) - ;; - esac -} -complete -F _yum $filenames yum - -# yum-arch(8) completion -# -_yum_arch() -{ local cur + COMPREPLY=() cur=`_get_cword` - case "$cur" in - -*) - COMPREPLY=( $( compgen -W '-d -v -vv -n -c -z -s -l -q' -- $cur ) ) - ;; - *) - _filedir -d - ;; - esac - - return 0 - -} -complete -F _yum_arch $filenames yum-arch -} - -# ImageMagick completion -# -have convert && { -_ImageMagick() -{ - local prev - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -channel) - COMPREPLY=( $( compgen -W 'Red Green Blue Opacity \ - Matte Cyan Magenta Yellow Black' -- $cur ) ) - return 0 - ;; - -colormap) - COMPREPLY=( $( compgen -W 'shared private' -- $cur ) ) - return 0 - ;; - -colorspace) - COMPREPLY=( $( compgen -W 'GRAY OHTA RGB Transparent \ - XYZ YCbCr YIQ YPbPr YUV CMYK' -- $cur ) ) - return 0 - ;; - -compose) - COMPREPLY=( $( compgen -W 'Over In Out Atop Xor Plus \ - Minus Add Subtract Difference Multiply Bumpmap\ - Copy CopyRed CopyGreen CopyBlue CopyOpacity' \ - -- $cur ) ) - return 0 - ;; - -compress) - COMPREPLY=( $( compgen -W 'None BZip Fax Group4 JPEG \ - Lossless LZW RLE Zip' -- $cur ) ) - return 0 - ;; - -dispose) - COMPREPLY=( $( compgen -W 'Undefined None Background \ - Previous' -- $cur ) ) - return 0 - ;; - -encoding) - COMPREPLY=( $( compgen -W 'AdobeCustom AdobeExpert \ - AdobeStandard AppleRoman BIG5 GB2312 Latin2 \ - None SJIScode Symbol Unicode Wansung' -- $cur)) - return 0 - ;; - -endian) - COMPREPLY=( $( compgen -W 'MSB LSB' -- $cur ) ) - return 0 - ;; - -filter) - COMPREPLY=( $( compgen -W 'Point Box Triangle Hermite \ - Hanning Hamming Blackman Gaussian Quadratic \ - Cubic Catrom Mitchell Lanczos Bessel Sinc' \ - -- $cur ) ) - return 0 - ;; - -format) - COMPREPLY=( $( convert -list format | \ - awk '/ [r-][w-][+-] / {print $1}' | \ - tr -d '*' | tr [:upper:] [:lower:] | \ - grep "^$cur" ) ) - return 0 - ;; - -gravity) - COMPREPLY=( $( compgen -W 'Northwest North NorthEast \ - West Center East SouthWest South SouthEast' \ - -- $cur ) ) - return 0 - ;; - -intent) - COMPREPLY=( $( compgen -W 'Absolute Perceptual \ - Relative Saturation' -- $cur ) ) - return 0 - ;; - -interlace) - COMPREPLY=( $( compgen -W 'None Line Plane Partition' \ - -- $cur ) ) - return 0 - ;; - -limit) - COMPREPLY=( $( compgen -W 'Disk File Map Memory' \ - -- $cur ) ) - return 0 - ;; - -list) - COMPREPLY=( $( compgen -W 'Delegate Format Magic \ - Module Resource Type' -- $cur ) ) - return 0 - ;; - -map) - COMPREPLY=( $( compgen -W 'best default gray red \ - green blue' -- $cur ) ) - _filedir - return 0 - ;; - -noise) - COMPREPLY=( $( compgen -W 'Uniform Gaussian \ - Multiplicative \ - Impulse Laplacian Poisson' -- $cur ) ) - return 0 - ;; - -preview) - COMPREPLY=( $( compgen -W 'Rotate Shear Roll Hue \ - Saturation Brightness Gamma Spiff \ - Dull Grayscale Quantize Despeckle \ - ReduceNoise AddNoise Sharpen Blur \ - Treshold EdgeDetect Spread Shade \ - Raise Segment Solarize Swirl Implode \ - Wave OilPaint CharcoalDrawing JPEG' \ - -- $cur ) ) - return 0 - ;; - -@(mask|profile|texture|tile|write)) - _filedir - return 0 - ;; - -type) - COMPREPLY=( $( compgen -W 'Bilevel Grayscale Palette \ - PaletteMatte TrueColor TrueColorMatte \ - ColorSeparation ColorSeparationlMatte \ - Optimize' -- $cur ) ) - return 0 - ;; - -units) - COMPREPLY=( $( compgen -W 'Undefined PixelsPerInch \ - PixelsPerCentimeter' -- $cur ) ) - return 0 - ;; - -virtual-pixel) - COMPREPLY=( $( compgen -W 'Constant Edge mirror tile' \ - -- $cur ) ) - return 0 - ;; - -visual) - COMPREPLY=( $( compgen -W 'StaticGray GrayScale \ - StaticColor PseudoColor TrueColor \ - DirectColor defaut visualid' -- $cur )) - return 0 - ;; - esac -} - -_convert() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-adaptive-blur -adaptive-resize \ - -adaptive-sharpen -adjoin -affine -alpha -annotate \ - -antialias -append -attenuate -authenticate \ - -auto-orient -average -background -bench -bias \ - -black-point-compensation -black-threshold \ - -blue-primary -blur -border -bordercolor -caption \ - -channel -charcoal -chop -clip -clip-mask -clip-path \ - -clone -clut -coalesce -colorize -colors -colorspace \ - -combine -comment -compose -composite -compress \ - -contrast -contrast-stretch -convolve -crop -cycle \ - -debug -decipher -deconstruct -define -delay -delete \ - -density -depth -despeckle -display -dispose -distort \ - -dither -draw -edge -emboss -encipher -encoding \ - -endian -enhance -equalize -evaluate -extent -extract \ - -family -fill -filter -flatten -flip -floodfill -flop \ - -font -format -frame -fuzz -fx -gamma -gaussian-blur \ - -geometry -gravity -green-primary -help -identify \ - -implode -insert -intent -interlace -interpolate \ - -label -lat -layers -level -limit -linear-stretch \ - -liquid-rescale -list -log -loop -map -mask \ - -mattecolor -median -modulate -monitor -monochrome \ - -morph -mosaic -motion-blur -negate -noise -normalize \ - -opaque -ordered-dither -orient -page -paint -ping \ - -pointsize -polaroid -posterize -preview -print \ - -process -profile -quality -quantize -quiet \ - -radial-blur -raise -random-threshold -recolor \ - -red-primary -regard-warnings -region -render -repage \ - -resample -resize -respect-parenthesis -reverse -roll \ - -rotate -sample -sampling-factor -scale -scene -seed \ - -segment -separate -sepia-tone -set -shade -shadow \ - -sharpen -shave -shear -sigmoidal-contrast -size \ - -sketch -solarize -splice -spread -stretch -strip \ - -stroke -strokewidth -style -swap -swirl -taint \ - -texture -threshold -thumbnail -tile -tile-offset \ - -tint -transform -transparent -transparent-color \ - -transpose -transverse -treedepth -trim -type \ - -undercolor -unique-colors -units -unsharp -verbose \ - -version -view -vignette -virtual-pixel -wave \ - -weight -white-point -white-threshold \ - -write' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+adjoin +append +compress \ - +contrast +debug +dither +endian +gamma +label +map \ - +mask +matte +negate +noise +page +raise +render \ - +write' -- $cur ) ) - else - _filedir - fi -} -complete -F _convert $filenames convert - -_mogrify() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-adaptive-blur -adaptive-resize \ - -adaptive-sharpen -adjoin -affine -alpha -annotate \ - -antialias -attenuate -authenticate -auto-orient \ - -background -bias -black-point-compensation \ - -black-threshold -blue-primary -blur -border \ - -bordercolor -caption -channel -charcoal -chop -clip \ - -clip-mask -clip-path -clut -colorize -colors \ - -colorspace -comment -compose -compress -contrast \ - -contrast-stretch -convolve -cycle -debug -decipher \ - -define -delay -density -depth -despeckle -display \ - -dispose -distort -dither -draw -edge -emboss \ - -encipher -encoding -endian -enhance -equalize \ - -evaluate -extent -extract -family -fill -filter \ - -flip -floodfill -flop -font -format -frame -fuzz \ - -gamma -gaussian-blur -geometry -gravity \ - -green-primary -help -identify -implode -intent \ - -interlace -interpolate -label -lat -layers -level \ - -limit -linear-stretch -liquid-rescale -list -log \ - -loop -mask -mattecolor -median -modulate -monitor \ - -monochrome -motion-blur -negate -noise -normalize \ - -opaque -ordered-dither -orient -page -paint -path \ - -ping -pointsize -polaroid -posterize -preview -print \ - -profile -quality -quantize -quiet -radial-blur \ - -raise -random-threshold -recolor -red-primary \ - -regard-warnings -region -render -repage -resample \ - -resize -roll -rotate -sample -sampling-factor -scale \ - -scene -seed -segment -sepia-tone -set -shade -shadow \ - -sharpen -shave -shear -sigmoidal-contrast -size \ - -sketch -solarize -splice -spread -stretch -strip \ - -stroke -strokewidth -style -swirl -taint -texture \ - -threshold -thumbnail -tile -tile-offset -tint \ - -transform -transparent -transparent-color -transpose \ - -transverse -treedepth -trim -type -undercolor \ - -unique-colors -units -unsharp -verbose -version \ - -view -vignette -virtual-pixel -wave -weight \ - -white-point -white-threshold' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+compress +contrast +debug +dither \ - +endian +gamma +label +map +mask +matte +negate +page \ - +raise' -- $cur ) ) - else - _filedir - fi -} -complete -F _mogrify $filenames mogrify - -_display() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-alpha -antialias -authenticate \ - -auto-orient -backdrop -background -border \ - -bordercolor -borderwidth -channel -clip \ - -clip-path -coalesce -colormap -colors -colorspace \ - -comment -compress -contrast -crop -debug -decipher \ - -define -delay -density -depth -despeckle -display \ - -dispose -dither -edge -endian -enhance -extract \ - -filter -flatten -flip -flop -font -foreground \ - -format -frame -gamma -geometry -help -iconGeometry \ - -iconic -identify -immutable -interlace -interpolate \ - -label -limit -list -log -loop -map -mattecolor \ - -monitor -monochrome -name -negate -page -profile \ - -quality -quantize -quiet -raise -regard-warnings \ - -remote -repage -resample -resize \ - -respect-parenthesis -roll -rotate -sample \ - -sampling-factor -scenes -seed -segment -set \ - -shared-memory -sharpen -size -strip -texture -title \ - -transparent-color -treedepth -trim -update \ - -usePixmap -verbose -version -virtual-pixel -visual \ - -window -window-group -write' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+compress +contrast +debug +dither \ - +endian +gamma +label +map +matte +negate +page \ - +raise +write' -- $cur ) ) - else - _filedir - fi -} -complete -F _display $filenames display - -_animate() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-alpha -authenticate -backdrop \ - -background -bordercolor -borderwidth -channel \ - -coalesce -colormap -colors -colorspace -crop -debug \ - -decipher -define -delay -density -depth -display \ - -dispose -dither -extract -filter -flatten -font \ - -foreground -format -gamma -geometry -help \ - -iconGeometry -iconic -identify -immutable -interlace \ - -interpolate -limit -list -log -loop -map -mattecolor \ - -mattecolor -monitor -monochrome -name -page -pause \ - -quantize -quiet -regard-warnings -remote -repage \ - -resample -resize -respect-parenthesis -rotate \ - -sampling-factor -scenes -seed -set -shared-memory \ - -size -strip -title -transparent-color -treedepth \ - -trim -verbose -version -virtual-pixel -visual \ - -window' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+debug +dither +gamma +map +matte' -- $cur ) ) - else - _filedir - fi -} -complete -F _animate $filenames animate - -_identify() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-alpha -antialias -authenticate \ - -channel -colorspace -crop -debug -define -density \ - -depth -extract -format -fuzz -gamma -help -interlace \ - -interpolate -limit -list -log -monitor -ping -quiet \ - -regard-warnings -respect-parenthesis \ - -sampling-factor -seed -set -size -strip -units \ - -verbose -version -virtual-pixel' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+debug' -- $cur ) ) - else - _filedir - fi -} -complete -F _identify $filenames identify - -_montage() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-adjoin -affine -alpha \ - -authenticate -background -blue-primary -blur -border \ - -bordercolor -borderwidth -caption -channel -clone \ - -coalesce -colors -colorspace -comment -compose \ - -compress -crop -debug -define -density -depth \ - -display -dispose -dither -draw -encoding -endian \ - -extract -fill -filter -flatten -flip -flop -font \ - -format -frame -gamma -geometry -gravity \ - -green-primary -help -identify -interlace \ - -interpolate -label -limit -list -log -mattecolor \ - -mode -monitor -monochrome -origin -page -pointsize \ - -polaroid -profile -quality -quantize -quiet \ - -red-primary -regard-warnings -repage -resize \ - -respect-parenthesis -rotate -sampling-factor -scenes \ - -seed -set -shadow -size -strip -stroke -texture \ - -thumbnail -tile -title -transform -transparent \ - -transparent-color -treedepth -trim -type -units \ - -verbose -version -virtual-pixel \ - -white-point' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+adjoin +compress +debug +dither \ - +endian +gamma +label +matte +page' -- $cur ) ) - else - _filedir - fi -} -complete -F _montage $filenames montage - -_composite() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-affine -alpha -authenticate \ - -blend -blue-primary -border -bordercolor -channel \ - -colors -colorspace -comment -compose -compress \ - -debug -decipher -define -density -depth -displace \ - -display -dispose -dissolve -dither -encipher \ - -encoding -endian -extract -filter -font -format \ - -geometry -gravity -green-primary -help -identify \ - -interlace -interpolate -label -limit -list -log \ - -monitor -monochrome -negate -page -profile -quality \ - -quantize -quiet -red-primary -regard-warnings \ - -repage -resize -respect-parenthesis -rotate \ - -sampling-factor -scene -seed -sharpen -shave -size \ - -stegano -stereo -strip -swap -thumbnail -tile \ - -transform -transparent-color -treedepth -type -units \ - -unsharp -verbose -version -virtual-pixel -watermark \ - -white-point -write' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+compress +debug +dither +endian +label \ - +matte +negate +page +write' -- $cur ) ) - else - _filedir - fi -} -complete -F _composite $filenames composite - -_compare() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-alpha -authenticate -channel \ - -colorspace -compress -debug -decipher -define \ - -density -depth -encipher -extract -format -fuzz \ - -help -highlight-color -identify -interlace -limit \ - -list -log -metric -monitor -passphrase -profile \ - -quality -quantize -quiet -regard-warnings \ - -respect-parenthesis -sampling-factor -seed -set \ - -size -transparent-color -type -verbose -version \ - -virtual-pixel' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+debug' -- $cur ) ) - else - _filedir - fi -} -complete -F _compare $filenames compare - -_conjure() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-debug -help -list -log -monitor \ - -quiet -regard-warnings -seed -verbose \ - -version' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+debug' -- $cur ) ) - else - _filedir - fi -} -complete -F _conjure $filenames conjure - -_import() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-adjoin -annotate -border -channel \ - -colors -colorspace -comment -compress -crop -debug \ - -define -delay -density -depth -descend -display \ - -dispose -dither -encipher -encoding -endian -filter \ - -format -frame -geometry -gravity -help -identify \ - -interlace -interpolate -label -limit -list -log \ - -monitor -monochrome -negate -page -pause -pointsize \ - -quality -quantize -quiet -regard-warnings -repage \ - -resize -respect-parenthesis -rotate -sampling-factor \ - -scene -screen -seed -set -silent -snaps -strip \ - -thumbnail -transparent -transparent-color -treedepth \ - -trim -type -verbose -version -virtual-pixel \ - -window' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+debug' -- $cur ) ) - else - _filedir - fi -} -complete -F _import $filenames import - -_stream() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - _ImageMagick - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-authenticate -channel -colorspace \ - -compress -debug -define -density -depth -extract \ - -help -identify -interlace -interpolate -limit -list \ - -log -map -monitor -quantize -quiet -regard-warnings \ - -respect-parenthesis -sampling-factor -seed -set \ - -size -storage-type -transparent-color -verbose \ - -version -virtual-pixel' -- $cur ) ) - elif [[ "$cur" == +* ]]; then - COMPREPLY=( $( compgen -W '+debug' -- $cur ) ) - else - _filedir - fi -} -complete -F _stream $filenames stream -} - -# dd(1) completion -# -have dd && -_dd() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - case "$cur" in - if=*|of=*) - cur=${cur#*=} - _filedir - return 0 - ;; - conv=*) - cur=${cur#*=} - COMPREPLY=( $( compgen -W 'ascii ebcdic ibm block unblock \ - lcase notrunc ucase swab noerror sync' \ - -- $cur ) ) - return 0 - ;; - esac - - _expand || return 0 - - COMPREPLY=( $( compgen -W '--help --version' -- $cur ) \ - $( compgen -W 'bs cbs conv count ibs if obs of seek skip'\ - -S '=' -- $cur ) ) -} && -complete -F _dd $nospace $filenames dd - -# CUPS cancel(1) completion -# -have cancel && -_cancel() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - COMPREPLY=( $( lpstat | cut -d' ' -f1 | grep "^$cur" ) ) -} && -complete -F _cancel $filenames cancel - -# aspell(1) completion -# -have aspell && { -_aspell_dictionary() -{ - local datadir - datadir=/usr/lib/aspell - COMPREPLY=( $( command ls $datadir/*.@(multi|alias) ) ) - COMPREPLY=( ${COMPREPLY[@]%.@(multi|alias)} ) - COMPREPLY=( $( compgen -W '${COMPREPLY[@]#$datadir/}' -- $cur ) ) -} - -_aspell() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - # --name value style option - case "$prev" in - @(-c|-p|check)) - _filedir - return 0 - ;; - @(dump|create|merge)) - COMPREPLY=( $( compgen -W 'master personal repl' -- $cur ) ) - return 0 - ;; - -d) - _aspell_dictionary - return 0 - ;; - esac - - # --name=value style option - if [[ "$cur" == *=* ]]; then - prev=${cur/=*/} - cur=${cur/*=/} - case "$prev" in - --@(conf|personal|repl|per-conf)) - _filedir - return 0 - ;; - --@(conf-dir|data-dir|dict-dir|home-dir|local-data-dir|prefix)) - _filedir -d - return 0 - ;; - --master) - _aspell_dictionary - return 0 - ;; - --mode) - COMPREPLY=( $( compgen -W 'none url email sgml tex' -- $cur ) ) - return 0 - ;; - --sug-mode) - COMPREPLY=( $( compgen -W 'ultra fast normal bad-speller' -- $cur ) ) - return 0 - ;; - --keymapping) - COMPREPLY=( $( compgen -W 'aspell ispell' -- $cur ) ) - return 0 - ;; - esac - fi - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--conf= --conf-dir= --data-dir= --dict-dir= \ - --encoding= --add-filter= --rem-filter= --mode= -e \ - -H -t --add-extra-dicts= --rem-extra-dicts= \ - --home-dir= -W --ignore= --ignore-accents \ - --dont-ignore-accents --ignore-case --dont-ignore-case \ - --ignore-repl --dont-ignore-repl --jargon= --keyboard= \ - --lang= --language-tag= --local-data-dir= -d --master= \ - --module= --add-module-search-order= \ - --rem-module-search-order= --per-conf= -p --personal= \ - --prefix= --repl= -C -B --run-together --dont-run-together \ - --run-together-limit= --run-together-min= --save-repl \ - --dont-save-repl --set-prefix --dont-set-prefix --size= \ - --spelling= --strip-accents --dont-strip-accents \ - --sug-mode= --add-word-list-path= --rem-word-list-path= \ - -b -x --backup -b|-x --dont-backup --reverse --dont-reverse \ - --time --dont-time --keymapping= --add-email-quote= \ - --rem-email-quote= --email-margin= --add-tex-command= \ - --rem-tex-command= --tex-check-comments \ - --dont-tex-check-comments --add-tex-extension= \ - --rem-tex-extension= --add-sgml-check= --rem-sgml-check= \ - --add-sgml-extension= --rem-sgml-extension=' -- $cur ) ) - else - COMPREPLY=( $( compgen -W '-? help -c check -a pipe -l list \ - config config soundslike filter -v version dump \ - create merge' -- $cur ) ) - fi - -} -complete -F _aspell $filenames aspell -} - -# xmms(1) completion -# -have xmms && -_xmms() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-h --help -r --rew -p --play \ - -u --pause -s --stop -t --play-pause -f --fwd -e \ - --enqueue -m --show-main-window -i --sm-client-id \ - -v --version' -- $cur ) ) - else - _filedir '@(mp[23]|MP[23]|ogg|OGG|wav|WAV|pls|m3u|xm|mod|s[3t]m|it|mtm|ult|flac)' - - fi - -} && -complete -F _xmms $filenames xmms - -# info(1) completion -# -have info && -_info() -{ - local cur infopath - - COMPREPLY=() - cur=`_get_cword` - - _expand || return 0 - - # default completion if parameter contains / - if [[ "$cur" == */* ]]; then - _filedir - return 0 - fi - - infopath='/usr/share/info' - - if [ "${INFOPATH: -1:1}" == ':' ]; then - infopath=${INFOPATH}${infopath} - elif [ ${INFOPATH:+set} ]; then - infopath=$INFOPATH - fi - - infopath=$infopath: - if [ -n "$cur" ]; then - infopath="${infopath//://$cur* }" - else - infopath="${infopath//:// }" - fi - - # redirect stderr for when path doesn't exist - COMPREPLY=( $( eval command ls "$infopath" 2>/dev/null ) ) - # weed out directory path names and paths to info pages - COMPREPLY=( ${COMPREPLY[@]##*/?(:)} ) - # weed out info dir file - for (( i=0 ; i < ${#COMPREPLY[@]} ; ++i )); do - if [ "${COMPREPLY[$i]}" == 'dir' ]; then - unset COMPREPLY[$i]; - fi; - done - # strip suffix from info pages - COMPREPLY=( ${COMPREPLY[@]%.@(gz|bz2|lzma)} ) - COMPREPLY=( $( compgen -W '${COMPREPLY[@]%.*}' -- "${cur//\\\\/}" ) ) - - return 0 -} && -complete -F _info $filenames info - -# dhclient(1) completion -# -have dhclient && _dhclient() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(cf|lf|pf|sf)) - _filedir - return 0 - ;; - -s) - _known_hosts - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-p -d -q -1 -r -lf -pf \ - -cf -sf -s -g -n -nw -w' -- $cur ) ) - else - _available_interfaces - fi -} && -complete -F _dhclient dhclient - -# lvm(8) completion -# -have lvm && { -_volumegroups() -{ - COMPREPLY=( $(compgen -W "$( vgscan 2>/dev/null | \ - sed -n -e 's|.*Found.*"\(.*\)".*$|\1|p' )" -- $cur ) ) -} - -_physicalvolumes() -{ - COMPREPLY=( $(compgen -W "$( pvscan 2>/dev/null | \ - sed -n -e 's|^.*PV \(.*\) VG.*$|\1|p' )" -- $cur ) ) -} - -_logicalvolumes() -{ - COMPREPLY=( $(compgen -W "$( lvscan 2>/dev/null | \ - sed -n -e "s|^.*'\(.*\)'.*$|\1|p" )" -- $cur ) ) -} - -_units() -{ - COMPREPLY=( $( compgen -W 'h s b k m g t H K M G T' -- $cur ) ) -} - -_sizes() -{ - COMPREPLY=( $( compgen -W 'k K m M g G t T' -- $cur ) ) -} - -_args() -{ - args=0 - if [[ "${COMP_WORDS[0]}" == lvm ]]; then - offset=2 - else - offset=1 - fi - for (( i=$offset; i < COMP_CWORD; i++ )); do - if [[ "${COMP_WORDS[i]}" != -* ]]; then - args=$(($args + 1)) - fi - done -} - -_lvmdiskscan() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -h -? --help -l \ - --lvmpartition -v --verbose --version' -- $cur ) ) - fi -} -complete -F _lvmdiskscan lvmdiskscan - -_pvscan() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -e \ - --exported -n --novolumegroup -h -? \ - --help --ignorelockingfailure -P \ - --partial -s --short -u --uuid -v \ - --verbose --version' -- $cur ) ) - fi -} -complete -F _pvscan pvscan - -_pvs() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(o|O|-options|-sort)) - COMPREPLY=( $( compgen -W 'pv_fmt pv_uuid \ - pv_size pv_free pv_used pv_name \ - pv_attr pv_pe_count \ - pv_pe_alloc_count' -- $cur ) ) - return 0 - ;; - --units) - _units - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--aligned -a --all -d --debug \ - -h -? --help --ignorelockingfailure --noheadings \ - --nosuffix -o --options -O --sort \ - --separator --unbuffered --units \ - -v --verbose --version' -- $cur ) ) - else - _physicalvolumes - fi -} -complete -F _pvs pvs - -_pvdisplay() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - --units) - _units - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-c --colon -C --columns --units \ - -v --verbose -d --debug -h --help --version' -- $cur ) ) - else - _physicalvolumes - fi -} -complete -F _pvdisplay pvdisplay - -_pvchange() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|x|-autobackup|--allocatable)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-a --all -A --autobackup \ - -d --debug -h --help -t --test -u --uuid -x \ - --allocatable -v --verbose --addtag --deltag \ - --version' -- $cur ) ) - else - _physicalvolumes - fi -} -complete -F _pvchange pvchange - -_pvcreate() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - --restorefile) - _filedir - return 0 - ;; - -@(M|-metadatatype)) - COMPREPLY=( $( compgen -W '1 2' -- $cur ) ) - return 0 - ;; - --metadatacopies) - COMPREPLY=( $( compgen -W '0 1 2' -- $cur ) ) - return 0 - ;; - --@(metadatasize|setphysicalvolumesize)) - _sizes - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--restorefile -d --debug -f \ - --force -h -? --help --labelsector -M --metadatatype \ - --metadatacopies --metadatasize \ - --setphysicalvolumesize -t --test -u --uuid uuid -v \ - --verbose -y --yes --version' -- $cur ) ) - else - _physicalvolumes - fi -} -complete -F _pvcreate pvcreate - -_pvmove() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - -@(n|-name)) - _logicalvolumes - return 0 - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--abort -A --autobackup \ - -b --background -d --debug -f --force -h -? \ - --help -i --interval -t --test -v --verbose \ - --version -n --name' -- $cur ) ) - else - _physicalvolumes - fi -} -complete -F _pvmove pvmove - -_pvremove() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -f --force -h -? \ - --help -y --yes -t --test -v --verbose \ - --version' -- $cur ) ) - else - _physicalvolumes - fi -} -complete -F _pvremove pvremove - -_vgscan() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -h --help \ - --ignorelockingfailure --mknodes -P \ - --partial -v --verbose --version' -- $cur ) ) - fi -} -complete -F _vgscan vgscan - -_vgs() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(o|O|-options|-sort)) - COMPREPLY=( $( compgen -W 'vg_fmt vg_uuid vg_name \ - vg_attr vg_size vg_free vg_sysid \ - vg_extent_size vg_extent_count vg_free_count \ - max_lv max_pv pv_count lv_count snap_count \ - vg_seqno' -- $cur ) ) - return 0 - ;; - --units) - _units - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--aligned -d --debug \ - -h --help --ignorelockingfailure --noheadings \ - --nosuffix -o --options -O --sort -P --partial \ - --separator --unbuffered --units \ - -v --verbose --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgs vgs - -_vgdisplay() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - --units) - _units - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-c --colon -C --columns --units \ - -P --partial -A --activevolumegroups -v --verbose \ - -d --debug -h --help --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgdisplay vgdisplay - -_vgchange() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(a|A|x|-available|-autobackup|-resizeable)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup --alloc -P \ - --partial -d --debug -h --help --ignorelockingfailure \ - -t --test -u --uuid -v --verbose --version -a \ - --available -x --resizeable -l --logicalvolume \ - --addtag --deltag' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgchange vgchange - -_vgcreate() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - -@(M|-metadatatype)) - COMPREPLY=( $( compgen -W '1 2' -- $cur ) ) - return 0 - ;; - -@(s|-physicalextentsize)) - _sizes - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup --addtag \ - --alloc -d --debug -h --help -l --maxlogicalvolumes \ - -M --metadatatype -p --maxphysicalvolumes -s \ - --physicalextentsize -t --test -v --verbose \ - --version' -- $cur ) ) - else - _args - if [ $args -eq 0 ]; then - _volumegroups - else - _physicalvolumes - fi - fi -} -complete -F _vgcreate vgcreate - -_vgremove() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -h --help -t --test \ - -v --verbose --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgremove vgremove - -_vgrename() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup -d --debug -h \ - -? --help -t --test -v --verbose --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgrename vgrename - -_vgreduce() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-a --all -A --autobackup -d \ - --debug -h --help --removemissing -t --test -v \ - --verbose --version' -- $cur ) ) - - else - _args - if [ $args -eq 0 ]; then - _volumegroups - else - _physicalvolumes - fi - fi -} -complete -F _vgreduce vgreduce - -_vgextend() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - -@(L|-size)) - _sizes - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup -d --debug -h \ - -? --help -t --test -v --verbose --version' -- $cur ) ) - else - _args - if [ $args -eq 0 ]; then - _volumegroups - else - _physicalvolumes - fi - fi -} -complete -F _vgextend vgextend - -_vgport() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-a --all -d --debug -h \ - -? --help -v --verbose --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgport vgimport vgexport - -_vgck() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -h \ - -? --help -v --verbose --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgck vgck - -_vgconvert() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(M|-metadatatype)) - COMPREPLY=( $( compgen -W '1 2' -- $cur ) ) - return 0 - ;; - --metadatacopies) - COMPREPLY=( $( compgen -W '0 1 2' -- $cur ) ) - return 0 - ;; - --metadatasize) - _sizes - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -h --help --labelsector \ - -M --metadatatype --metadatacopies --metadatasize \ - -t --test -v --verbose --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgconvert vgconvert - -_vgcfgbackup() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(f|-file)) - _filedir - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -f --file -h --help \ - --ignorelockingfailure -P --partial -v --verbose \ - --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgcfgbackup vgcfgbackup - -_vgcfgrestore() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(f|-file)) - _filedir - return 0 - ;; - -@(M|-metadatatype)) - COMPREPLY=( $( compgen -W '1 2' -- $cur ) ) - return 0 - ;; - -@(n|-name)) - _volumegroups - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -f --file -l --list \ - -h --help -M --Metadatatype -n --name -t --test \ - -v --verbose --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgcfgrestore vgcfgrestore - -_vgmerge() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup -d --debug \ - -h --help -l --list -t --test -v --verbose \ - --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgmerge vgmerge - -_vgsplit() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - -@(M|-metadatatype)) - COMPREPLY=( $( compgen -W '1 2' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup -d --debug \ - -h --help -l --list -M --metadatatype -t --test \ - -v --verbose --version' -- $cur ) ) - else - _args - if [ $args -eq 0 -o $args -eq 1 ]; then - _volumegroups - else - _physicalvolumes - fi - fi -} -complete -F _vgsplit vgsplit - -_vgmknodes() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-d --debug -h --help -v --verbose \ - --version' -- $cur ) ) - else - _volumegroups - fi -} -complete -F _vgmknodes vgmknodes - -_lvscan() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-b --blockdevice -d --debug \ - -h -? --help --ignorelockingfailure -P \ - --partial -v --verbose --version' -- $cur ) ) - fi -} -complete -F _lvscan lvscan - -_lvs() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(o|O|-options|-sort)) - COMPREPLY=( $( compgen -W 'lv_uuid lv_name \ - lv_attr lv_minor lv_size seg_count \ - origin snap_percent segtype stripes \ - stripesize chunksize seg_start \ - seg_size' -- $cur ) ) - return 0 - ;; - --units) - _units - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--aligned -d --debug \ - -h --help --ignorelockingfailure --noheadings \ - --nosuffix -o --options -O --sort -P --partial \ - --segments --separator --unbuffered --units \ - -v --verbose --version' -- $cur ) ) - else - _logicalvolumes - fi -} -complete -F _lvs lvs - -_lvdisplay() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - --units) - _units - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-c --colon -C --columns --units \ - -P --partial -m --maps -v --verbose -d --debug -h \ - --help --version' -- $cur ) ) - else - _logicalvolumes - fi -} -complete -F _lvdisplay lvdisplay - -_lvchange() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(a|A|C|M|-available|-autobackup|-continguous|-persistent)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - -@(p|-permission)) - COMPREPLY=( $( compgen -W 'r rw' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup -a --available \ - --addtag --alloc -C --contiguous -d --debug --deltag \ - -f --force -h --help --ignorelockingfailure -M \ - --persistent --major major --minor minor -P --partial \ - -p --permission -r --readahead --refresh -t --test \ - -v --verbose --version' -- $cur ) ) - else - _logicalvolumes - fi -} -complete -F _lvchange lvchange - -_lvcreate() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|C|M|Z|-autobackup|-continguous|-persistent|-zero)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - -@(L|-size)) - _sizes - return 0 - ;; - -@(p|-permission)) - COMPREPLY=( $( compgen -W 'r rw' -- $cur ) ) - return 0 - ;; - -@(n|-name)) - _logicalvolumes - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup --addtag --alloc \ - -C --contiguous -d --debug -h -? --help -i --stripes \ - -I --stripesize -l --extents -L --size -M --persistent \ - --major --minor -n --name -p --permission -r \ - --readahead -t --test --type -v --verbose -Z --zero \ - --version' -- $cur ) ) - else - _args - if [ $args -eq 0 ]; then - _volumegroups - else - _physicalvolumes - fi - fi -} -complete -F _lvcreate lvcreate - -_lvremove() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup -d --debug -f \ - --force -h -? --help -t --test -v --verbose \ - --version' -- $cur ) ) - else - _logicalvolumes - fi -} -complete -F _lvremove lvremove - -_lvrename() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup -d --debug -h \ - -? --help -t --test -v --verbose --version' -- $cur ) ) - else - _logicalvolumes - fi -} -complete -F _lvrename lvrename - -_lvreduce() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - -@(L|-size)) - _sizes - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup -d \ - --debug -f --force -h --help -l --extents \ - -L --size -n --nofsck -r --resizefs -t --test \ - -v --verbose --version' -- $cur ) ) - else - _logicalvolumes - fi -} -complete -F _lvreduce lvreduce - -_lvresize() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - -@(L|-size)) - _sizes - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup --alloc -d \ - --debug -h --help -i --stripes -I --stripesize \ - -l --extents -L --size -n --nofsck -r --resizefs \ - -t --test --type -v --verbose --version' -- $cur ) ) - else - _args - if [ $args -eq 0 ]; then - _logicalvolumes - else - _physicalvolumes - fi - fi -} -complete -F _lvresize lvresize - -_lvextend() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -@(A|-autobackup)) - COMPREPLY=( $( compgen -W 'y n' -- $cur ) ) - return 0 - ;; - -@(L|-size)) - _sizes - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-A --autobackup --alloc -d \ - --debug -h --help -i --stripes -I --stripesize \ - -l --extents -L --size -n --nofsck -r --resizefs \ - -t --test --type -v --verbose --version' -- $cur ) ) - else - _args - if [ $args -eq 0 ]; then - _logicalvolumes - else - _physicalvolumes - fi - fi -} -complete -F _lvextend lvextend - -_lvm() -{ - local prev - - COMPREPLY=() - cur=`_get_cword` - - if [ $COMP_CWORD -eq 1 ]; then - COMPREPLY=( $( compgen -W 'dumpconfig help lvchange \ - lvcreate lvdisplay lvextend lvmchange \ - lvmdiskscan lvmsadc lvmsar lvreduce \ - lvremove lvrename lvresize lvs lvscan \ - pvchange pvcreate pvdata pvdisplay pvmove \ - pvremove pvresize pvs pvscan vgcfgbackup \ - vgcfgrestore vgchange vgck vgconvert \ - vgcreate vgdisplay vgexport vgextend \ - vgimport vgmerge vgmknodes vgreduce \ - vgremove vgrename vgs vgscan vgsplit \ - version' -- $cur ) ) - else - case ${COMP_WORDS[1]} in - pvchange) - _pvchange - ;; - pvcreate) - _pvcreate - ;; - pvdisplay) - _pvdisplay - ;; - pvmove) - _pvmove - ;; - pvremove) - _pvremove - ;; - pvresize) - _pvresize - ;; - pvs) - _pvs - ;; - pvscan) - _pvscan - ;; - vgcfgbackup) - _vgcfgbackup - ;; - vgcfgrestore) - _vgcfgrestore - ;; - vgchange) - _vgchange - ;; - vgck) - _vgck - ;; - vgconvert) - _vgconvert - ;; - vgcreate) - _vgcreate - ;; - vgdisplay) - _vgdisplay - ;; - vgexport) - _vgexport - ;; - vgextend) - _vgextend - ;; - vgimport) - _vgimport - ;; - vgmerge) - _vgmerge - ;; - vgmknodes) - _vgmknodes - ;; - vgreduce) - _vgreduce - ;; - vgremove) - _vgremove - ;; - vgrename) - _vgrename - ;; - vgs) - _vgs - ;; - vgscan) - _vgscan - ;; - vgsplit) - _vgsplit - ;; - lvchange) - _lvchange - ;; - lvcreate) - _lvcreate - ;; - lvdisplay) - _lvdisplay - ;; - lvextend) - _lvextend - ;; - lvreduce) - _lvreduce - ;; - lvremove) - _lvremove - ;; - lvrename) - _lvrename - ;; - lvresize) - _lvresize - ;; - lvs) - _lvs - ;; - lvscan) - _lvscan - ;; - esac - fi -} -complete -F _lvm lvm -} - -# mkinitrd(8) completion -# -have mkinitrd && -_mkinitrd() -{ - local cur args - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - # --name value style option - case "$prev" in - --preload) - _modules - return 0 - ;; - esac - - # --name=value style option - if [[ "$cur" == *=* ]]; then - prev=${cur/=*/} - cur=${cur/*=/} - case "$prev" in - --@(with|builtin)) - _modules - return 0 - ;; - --@(fstab|dsdt)) - _filedir - return 0 - ;; - --tmpdir) - _filedir -d - return 0 - ;; - esac - fi - - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '--version -v -f --preload \ - --with= --omit-scsi-modules --omit-raid-modules \ - --images-version --fstab= --nocompress --builtin= \ - --nopivot --noudev --allow-missing --tmpdir= \ - --initrdfs= --dsdt= --lvm-version= --froce-usb' \ - -- $cur ) ) - else - _count_args - - case $args in - 1) - _filedir - ;; - 2) - COMPREPLY=( $( command ls /lib/modules | grep "^$cur" ) ) - ;; - esac - fi - -} && -complete -F _mkinitrd mkinitrd - -# pkgconfig(1) completion -# -have pkg-config && -_pkg_config() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - # return list of available options - COMPREPLY=( $( compgen -W '-version --modversion \ - --atleast-pkgconfig-version= --libs --libs-only-l \ - --libs-only-other --libs-only-L --cflags \ - --cflags-only-I --cflags-only-other --variable= \ - --define-variable= --exists --uninstalled \ - --atleast-version= --exact-version= --max-version= \ - --list-all --debug --print-errors --silence-errors \ - --errors-to-stdout -? --help --usage' -- $cur)) - else - COMPREPLY=( $( pkg-config --list-all 2>/dev/null | \ - awk '{print $1}' | grep "^$cur" ) ) - fi + if [ $COMP_CWORD = 1 ]; then + COMPREPLY=( $( compgen -W '$(look "$cur" 2>/dev/null)' ) ) + fi } && -complete -F _pkg_config pkg-config - - -# cpio(1) completion -# -have cpio && { -_cpio_format() -{ - COMPREPLY=( $( compgen -W 'bin odc newc crc tar ustar hpbin hpodc' -- $cur ) ) -} - -_cpio() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - # --name value style option - case $prev in - -H) - _cpio_format - return 0 - ;; - -@(E|F|I)) - _filedir - return 0 - ;; - -R) - _usergroup - return 0 - ;; - esac - - # --name=value style option - if [[ "$cur" == *=* ]]; then - prev=${cur/=*/} - cur=${cur/*=/} - case $prev in - --format) - _cpio_format - return 0 - ;; - --@(file|pattern-file)) - _filedir - return 0 - ;; - --owner) - _usergroup - return 0 - ;; - --rsh-command) - COMPREPLY=( $( compgen -c -- $cur ) ) - return 0 - ;; - esac - fi - - if [ $COMP_CWORD -eq 1 ]; then - COMPREPLY=( $( compgen -W '-o --create -i --extract -p --pass-through' -- $cur) ) - else - case ${COMP_WORDS[1]} in - -@(o|-create)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-0 -a -c -v -A -B\ - -L -V -C -H -M -O -F --file= --format=\ - --message= --null --reset-access-time\ - --verbose --dot --append --block-size=\ - --dereference --io-size= --quiet\ - --force-local --rsh-command= --help\ - --version' -- $cur ) ) - fi - ;; - -@(i|-extract)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-b -c -d -f -m -n -r\ - -t -s -u -v -B -S -V -C -E -H -M -R -I\ - -F --file= --make-directories\ - --nonmatching\ - --preserve-modification-time\ - --numeric-uid-gid --rename -t --list\ - --swap-bytes --swap --dot\ - --unconditional --verbose --block-size=\ - --swap-halfwords --io-size=\ - --pattern-file= --format= --owner=\ - --no-preserve-owner --message=\ - --force-local --no-absolute-filenames\ - --sparse --only-verify-crc --quiet\ - --rsh-command= --help\ - --version' -- $cur ) ) - fi - ;; - -@(p|-pass-through)) - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-0 -a -d -l -m -u -v\ - -L -V -R --null --reset-access-time\ - --make-directories --link --quiet\ - --preserve-modification-time\ - --unconditional --verbose --dot\ - --dereference --owner=\ - --no-preserve-owner --sparse --help\ - --version' -- $cur ) ) - else - _filedir -d - fi - ;; - esac - fi -} -complete -F _cpio cpio -} +complete -F _look $default look # id(1) completion # have id && _id() { - local cur - - COMPREPLY=() - cur=`_get_cword` - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-a -g --group -G --groups -n --name\ - -r --real -u --user --help --version' -- $cur ) ) - else - COMPREPLY=( $( compgen -u $cur ) ) - fi -} && -complete -F _id id - -# getent(1) completion -# -have getent && -_getent() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case $prev in - passwd) - COMPREPLY=( $( compgen -u $cur ) ) - return 0 - ;; - group) - COMPREPLY=( $( compgen -g $cur ) ) - return 0 - ;; - services) - COMPREPLY=( $( compgen -s $cur ) ) - return 0 - ;; - hosts) - COMPREPLY=( $( compgen -A hostname $cur ) ) - return 0 - ;; - protocols|networks|ahosts|ahostsv4|ahostsv6|rpc) - COMPREPLY=( $( getent $prev | \ - sed -ne 's|^\('$cur'[^[:space:]]*\).*|\1|p' ) ) - return 0 - ;; - aliases|shadow) - COMPREPLY=( $( getent $prev | \ - sed -ne 's|^\('$cur'[^:]*\).*|\1|p' ) ) - return 0 - ;; - esac - - - if [ $COMP_CWORD -eq 1 ]; then - COMPREPLY=( $( compgen -W 'passwd group hosts services \ - protocols networks ahosts ahostsv4 \ - ahostsv6 aliases ethers netgroup \ - rpc shadow' -- $cur ) ) - fi -} && -complete -F _getent getent - -# ntpdate(1) completion -# -have ntpdate && -_ntpdate() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case $prev in - -k) - _filedir - return 0 - ;; - -U) - COMPREPLY=( $( compgen -u $cur ) ) - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-4 -6 -b -B -d -Q -q -s -u -v -a\ - -e -k -p -o -r -t' -- $cur ) ) - else - _known_hosts - fi -} && -complete -F _ntpdate ntpdate - -# smartctl(8) completion -# -have smartctl && { -_smartctl_quietmode() -{ - COMPREPLY=( $( compgen -W 'errorsonly silent' -- $cur ) ) -} -_smartctl_device() -{ - COMPREPLY=( $( compgen -W 'ata scsi 3ware' -- $cur ) ) -} -_smartctl_tolerance() -{ - COMPREPLY=( $( compgen -W 'warn exit ignore' -- $cur ) ) -} -_smartctl_badsum() -{ - COMPREPLY=( $( compgen -W 'normal conservative permissive verypermissive' -- $cur ) ) -} -_smartctl_report() -{ - COMPREPLY=( $( compgen -W 'ioctl ataioctl scsiioctl' -- $cur ) ) -} -_smartctl_feature() -{ - COMPREPLY=( $( compgen -W 'on off' -- $cur ) ) -} -_smartctl_log() -{ - COMPREPLY=( $( compgen -W 'error selftest selective directory' -- $cur ) ) -} -_smartctl_vendorattribute() -{ - COMPREPLY=( $( compgen -W 'help 9,minutes 9,seconds 9,halfminutes \ - 9,temp 192,emergencyretractcyclect 193,loadunload \ - 194,10xCelsius 194,unknown 198,offlinescanuncsectorct \ - 200,writeerrorcount 201,detectedtacount 220,temp' -- $cur ) ) -} -_smartctl_firmwarebug() -{ - COMPREPLY=( $( compgen -W 'none samsung samsung2' -- $cur ) ) -} -_smartctl_presets() -{ - COMPREPLY=( $( compgen -W 'use ignore show showall' -- $cur ) ) -} -_smartctl_test() -{ - COMPREPLY=( $( compgen -W 'offline short long conveyance select afterselect,on afterselect,off pending' -- $cur ) ) -} - -_smartctl() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - # --name value style option - case "$prev" in - -q) - _smartctl_quietmode - ;; - -d) - _smartctl_device - return 0 - ;; - -t) - _smartctl_tolerance - return 0 - ;; - -b) - _smartctl_badsum - return 0 - ;; - -r) - _smartctl_report - return 0 - ;; - -s) - _smartctl_feature - return 0 - ;; - -o) - _smartctl_feature - return 0 - ;; - -S) - _smartctl_feature - return 0 - ;; - -l) - _smartctl_log - return 0 - ;; - -v) - _smartctl_vendorattribute - return 0 - ;; - -F) - _smartctl_firmwarebug - return 0 - ;; - -P) - _smartctl_presets - return 0 - ;; - -t) - _smartctl_test - return 0 - ;; - esac - - # --name=value style option - if [[ "$cur" == *=* ]]; then - prev=${cur/=*/} - cur=${cur/*=/} - case "$prev" in - --quietmode) - _smartctl_quietmode - return 0 - ;; - --device) - _smartctl_device - return 0 - ;; - --tolerance) - _smartctl_tolerance - return 0 - ;; - --badsum) - _smartctl_badsum - return 0 - ;; - --report) - _smartctl_report - return 0 - ;; - --smart) - _smartctl_feature - return 0 - ;; - --offlineauto) - _smartctl_feature - return 0 - ;; - --saveauto) - _smartctl_feature - return 0 - ;; - --log) - _smartctl_log - return 0 - ;; - --vendorattribute) - _smartctl_vendorattribute - return 0 - ;; - --firmwarebug) - _smartctl_firmwarebug - return 0 - ;; - --presets) - _smartctl_presets - return 0 - ;; - --test) - _smartctl_test - return 0 - ;; - esac - fi - - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-h --help --usage -V --version \ - --copyright --license-i --info -a --all -q \ - --quietmode= -d --device= -T --tolerance= -b --badsum= \ - -r --report= -s --smart= -o --offlineauto= -S \ - --saveauto= -H --health -c --capabilities -A \ - --attributes -l --log= -v --vendorattribute= -F \ - --firmwarebug= -P --presets= -t --test= -C \ - --captive -X --abort' -- $cur ) ) - else - cur=${cur:=/dev/} - _filedir - fi -} -complete -F _smartctl smartctl -} - -# sysctl(8) completion -# -have sysctl && -_sysctl() -{ - local cur - - COMPREPLY=() - cur=`_get_cword` - - COMPREPLY=( $( compgen -W "$(sysctl -N -a 2>/dev/null)" -- $cur ) ) - - return 0 -} && -complete -F _sysctl sysctl - -# update-rc.d(8) completion -# -# Copyright (C) 2004 Servilio Afre Puentes <servilio@gmail.com> -# -have update-rc.d && -_update_rc_d() -{ - local cur prev sysvdir services options valid_options + local cur + COMPREPLY=() cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d \ - || sysvdir=/etc/init.d - - services=( $(echo $sysvdir/!(README*|*.sh|*.dpkg*|*.rpm@(orig|new|save))) ) - services=( ${services[@]#$sysvdir/} ) - options=( -f -n ) - - if [[ $COMP_CWORD -eq 1 || "$prev" == -* ]]; then - valid_options=( $( \ - echo "${COMP_WORDS[@]} ${options[@]}" \ - | tr " " "\n" \ - | sed -ne "/$( echo "${options[@]}" | sed "s/ /\\|/g" )/p" \ - | sort | uniq -u \ - ) ) - COMPREPLY=( $( compgen -W '${options[@]} ${services[@]}' \ - -X '$( echo ${COMP_WORDS[@]} | tr " " "|" )' -- $cur ) ) - elif [[ "$prev" == ?($( echo ${services[@]} | tr " " "|" )) ]]; then - COMPREPLY=( $( compgen -W 'remove defaults start stop' -- $cur ) ) - elif [[ "$prev" == defaults && "$cur" == [0-9] ]]; then - COMPREPLY=( 0 1 2 3 4 5 6 7 8 9 ) - elif [[ "$prev" == defaults && "$cur" == [sk]?([0-9]) ]]; then - COMPREPLY=( 0 1 2 3 4 5 6 7 8 9 ) - elif [[ "$prev" == defaults && -z "$cur" ]]; then - COMPREPLY=( 0 1 2 3 4 5 6 7 8 9 s k ) - elif [[ "$prev" == ?(start|stop) ]]; then - if [[ "$cur" == [0-9] || -z "$cur" ]]; then - COMPREPLY=( 0 1 2 3 4 5 6 7 8 9 ) - elif [[ "$cur" == [0-9][0-9] ]]; then - COMPREPLY=( $cur ) - else - COMPREPLY=() - fi - elif [[ "$prev" == ?([0-9][0-9]|[0-6S]) ]]; then - if [[ -z "$cur" ]]; then - if [[ $prev == [0-9][0-9] ]]; then - COMPREPLY=( 0 1 2 3 4 5 6 S ) - else - COMPREPLY=( 0 1 2 3 4 5 6 S . ) - fi - elif [[ "$cur" == [0-6S.] ]]; then - COMPREPLY=( $cur ) - else - COMPREPLY=() - fi - elif [[ "$prev" == "." ]]; then - COMPREPLY=( $(compgen -W "start stop" -- $cur) ) + if [[ "$cur" == -* ]]; then + COMPREPLY=( $( compgen -W '-a -g --group -G --groups -n --name\ + -r --real -u --user --help --version' -- "$cur" ) ) else - COMPREPLY=() + COMPREPLY=( $( compgen -u "$cur" ) ) fi - - return 0 } && -complete -F _update_rc_d update-rc.d +complete -F _id id -# invoke-rc.d(8) completion -# -# Copyright (C) 2004 Servilio Afre Puentes <servilio@gmail.com> -# -have invoke-rc.d && -_invoke_rc_d() +_filedir_xspec() { - local cur prev sysvdir services options valid_options + local IFS cur xspec + IFS=$'\t\n' + COMPREPLY=() cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d \ - || sysvdir=/etc/init.d - - services=( $(echo $sysvdir/!(README*|*.sh|*.dpkg*|*.rpm@(orig|new|save))) ) - services=( ${services[@]#$sysvdir/} ) - options=( --help --quiet --force --try-anyway --disclose-deny --query --no-fallback ) - - if [[ ($COMP_CWORD -eq 1) || ("$prev" == --* ) ]]; then - valid_options=( $( \ - echo ${COMP_WORDS[@]} ${options[@]} \ - | tr " " "\n" \ - | sed -ne "/$( echo ${options[@]} | sed "s/ /\\\\|/g" )/p" \ - | sort | uniq -u \ - ) ) - COMPREPLY=( $( compgen -W '${valid_options[@]} ${services[@]}' -- \ - $cur ) ) - elif [ -x $sysvdir/$prev ]; then - COMPREPLY=( $( compgen -W '`sed -ne "y/|/ /; \ - s/^.*Usage:[ ]*[^ ]*[ ]*{*\([^}\"]*\).*$/\1/p" \ - $sysvdir/$prev`' -- \ - $cur ) ) - else - COMPREPLY=() - fi - return 0 -} && -complete -F _invoke_rc_d invoke-rc.d - -# minicom(1) completion -# -have minicom && -_minicom() -{ - local cur prev - - COMPREPLY=() - cur=`_get_cword` - prev=${COMP_WORDS[COMP_CWORD-1]} - - case $prev in - -@(a|c)) - COMPREPLY=( $( compgen -W 'on off' -- $cur ) ) - return 0 - ;; - -@(S|C)) - _filedir - return 0 - ;; - -P) - COMPREPLY=( $( command ls /dev/tty* ) ) - COMPREPLY=( $( compgen -W '${COMPREPLY[@]} ${COMPREPLY[@]#/dev/}' -- $cur ) ) - return 0 - ;; - esac - - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '-s -o -m -M -z -l -L -w -a -t \ - -c -S -d -p -C -T -8' -- $cur ) ) - else - COMPREPLY=( $( command ls /etc/minicom/minirc.* 2>/dev/null | sed -e 's|/etc/minicom/minirc.||' | grep "^$cur" ) ) - fi -} && -complete -F _minicom minicom - -have rrdtool && -_rrdtool () -{ - cur=`_get_cword` - COMPREPLY=( $( compgen -W 'create update updatev graph dump \ - restore last lastupdate first info \ - fetch tune resize xport' -- $cur ) ) -} && -complete -F _rrdtool rrdtool - -_filedir_xspec() -{ - local IFS cur xspec - - IFS=$'\t\n' - COMPREPLY=() - cur=`_get_cword` - - _expand || return 0 - - # get first exclusion compspec that matches this command - xspec=$( sed -ne $'/^complete .*[ \t]'${1##*/}$'\([ \t]\|$\)/{p;q;}' \ - $BASH_COMPLETION ) - # prune to leave nothing but the -X spec - xspec=${xspec#*-X } - xspec=${xspec%% *} - - local -a toks - local tmp - - toks=( ${toks[@]-} $( - compgen -d -- "$(quote_readline "$cur")" | { - while read -r tmp; do - # see long TODO comment in _filedir() --David - echo $tmp - done - } - )) - - toks=( ${toks[@]-} $( - eval compgen -f -X "$xspec" -- "\$(quote_readline "\$cur")" | { - while read -r tmp; do - [ -n $tmp ] && echo $tmp - done - } - )) - - COMPREPLY=( "${toks[@]}" ) -} -list=( $( sed -ne '/^# START exclude/,/^# FINISH exclude/p' \ - $BASH_COMPLETION | \ - # read exclusion compspecs - ( - while read line - do - # ignore compspecs that are commented out - if [ "${line#\#}" != "$line" ]; then continue; fi - line=${line%# START exclude*} - line=${line%# FINISH exclude*} - line=${line##*\'} - list=( "${list[@]}" $line ) - done - echo "${list[@]}" - ) - ) ) + _expand || return 0 + + # get first exclusion compspec that matches this command + xspec=$( sed -ne $'/^complete .*[ \t]'${1##*/}$'\([ \t]\|$\)/{p;q;}' \ + $BASH_COMPLETION ) + # prune to leave nothing but the -X spec + xspec=${xspec#*-X } + xspec=${xspec%% *} + + local -a toks + local tmp + + toks=( ${toks[@]-} $( + compgen -d -- "$(quote_readline "$cur")" | { + while read -r tmp; do + # see long TODO comment in _filedir() --David + echo $tmp + done + } + )) + + toks=( ${toks[@]-} $( + eval compgen -f -X "$xspec" -- "\$(quote_readline "\$cur")" | { + while read -r tmp; do + [ -n $tmp ] && echo $tmp + done + } + )) + + COMPREPLY=( "${toks[@]}" ) +} +list=( $( sed -ne '/^# START exclude/,/^# FINISH exclude/p' $BASH_COMPLETION | \ + # read exclusion compspecs + ( + while read line + do + # ignore compspecs that are commented out + if [ "${line#\#}" != "$line" ]; then continue; fi + line=${line%# START exclude*} + line=${line%# FINISH exclude*} + line=${line##*\'} + list=( "${list[@]}" $line ) + done + echo "${list[@]}" + ) + ) ) # remove previous compspecs if [ ${#list[@]} -gt 0 ]; then eval complete -r ${list[@]} @@ -9320,21 +1631,37 @@ fi unset list # source completion directory definitions +if [ -d $BASH_COMPLETION_COMPAT_DIR -a -r $BASH_COMPLETION_COMPAT_DIR -a \ + -x $BASH_COMPLETION_COMPAT_DIR ]; then + for i in $BASH_COMPLETION_COMPAT_DIR/*; do + [[ ${i##*/} != @(*~|*.bak|*.swp|\#*\#|*.dpkg*|*.rpm@(orig|new|save)) ]] && + [ \( -f $i -o -h $i \) -a -r $i ] && . $i + done +fi if [ -d $BASH_COMPLETION_DIR -a -r $BASH_COMPLETION_DIR -a \ - -x $BASH_COMPLETION_DIR ]; then - for i in $BASH_COMPLETION_DIR/*; do - [[ ${i##*/} != @(*~|*.bak|*.swp|\#*\#|*.dpkg*|*.rpm@(orig|new|save)) ]] && - [ \( -f $i -o -h $i \) -a -r $i ] && . $i - done + $BASH_COMPLETION_DIR != $BASH_COMPLETION_COMPAT_DIR -a \ + -x $BASH_COMPLETION_DIR ]; then + for i in $BASH_COMPLETION_DIR/*; do + [[ ${i##*/} != @(*~|*.bak|*.swp|\#*\#|*.dpkg*|*.rpm@(orig|new|save)) ]] && + [ \( -f $i -o -h $i \) -a -r $i ] && . $i + done fi unset i # source user completion file [ $BASH_COMPLETION != ~/.bash_completion -a -r ~/.bash_completion ] \ - && . ~/.bash_completion + && . ~/.bash_completion unset -f have -unset UNAME RELEASE default dirnames filenames have nospace bashdefault \ - plusdirs +unset UNAME USERLAND default dirnames filenames have nospace bashdefault \ + plusdirs compopt set $BASH_COMPLETION_ORIGINAL_V_VALUE unset BASH_COMPLETION_ORIGINAL_V_VALUE + +# 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 |