2009-01-14 22:17:14 +02:00
#
2010-01-24 21:06:42 +02:00
# bash_completion - programmable completion functions for bash 3.2+
2000-08-08 22:17:29 +00:00
#
2008-06-21 22:37:16 +02:00
# Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
2010-01-14 19:33:21 +02:00
# © 2009-2010, Bash Completion Maintainers
2009-01-29 21:34:57 +01:00
# <bash-completion-devel@lists.alioth.debian.org>
2000-08-08 22:17:29 +00:00
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
2003-10-20 19:05:20 +00:00
#
# The latest version of this software can be obtained here:
#
2008-06-21 22:37:16 +02:00
# http://bash-completion.alioth.debian.org/
2003-10-20 19:05:20 +00:00
#
2009-10-22 11:17:10 +03:00
# RELEASE: 2.x
2002-01-05 20:04:01 +00:00
2008-06-23 12:03:06 +02:00
if [ [ $- = = *v* ] ] ; then
2009-10-04 19:42:50 +02:00
BASH_COMPLETION_ORIGINAL_V_VALUE = "-v"
2008-06-23 12:03:06 +02:00
else
2009-10-04 19:42:50 +02:00
BASH_COMPLETION_ORIGINAL_V_VALUE = "+v"
2008-06-23 12:03:06 +02:00
fi
if [ [ -n $BASH_COMPLETION_DEBUG ] ] ; then
2009-10-04 19:42:50 +02:00
set -v
2008-06-23 12:03:06 +02:00
else
2009-10-04 19:42:50 +02:00
set +v
2008-06-23 12:03:06 +02:00
fi
2002-01-29 20:33:49 +00:00
2005-07-07 23:47:14 +00:00
# Alter the following to reflect the location of this file.
#
2008-09-27 12:28:09 +02:00
[ -n " $BASH_COMPLETION " ] || BASH_COMPLETION = /etc/bash_completion
[ -n " $BASH_COMPLETION_DIR " ] || BASH_COMPLETION_DIR = /etc/bash_completion.d
2009-02-20 22:58:01 +01:00
[ -n " $BASH_COMPLETION_COMPAT_DIR " ] || BASH_COMPLETION_COMPAT_DIR = /etc/bash_completion.d
readonly BASH_COMPLETION BASH_COMPLETION_DIR BASH_COMPLETION_COMPAT_DIR
2002-01-29 20:33:49 +00:00
2001-07-08 23:14:13 +00:00
# Set a couple of useful vars
#
2002-04-22 05:59:08 +00:00
UNAME = $( uname -s )
2004-03-30 19:02:46 +00:00
# strip OS type and version under Cygwin (e.g. CYGWIN_NT-5.1 => Cygwin)
UNAME = ${ UNAME /CYGWIN_*/Cygwin }
2003-10-07 06:02:00 +00:00
2009-05-20 22:08:53 +02:00
case ${ UNAME } in
2009-10-04 19:42:50 +02:00
Linux| GNU| GNU/*) USERLAND = GNU ; ;
*) USERLAND = ${ UNAME } ; ;
2009-05-20 22:08:53 +02:00
esac
2000-08-29 00:41:27 +00:00
# Turn on extended globbing and programmable completion
shopt -s extglob progcomp
2000-08-08 22:17:29 +00:00
# A lot of the following one-liners were taken directly from the
# completion examples provided with the bash 2.04 source distribution
2000-10-19 15:25:36 +00:00
# Make directory commands see only directories
mkdir and rmdir now bound to _longopt(), default to dirnames
a2ps, autoconf, automake, bc, gprof, ld, nm, objcopy, objdump, readelf, strip,
bison, cpio, diff, patch, enscript, cp, df, dir, du, ln, ls, mkfifo, mknod,
mv, rm, touch, vdir, xargs, awk, gperf, grep, gpg, grub, indent, less, m4,
sed, shar, date, env, seq, su, tee, uname, who, texindex, cat, csplit, cut,
expand, fmt, fold, head, md5sum, nl, od, paste, pr, ptx, sha1sum, sort,
split, tac, tail, tr, unexpand, uniq, wc, units and rsync now all have
GNU long option completion from _longopt()
gpc completion added into _gcc()
cat, less, more, ln and strip no longer bound to _filedir()
2002-02-18 08:26:34 +00:00
complete -d pushd
2000-10-19 15:25:36 +00:00
2002-03-02 00:13:23 +00:00
# The following section lists completions that are redefined later
# Do NOT break these over multiple lines.
#
2001-12-20 07:52:12 +00:00
# START exclude -- do NOT remove this line
2009-08-18 11:45:47 +03:00
# bzcmp, bzdiff, bz*grep, bzless, bzmore intentionally not here, see Debian: #455510
2010-01-18 19:21:08 +02:00
complete -f -X '!*.?(t)bz?(2)' bunzip2 bzcat pbunzip2 pbzcat
2010-03-30 22:15:20 +03:00
complete -f -X '!*.@(zip|ZIP|[ejw]ar|[EJW]AR|exe|EXE|pk3|wsz|zargo|xpi|sxw|ott|od[fgpst]|epub)' unzip zipinfo
2002-02-06 04:02:46 +00:00
complete -f -X '*.Z' compress znew
2009-08-18 11:31:39 +03:00
# zcmp, zdiff, z*grep, zless, zmore intentionally not here, see Debian: #455510
2010-03-30 22:15:20 +03:00
complete -f -X '!*.@(Z|[gGd]z|t[ag]z)' gunzip zcat unpigz
2001-12-20 07:52:12 +00:00
complete -f -X '!*.Z' uncompress
2009-08-18 11:15:01 +03:00
# lzcmp, lzdiff intentionally not here, see Debian: #455510
complete -f -X '!*.lzma' lzcat lzegrep lzfgrep lzgrep lzless lzmore unlzma
2009-07-30 18:35:58 +03:00
complete -f -X '!*.@(xz|lzma)' unxz xzcat
2008-05-11 18:35:16 +02:00
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
2002-07-12 07:21:06 +00:00
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
2004-09-30 07:48:57 +00:00
complete -f -X '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))' gv ggv kghostview
2002-02-06 16:05:12 +00:00
complete -f -X '!*.@(dvi|DVI)?(.@(gz|Z|bz2))' xdvi
2008-05-01 22:22:11 +02:00
complete -f -X '!*.@(dvi|DVI)?(.@(gz|Z|bz2))' kdvi
2008-05-01 22:59:32 +02:00
complete -f -X '!*.@(dvi|DVI)' dvips dviselect dvitype dvipdf advi dvipdfm dvipdfmx
2008-05-01 22:22:11 +02:00
complete -f -X '!*.@(pdf|PDF)' acroread gpdf xpdf
complete -f -X '!*.@(?(e)ps|?(E)PS|pdf|PDF)' kpdf
2009-12-11 17:49:23 +01:00
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|fdf|FDF)' evince
2009-12-28 23:50:24 +02:00
complete -f -X '!*.@(okular|@(?(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|fdf|FDF)?(.?(gz|GZ|bz2|BZ2)))' okular
2009-02-26 23:20:39 +02:00
complete -f -X '!*.@(?(e)ps|?(E)PS|pdf|PDF)' ps2pdf ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr
2002-12-04 04:02:12 +00:00
complete -f -X '!*.texi*' makeinfo texi2html
2010-02-01 15:28:09 +06:00
complete -f -X '!*.@(?(la)tex|?(LA)TEX|texi|TEXI|dtx|DTX|ins|INS|ltx|LTX)' tex latex slitex jadetex pdfjadetex pdftex pdflatex texi2dvi
2005-07-19 04:28:48 +00:00
complete -f -X '!*.@(mp3|MP3)' mpg123 mpg321 madplay
2010-04-29 00:09:14 +03:00
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|flac|FLAC|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 dragon
2002-08-05 05:39:37 +00:00
complete -f -X '!*.@(avi|asf|wmv)' aviplay
2004-10-24 17:01:56 +00:00
complete -f -X '!*.@(rm?(j)|ra?(m)|smi?(l))' realplay
2003-07-20 07:52:57 +00:00
complete -f -X '!*.@(mpg|mpeg|avi|mov|qt)' xanim
2003-12-24 15:11:43 +00:00
complete -f -X '!*.@(ogg|OGG|m3u|flac|spx)' ogg123
2002-08-12 14:04:58 +00:00
complete -f -X '!*.@(mp3|MP3|ogg|OGG|pls|m3u)' gqmpeg freeamp
2002-02-10 20:32:39 +00:00
complete -f -X '!*.fig' xfig
2008-05-10 18:04:06 +02:00
complete -f -X '!*.@(mid?(i)|MID?(I)|cmf|CMF)' playmidi
2009-04-14 14:30:04 +03:00
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
2009-04-14 14:26:22 +03:00
complete -f -X '!*.@(m[eo]d|M[EO]D|s[3t]m|S[3T]M|xm|XM|it|IT)' modplugplay
2010-03-24 00:33:42 +02:00
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 emacs xemacs sxemacs kate kwrite
2010-03-12 18:16:48 +02:00
complete -f -X '!*.@([eE][xX][eE]?(.[sS][oO])|[cC][oO][mM]|[sS][cC][rR])' wine
2002-05-21 03:35:40 +00:00
complete -f -X '!*.@(zip|ZIP|z|Z|gz|GZ|tgz|TGZ)' bzme
2010-01-03 14:21:08 +02:00
# konqueror not here on purpose, it's more than a web/html browser
2010-04-21 23:45:39 +03:00
complete -f -X '!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))' netscape mozilla lynx opera galeon dillo elinks amaya firefox mozilla-firefox iceweasel google-chrome chromium-browser epiphany
2009-07-02 22:54:05 +03:00
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
2009-07-02 22:57:01 +03:00
complete -f -X '!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|ods|ots)' oocalc
2005-07-19 15:38:39 +00:00
complete -f -X '!*.@(sxd|std|sda|sdd|odg|otg)' oodraw
complete -f -X '!*.@(sxm|smf|mml|odf)' oomath
complete -f -X '!*.odb' oobase
2005-07-11 22:24:19 +00:00
complete -f -X '!*.rpm' rpm2cpio
2009-01-12 00:35:56 +02:00
complete -f -X '!*.sqlite' sqlite3
2009-02-03 20:32:07 +01:00
complete -f -X '!*.aux' bibtex
2009-07-13 18:28:42 +03:00
complete -f -X '!*.po' poedit gtranslator kbabel lokalize
2009-10-04 23:02:55 +02:00
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
2010-04-02 09:37:39 +03:00
complete -f -X '!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))' cdiff
complete -f -X '!*.@(dif?(f)|?(d)patch)' kompare
2001-12-20 07:52:12 +00:00
# FINISH exclude -- do not remove this line
2000-08-08 22:17:29 +00:00
2002-03-02 00:13:23 +00:00
# start of section containing compspecs that can be handled within bash
2000-08-08 22:17:29 +00:00
# user commands see only users
2009-05-19 22:54:48 +03:00
complete -u su passwd write chfn groups slay w sux
2001-11-29 00:37:54 +00:00
2000-08-08 22:17:29 +00:00
# bg completes with stopped jobs
2008-05-11 14:32:21 +02:00
complete -A stopped -P '"%' -S '"' bg
2000-08-08 22:17:29 +00:00
# other job commands
2008-05-11 14:32:21 +02:00
complete -j -P '"%' -S '"' fg jobs disown
2000-08-08 22:17:29 +00:00
2002-03-27 06:32:19 +00:00
# readonly and unset complete with shell variables
2002-02-11 01:49:26 +00:00
complete -v readonly unset
2000-08-08 22:17:29 +00:00
# set completes with set options
complete -A setopt set
# shopt completes with shopt options
complete -A shopt shopt
# helptopics
complete -A helptopic help
# unalias completes with aliases
complete -a unalias
# bind completes with readline bindings (make this more intelligent)
complete -A binding bind
2002-04-03 16:56:55 +00:00
# type and which complete on commands
complete -c command type which
2002-02-11 22:28:47 +00:00
2004-05-11 16:06:08 +00:00
# builtin completes on builtins
complete -b builtin
2002-03-02 00:13:23 +00:00
# start of section containing completion functions called by other functions
2000-08-08 22:17:29 +00:00
2004-10-13 18:58:48 +00:00
# This function checks whether we have a given program on the system.
2002-03-02 00:13:23 +00:00
# No need for bulky functions in memory if we don't.
2001-07-08 23:14:13 +00:00
#
have( )
{
2009-10-04 19:42:50 +02:00
unset -v have
2010-04-22 22:22:50 +02:00
# Completions for system administrator commands are installed as well in
# case completion is attempted via `sudo command ...'.
2009-10-04 19:42:50 +02:00
PATH = $PATH :/sbin:/usr/sbin:/usr/local/sbin type $1 & >/dev/null &&
have = "yes"
2001-07-08 23:14:13 +00:00
}
2004-07-03 22:56:08 +00:00
# This function checks whether a given readline variable
# is `on'.
#
2008-05-06 20:20:14 +01:00
_rl_enabled( )
2004-07-03 22:56:08 +00:00
{
2006-02-23 23:12:41 +00:00
[ [ " $( bind -v ) " = *$1 +( [ [ :space:] ] ) on* ] ]
2004-07-03 22:56:08 +00:00
}
2008-06-23 11:03:01 +02:00
# This function shell-quotes the argument
quote( )
{
2009-10-04 19:42:50 +02:00
echo \' ${ 1 // \' / \' \\ \' \' } \' #'# Help vim syntax highlighting
2008-06-23 11:03:01 +02:00
}
2009-12-24 10:00:29 +01:00
# @see _quote_readline_by_ref()
2008-06-23 11:03:01 +02:00
quote_readline( )
{
2009-12-24 10:00:29 +01:00
local quoted
_quote_readline_by_ref " $1 " ret
printf %s " $ret "
} # quote_readline()
2008-06-23 11:03:01 +02:00
# This function shell-dequotes the argument
dequote( )
{
2009-10-04 19:46:01 +02:00
eval echo " $1 " 2> /dev/null
2008-06-23 11:03:01 +02:00
}
2009-09-20 14:11:26 +02:00
2009-12-06 23:16:31 +01:00
# Reassemble command line words, excluding specified characters from the
# list of word completion separators (COMP_WORDBREAKS).
# @param $1 chars 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, so we would pass the
# colon (:) as $1 here.
# @param $2 words Name of variable to return words to
# @param $3 cword Name of variable to return cword to
#
__reassemble_comp_words_by_ref( ) {
local exclude i j ref
# Exclude word separator characters?
if [ [ $1 ] ] ; then
# Yes, exclude word separator characters;
# Exclude only those characters, which were really included
exclude = " ${ 1 //[^ $COMP_WORDBREAKS ] } "
fi
2009-12-31 11:12:15 +01:00
# Default to cword unchanged
eval $3 = $COMP_CWORD
2009-12-06 23:16:31 +01:00
# Are characters excluded which were former included?
if [ [ $exclude ] ] ; then
# Yes, list of word completion separators has shrunk;
# Re-assemble words to complete
for ( ( i = 0, j = 0; i < ${# COMP_WORDS [@] } ; i++, j++) ) ; do
2009-12-31 11:12:15 +01:00
# Is current word not word 0 (the command itself) and is word not
# empty and is word made up of just word separator characters to be
# excluded?
while [ [ $i -gt 0 && ${ COMP_WORDS [ $i ] } &&
${ COMP_WORDS [ $i ]//[^ $exclude ] } = = ${ COMP_WORDS [ $i ] }
] ] ; do
2009-12-06 23:16:31 +01:00
[ $j -ge 2 ] && ( ( j--) )
# Append word separator to current word
ref = " $2 [ $j ] "
2009-12-24 10:00:29 +01:00
eval $2 [ $j ] = \$ { !ref} \$ { COMP_WORDS[ i] }
2009-12-06 23:16:31 +01:00
# Indicate new cword
[ $i = $COMP_CWORD ] && eval $3 = $j
# Indicate next word if available, else end *both* while and for loop
( ( $i < ${# COMP_WORDS [@] } - 1) ) && ( ( i++) ) || break 2
done
# Append word to current word
ref = " $2 [ $j ] "
2009-12-24 10:00:29 +01:00
eval $2 [ $j ] = \$ { !ref} \$ { COMP_WORDS[ i] }
2009-12-06 23:16:31 +01:00
# Indicate new cword
2009-12-31 11:12:15 +01:00
[ $i = $COMP_CWORD ] && [ [ ${ COMP_WORDS [i] } ] ] && eval $3 = $j
2009-12-06 23:16:31 +01:00
done
2009-09-20 14:11:26 +02:00
else
2009-12-06 23:16:31 +01:00
# No, list of word completions separators hasn't changed;
eval $2 = \( \" \$ { COMP_WORDS[ @] } \" \)
2009-09-20 14:11:26 +02:00
fi
2009-12-06 23:16:31 +01:00
} # __reassemble_comp_words_by_ref()
2009-09-20 14:11:26 +02:00
2010-02-07 15:18:58 +01:00
# @param $1 exclude 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, so we would pass the
# colon (:) as $1 in this case. Bash-3 doesn't do word splitting, so this
# ensures we get the same word on both bash-3 and bash-4.
# @param $2 words Name of variable to return words to
# @param $3 cword Name of variable to return cword to
# @param $4 cur Name of variable to return current word to complete to
# @see ___get_cword_at_cursor_by_ref()
__get_cword_at_cursor_by_ref( ) {
# NOTE: The call to the main function ___get_cword_at_cursor_by_ref() is
# wrapped to make collisions with local variable names less likely.
local __words __cword __cur
___get_cword_at_cursor_by_ref " $1 " __words __cword __cur
eval $2 = \( \" \$ { __words[ @] } \" \)
eval $3 = \$ __cword
eval $4 = \$ __cur
}
# @param $1 exclude
# @param $2 words Name of variable to return words to
# @param $3 cword Name of variable to return cword to
# @param $4 cur Name of variable to return current word to complete to
# @note Do not call this function directly but call
# `__get_cword_at_cursor_by_ref()' instead to make variable name collisions
# less likely
# @see __get_cword_at_cursor_by_ref()
___get_cword_at_cursor_by_ref( ) {
local cword words
__reassemble_comp_words_by_ref " $1 " words cword
local i
local cur = " $COMP_LINE "
local index = " $COMP_POINT "
for ( ( i = 0; i <= cword; ++i ) ) ; do
while [ [
# Current word fits in $cur?
" ${# cur } " -ge ${# words [i] } &&
# $cur doesn't match cword?
" ${ cur : 0 : ${# words [i] } } " != " ${ words [i] } "
] ] ; do
# Strip first character
cur = " ${ cur : 1 } "
# Decrease cursor position
( ( index--) )
done
# Does found word matches cword?
if [ [ " $i " -lt " $cword " ] ] ; then
# No, cword lies further;
local old_size = " ${# cur } "
cur = " ${ cur # ${ words [i] } } "
local new_size = " ${# cur } "
index = $(( index - old_size + new_size ))
fi
done
if [ [ " ${ words [cword] : 0 : ${# cur } } " != " $cur " ] ] ; then
# We messed up. At least return the whole word so things keep working
eval $4 = \" \$ { words[ cword] } \"
else
eval $4 = \" \$ { cur:0:\$ index} \"
fi
eval $2 = \( \" \$ { words[ @] } \" \)
eval $3 = \$ cword
}
# Get the word to complete and optional previous words.
# 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 --------> ^
# Also one is able to cross over possible wordbreak characters.
# Usage: _get_comp_words_by_ref [OPTIONS] VAR1 [VAR2 [VAR3]]
# Example usage:
#
# $ _get_comp_words_by_ref -n : cur prev
#
# Options: -n EXCLUDE 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, so we would pass the
# colon (:) as -n option in this case. Bash-3 doesn't do word splitting,
# so this ensures we get the same word on both bash-3 and bash-4.
# @see __get_comp_words_by_ref
_get_comp_words_by_ref( ) {
# NOTE: The call to the main function __get_comp_words_by_ref() is wrapped
# to make collisions with local variable name less likely.
local __words __cword __cur __var __vars
__get_comp_words_by_ref __words __cword __cur __vars " $@ "
set -- " ${ __vars [@] } "
eval $1 = \$ __cur
shift
for __var; do
( ( __cword--) )
[ [ ${ __words [__cword] } ] ] && eval $__var = \$ { __words[ __cword] }
done
}
# @param $1 words Name of variable to return words to
# @param $2 cword Name of variable to return cword to
# @param $3 cur Name of variable to return current word to complete to
# @param $4 varnames Name of variable to return array of variable names to
# @param $@ Arguments to _get_comp_words_by_ref()
# @note Do not call this function directly but call `_get_comp_words_by_ref()'
# instead to make variable name collisions less likely
# @see _get_comp_words_by_ref()
__get_comp_words_by_ref( )
{
local exclude flag i OPTIND = 5 # Skip first four arguments
local cword words cur varnames = ( )
while getopts "n:" flag " $@ " ; do
case $flag in
n) exclude = $OPTARG ; ;
esac
done
varnames = ( ${ !OPTIND } )
let "OPTIND += 1"
while [ [ $# -ge $OPTIND ] ] ; do
varnames += ( ${ !OPTIND } )
let "OPTIND += 1"
done
__get_cword_at_cursor_by_ref " $exclude " words cword cur
eval $1 = \( \" \$ { words[ @] } \" \)
eval $2 = \$ cword
eval $3 = \$ cur
eval $4 = \( \" \$ { varnames[ @] } \" \)
}
2009-12-06 23:16:31 +01:00
# 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 --------> ^
# @param $1 string 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, so we would pass the
# colon (:) as $1 in this case. Bash-3 doesn't do word splitting, so this
# ensures we get the same word on both bash-3 and bash-4.
# @param $2 integer Index number of word to return, negatively offset to the
# current word (default is 0, previous is 1), respecting the exclusions
2009-12-24 15:31:19 +02:00
# given at $1. For example, `_get_cword "=:" 1' returns the word left of
2009-12-06 23:16:31 +01:00
# the current word, respecting the exclusions "=:".
2009-09-20 14:11:26 +02:00
#
2009-12-06 23:16:31 +01:00
_get_cword( )
2009-09-20 14:11:26 +02:00
{
2010-04-03 19:10:13 +02:00
local LC_CTYPE = C
2009-12-06 23:16:31 +01:00
local cword words
__reassemble_comp_words_by_ref " $1 " words cword
# return previous word offset by $2
if [ [ ${ 2 //[^0-9]/ } ] ] ; then
printf "%s" " ${ words [cword- $2 ] } "
elif [ [ " ${# words [cword] } " -eq 0 ] ] || [ [ " $COMP_POINT " = = " ${# COMP_LINE } " ] ] ; then
printf "%s" " ${ words [cword] } "
2009-10-04 19:42:50 +02:00
else
local i
local cur = " $COMP_LINE "
local index = " $COMP_POINT "
2009-12-06 23:16:31 +01:00
for ( ( i = 0; i <= cword; ++i ) ) ; do
2009-10-04 19:42:50 +02:00
while [ [
2009-12-06 23:16:31 +01:00
# Current word fits in $cur?
" ${# cur } " -ge ${# words [i] } &&
# $cur doesn't match cword?
" ${ cur : 0 : ${# words [i] } } " != " ${ words [i] } "
2009-12-24 10:00:29 +01:00
] ] ; do
2009-10-04 19:42:50 +02:00
# Strip first character
cur = " ${ cur : 1 } "
# Decrease cursor position
2009-12-06 23:16:31 +01:00
( ( index--) )
2009-10-04 19:42:50 +02:00
done
2009-12-06 23:16:31 +01:00
# Does found word matches cword?
if [ [ " $i " -lt " $cword " ] ] ; then
# No, cword lies further;
2009-10-04 19:42:50 +02:00
local old_size = " ${# cur } "
2009-12-06 23:16:31 +01:00
cur = " ${ cur # ${ words [i] } } "
2009-10-04 19:42:50 +02:00
local new_size = " ${# cur } "
2009-12-06 23:16:31 +01:00
index = $(( index - old_size + new_size ))
2009-10-04 19:42:50 +02:00
fi
done
2009-12-06 23:16:31 +01:00
if [ [ " ${ words [cword] : 0 : ${# cur } } " != " $cur " ] ] ; then
2009-10-04 19:42:50 +02:00
# We messed up! At least return the whole word so things
# keep working
2009-12-06 23:16:31 +01:00
printf "%s" " ${ words [cword] } "
2009-10-04 19:42:50 +02:00
else
printf "%s" " ${ cur : 0 : $index } "
fi
fi
2009-12-06 23:16:31 +01:00
} # _get_cword()
2009-09-20 14:11:26 +02:00
2009-12-06 23:16:31 +01:00
# Get word previous to the current word.
# This is a good alternative to `prev=${COMP_WORDS[COMP_CWORD-1]}' because bash4
# will properly return the previous word with respect to any given exclusions to
# COMP_WORDBREAKS.
# @see _get_cword()
2009-09-20 14:11:26 +02:00
#
2010-01-03 19:01:56 +01:00
_get_pword( )
{
if [ $COMP_CWORD -ge 1 ] ; then
_get_cword " ${ @ :- } " 1;
fi
}
2009-09-20 14:11:26 +02:00
2004-07-03 22:56:08 +00:00
2009-11-22 22:22:35 +01:00
# If the word-to-complete contains a colon (:), left-trim COMPREPLY items with
# word-to-complete.
# On bash-3, and bash-4 with a colon in COMP_WORDBREAKS, words containing
# colons are always completed as entire words if the word to complete contains
# a colon. This function fixes this, by removing the colon-containing-prefix
# from COMPREPLY items.
2009-12-06 23:16:31 +01:00
# The preferred solution is to remove the colon (:) from COMP_WORDBREAKS in
# your .bashrc:
#
# # Remove colon (:) from list of word completion separators
# COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
#
2009-11-22 22:22:35 +01:00
# See also: Bash FAQ - E13) Why does filename completion misbehave if a colon
# appears in the filename? - http://tiswww.case.edu/php/chet/bash/FAQ
# @param $1 current word to complete (cur)
# @modifies global array $COMPREPLY
2009-12-06 23:16:31 +01:00
#
2009-11-22 22:22:35 +01:00
__ltrim_colon_completions( ) {
# If word-to-complete contains a colon,
# and bash-version < 4,
# or bash-version >= 4 and COMP_WORDBREAKS contains a colon
if [ [
" $1 " = = *:* && (
${ BASH_VERSINFO [0] } -lt 4 ||
( ${ BASH_VERSINFO [0] } -ge 4 && " $COMP_WORDBREAKS " = = *:*)
)
] ] ; then
# Remove colon-word prefix from COMPREPLY items
local colon_word = ${ 1 % ${ 1 ##* : } }
local i = ${# COMPREPLY [*] }
while [ $(( - - i)) -ge 0 ] ; do
COMPREPLY[ $i ] = ${ COMPREPLY [ $i ]# " $colon_word " }
done
fi
} # __ltrim_colon_completions()
2009-12-24 10:00:29 +01:00
# This function quotes the argument in a way so that readline dequoting
# results in the original argument. This is necessary for at least
# `compgen' which requires its arguments quoted/escaped:
#
# $ ls "a'b/"
# c
# $ compgen -f "a'b/" # Wrong, doesn't return output
# $ compgen -f "a\'b/" # Good (bash-4)
# a\'b/c
# $ compgen -f "a\\\\\'b/" # Good (bash-3)
# a\'b/c
#
# See also: http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00155.html
# @param $1 Argument to quote
# @param $2 Name of variable to return result to
_quote_readline_by_ref( )
{
if [ [ ${ 1 : 0 : 1 } = = "'" ] ] ; then
# Quote word, leaving out first character
printf -v $2 %q " ${ 1 : 1 } "
if [ [ ${ BASH_VERSINFO [0] } -le 3 ] ] ; then
# Double-quote word on bash-3
printf -v $2 %q ${ !2 }
fi
elif [ [ ${ BASH_VERSINFO [0] } -le 3 && ${ 1 : 0 : 1 } = = '"' ] ] ; then
printf -v $2 %q " ${ 1 : 1 } "
else
printf -v $2 %q " $1 "
fi
2010-04-10 12:22:19 +02:00
# If result becomes quoted like this: $'string', re-evaluate in order to
# drop the additional quoting. See also: http://www.mail-archive.com/
# bash-completion-devel@lists.alioth.debian.org/msg01942.html
[ [ ${ !2 : 0 : 1 } = = '$' ] ] && eval $2 = ${ !2 }
2009-12-24 10:00:29 +01:00
} # _quote_readline_by_ref()
2002-03-02 00:13:23 +00:00
# This function performs file and directory completion. It's better than
2002-05-18 17:05:08 +00:00
# simply using 'compgen -f', because it honours spaces in filenames.
2010-03-12 12:27:41 +01:00
# @param $1 If `-d', complete only on directories. Otherwise filter/pick only
# completions with `.$1' as file extension.
2002-03-02 00:13:23 +00:00
#
_filedir( )
{
2009-12-24 10:00:29 +01:00
local i IFS = $'\t\n' xspec
2009-10-04 19:42:50 +02:00
2009-12-24 10:00:29 +01:00
__expand_tilde_by_ref cur
2009-10-04 19:42:50 +02:00
local -a toks
2009-12-24 10:00:29 +01:00
local quoted tmp
2009-10-04 19:42:50 +02:00
2009-12-24 10:00:29 +01:00
_quote_readline_by_ref " $cur " quoted
2010-04-10 12:22:19 +02:00
toks = ( ${ toks [@]- } $(
compgen -d -- " $quoted " | {
while read -r tmp; do
2010-04-10 12:27:36 +02:00
# TODO: I have removed a "[ -n $tmp ] &&" before 'printf ..',
# 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
2010-04-10 12:22:19 +02:00
printf '%s\n' $tmp
done
}
) )
2009-10-18 12:38:04 +02:00
2009-12-24 10:00:29 +01:00
# On bash-3, special characters need to be escaped extra. This is
# unless the first character is a single quote ('). If the single
# quote appears further down the string, bash default completion also
# fails, e.g.:
#
# $ ls 'a&b/'
# f
# $ foo 'a&b/<TAB> # Becomes: foo 'a&b/f'
# $ foo a'&b/<TAB> # Nothing happens
#
2009-10-18 12:38:04 +02:00
if [ [ " $1 " != -d ] ] ; then
xspec = ${ 1 : + " !*. $1 " }
2010-04-10 12:22:19 +02:00
if [ [ ${ cur : 0 : 1 } = = "'" && ${ BASH_VERSINFO [0] } -ge 4 ] ] ; then
2009-12-24 10:00:29 +01:00
toks = ( ${ toks [@]- } $(
eval compgen -f -X \" \$ xspec\" -- $quoted
) )
else
toks = ( ${ toks [@]- } $(
compgen -f -X " $xspec " -- $quoted
) )
fi
if [ ${# toks [@] } -ne 0 ] ; then
# If `compopt' is available, set `-o filenames'
compopt & >/dev/null && compopt -o filenames ||
# No, `compopt' isn't available;
# Is `-o filenames' set?
2010-03-12 12:27:41 +01:00
[ [ (
${ COMP_WORDS [0] } &&
" $( complete -p ${ COMP_WORDS [0] } ) " = = *"-o filenames" *
) ] ] || {
2009-12-24 10:00:29 +01:00
# No, `-o filenames' isn't set;
# Emulate `-o filenames'
2010-03-12 12:27:41 +01:00
# NOTE: A side-effect of emulating `-o filenames' is that
# backslash escape characters are visible within the list
# of presented completions, e.g. the completions look
# like:
2009-12-24 10:00:29 +01:00
#
# $ foo a<TAB>
# a\ b/ a\$b/
#
2010-03-12 12:27:41 +01:00
# whereas with `-o filenames' active the completions look
# like:
2009-12-24 10:00:29 +01:00
#
# $ ls a<TAB>
# a b/ a$b/
#
for ( ( i = 0; i < ${# toks [@] } ; i++) ) ; do
# If directory exists, append slash (/)
if [ [ ${ cur : 0 : 1 } != "'" ] ] ; then
[ [ -d ${ toks [i] } ] ] && toks[ i] = " ${ toks [i] } " /
if [ [ ${ cur : 0 : 1 } = = '"' ] ] ; then
2010-02-09 11:08:57 +01:00
toks[ i] = ${ toks [i]// \\ / \\ \\ }
2009-12-24 10:00:29 +01:00
toks[ i] = ${ toks [i]// \" / \\ \" }
toks[ i] = ${ toks [i]// \$ / \\ \$ }
else
2010-02-09 11:08:57 +01:00
toks[ i] = $( printf %q ${ toks [i] } )
2009-12-24 10:00:29 +01:00
fi
fi
2009-10-18 12:38:04 +02:00
done
}
2009-12-24 10:00:29 +01:00
fi
2009-10-04 19:42:50 +02:00
fi
COMPREPLY = ( " ${ COMPREPLY [@] } " " ${ toks [@] } " )
2009-10-18 12:38:04 +02:00
} # _filedir()
2002-03-02 00:13:23 +00:00
2009-04-14 23:16:47 +03:00
# 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( )
{
2009-10-04 19:42:50 +02:00
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
2009-04-14 23:16:47 +03:00
}
2009-01-17 00:31:39 +01:00
# This function tries to parse the output of $command --help
#
_parse_help( ) {
2009-10-04 19:42:50 +02:00
local cmd
cmd = $1
2010-01-18 19:09:02 +02:00
$cmd --help 2>& 1 | command grep -- "^[[:space:]]*-" | tr "," " " | \
2009-11-04 00:24:28 +02:00
awk '{print $1; if ($2 ~ /-.*/) { print $2 } }' | sed -e "s:=.*::g"
2009-01-17 00:31:39 +01:00
}
2002-03-02 00:13:23 +00:00
# This function completes on signal names
#
_signals( )
{
2009-10-04 19:42:50 +02:00
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
2002-03-02 00:13:23 +00:00
}
2005-01-10 22:39:56 +00:00
# This function completes on configured network interfaces
2003-08-03 00:57:49 +00:00
#
2005-01-10 22:39:56 +00:00
_configured_interfaces( )
2003-08-03 00:57:49 +00:00
{
2009-10-04 19:42:50 +02:00
if [ -f /etc/debian_version ] ; then
# Debian system
2009-11-03 22:04:46 +02:00
COMPREPLY = ( $( compgen -W " $( sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p' \
2009-11-01 21:01:18 +02:00
/etc/network/interfaces ) " -- " $cur " ) )
2009-10-04 19:42:50 +02:00
elif [ -f /etc/SuSE-release ] ; then
# SuSE system
2009-12-20 23:44:33 +02:00
COMPREPLY = ( $( compgen -W " $( printf '%s\n' \
2009-11-01 21:01:18 +02:00
/etc/sysconfig/network/ifcfg-* | \
sed -ne 's|.*ifcfg-\(.*\)|\1|p' ) " -- " $cur " ) )
2009-10-04 19:42:50 +02:00
elif [ -f /etc/pld-release ] ; then
# PLD Linux
2009-11-01 21:01:18 +02:00
COMPREPLY = ( $( compgen -W " $( command ls -B \
/etc/sysconfig/interfaces | \
sed -ne 's|.*ifcfg-\(.*\)|\1|p' ) " -- " $cur " ) )
2009-10-04 19:42:50 +02:00
else
# Assume Red Hat
2009-12-20 23:44:33 +02:00
COMPREPLY = ( $( compgen -W " $( printf '%s\n' \
2009-11-01 21:01:18 +02:00
/etc/sysconfig/network-scripts/ifcfg-* | \
sed -ne 's|.*ifcfg-\(.*\)|\1|p' ) " -- " $cur " ) )
2009-10-04 19:42:50 +02:00
fi
2003-08-03 00:57:49 +00:00
}
2009-01-25 23:39:09 +02:00
# This function completes on available kernels
2009-01-19 21:30:58 +01:00
#
_kernel_versions( )
{
2009-10-04 19:42:50 +02:00
COMPREPLY = ( $( compgen -W '$( command ls /lib/modules )' -- " $cur " ) )
2009-01-19 21:30:58 +01:00
}
2005-01-10 22:39:56 +00:00
# This function completes on all available network interfaces
# -a: restrict to active interfaces only
# -w: restrict to wireless interfaces only
#
_available_interfaces( )
{
2009-10-04 19:42:50 +02:00
local cmd
if [ " ${ 1 :- } " = -w ] ; then
cmd = "iwconfig"
elif [ " ${ 1 :- } " = -a ] ; then
cmd = "ifconfig"
else
cmd = "ifconfig -a"
fi
2009-10-31 14:05:19 +02:00
COMPREPLY = ( $( eval PATH = " $PATH :/sbin " $cmd 2>/dev/null | \
2010-01-19 19:09:15 +02:00
awk '/^[^ \t]/ { print $1 }' ) )
2009-11-01 21:01:18 +02:00
COMPREPLY = ( $( compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- " $cur " ) )
2005-01-10 22:39:56 +00:00
}
2009-12-02 22:38:30 +01:00
# Expand variable starting with tilde (~)
# Only the first portion of the variable from the tilde up to the first slash
# (~../) is expanded. The remainder of the variable, containing for example
# a dollar sign variable ($) or asterisk (*) is not expanded.
# Example usage:
#
2010-01-03 13:49:41 +02:00
# $ v="~"; __expand_tilde_by_ref v; echo "$v"
2009-12-02 22:38:30 +01:00
#
# Example output:
#
# v output
# -------- ----------------
# ~ /home/user
# ~foo/bar /home/foo/bar
# ~foo/$HOME /home/foo/$HOME
# ~foo/a b /home/foo/a b
# ~foo/* /home/foo/*
#
# @param $1 Name of variable (not the value of the variable) to expand
__expand_tilde_by_ref( ) {
# Does $1 start with tilde (~)?
if [ " ${ !1 : 0 : 1 } " = "~" ] ; then
# Does $1 contain slash (/)?
if [ " ${ !1 } " != " ${ !1// \/ } " ] ; then
# Yes, $1 contains slash;
# 1: Remove * including and after first slash (/), i.e. "~a/b"
# becomes "~a". Double quotes allow eval.
# 2: Remove * before the first slash (/), i.e. "~a/b"
# becomes "b". Single quotes prevent eval.
# +-----1----+ +---2----+
eval $1 = " ${ !1/% \/ * } " /'${!1#*/}'
else
# No, $1 doesn't contain slash
eval $1 = " ${ !1 } "
fi
fi
} # __expand_tilde_by_ref()
2002-03-02 00:13:23 +00:00
# This function expands tildes in pathnames
#
_expand( )
{
2009-10-04 19:42:50 +02:00
# 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
2002-03-02 00:13:23 +00:00
}
2005-07-07 21:09:39 +00:00
# This function completes on process IDs.
# AIX and Solaris ps prefers X/Open syntax.
2009-11-23 20:08:52 +02:00
[ [ $UNAME = = SunOS || $UNAME = = AIX ] ] &&
2004-06-01 06:08:18 +00:00
_pids( )
{
2009-10-04 19:42:50 +02:00
COMPREPLY = ( $( compgen -W '$( command ps -efo pid | sed 1d )' -- " $cur " ) )
2005-07-07 21:09:39 +00:00
} ||
_pids( )
2002-04-02 06:17:35 +00:00
{
2009-10-04 19:42:50 +02:00
COMPREPLY = ( $( compgen -W '$( command ps axo pid= )' -- " $cur " ) )
2002-04-02 06:17:35 +00:00
}
2005-07-07 21:09:39 +00:00
# This function completes on process group IDs.
# AIX and SunOS prefer X/Open, all else should be BSD.
2009-11-23 20:08:52 +02:00
[ [ $UNAME = = SunOS || $UNAME = = AIX ] ] &&
2004-06-01 06:08:18 +00:00
_pgids( )
{
2009-10-04 19:42:50 +02:00
COMPREPLY = ( $( compgen -W '$( command ps -efo pgid | sed 1d )' -- " $cur " ) )
2005-07-07 21:09:39 +00:00
} ||
_pgids( )
{
2009-10-04 19:42:50 +02:00
COMPREPLY = ( $( compgen -W '$( command ps axo pgid= )' -- " $cur " ) )
2004-06-01 06:08:18 +00:00
}
2009-02-15 18:47:34 +02:00
# This function completes on process names.
# AIX and SunOS prefer X/Open, all else should be BSD.
2009-11-23 20:08:52 +02:00
[ [ $UNAME = = SunOS || $UNAME = = AIX ] ] &&
2009-02-15 18:47:34 +02:00
_pnames( )
{
2010-03-30 20:29:42 +03:00
COMPREPLY = ( $( compgen -X '<defunct>' -W ' $( command ps -efo comm | \
sed -e 1d -e "s:.*/::" -e "s/^-//" | sort -u ) ' -- " $cur " ) )
2009-02-15 18:47:34 +02:00
} ||
_pnames( )
{
2009-10-04 19:42:50 +02:00
# 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)
2010-03-30 20:29:42 +03:00
COMPREPLY = ( $( compgen -X '<defunct>' -W ' $( command ps axo command = | \
2009-11-04 00:24:28 +02:00
sed -e "s/ .*//" -e "s:.*/::" -e " s/: $// " -e "s/^[[(-]//" \
2010-03-30 20:29:42 +03:00
-e " s/[])] $// " | sort -u ) ' -- " $cur " ) )
2009-02-15 18:47:34 +02:00
}
2003-08-04 03:15:28 +00:00
# This function completes on user IDs
#
_uids( )
{
2009-10-04 19:42:50 +02:00
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
2003-08-04 03:15:28 +00:00
}
# This function completes on group IDs
#
_gids( )
{
2009-10-04 19:42:50 +02:00
if type getent & >/dev/null; then
2009-11-01 21:01:18 +02:00
COMPREPLY = ( $( compgen -W '$( getent group | cut -d: -f3 )' \
-- " $cur " ) )
2009-10-04 19:42:50 +02:00
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
2009-11-01 21:01:18 +02:00
COMPREPLY = ( $( compgen -W '$( cut -d: -f3 /etc/group )' -- " $cur " ) )
2009-10-04 19:42:50 +02:00
fi
2003-08-04 03:15:28 +00:00
}
2004-07-19 06:45:15 +00:00
# This function completes on services
2004-05-24 07:50:30 +00:00
#
_services( )
{
2009-10-04 19:42:50 +02:00
local sysvdir famdir
[ -d /etc/rc.d/init.d ] && sysvdir = /etc/rc.d/init.d || sysvdir = /etc/init.d
famdir = /etc/xinetd.d
2009-12-21 00:09:02 +02:00
COMPREPLY = ( $( printf '%s\n' \
$sysvdir /!( *.rpm@( orig| new| save) | *~| functions) ) )
2004-05-24 07:50:30 +00:00
2009-10-04 19:42:50 +02:00
if [ -d $famdir ] ; then
2009-12-21 00:09:02 +02:00
COMPREPLY = ( " ${ COMPREPLY [@] } " $( printf '%s\n' \
$famdir /!( *.rpm@( orig| new| save) | *~) ) )
2009-10-04 19:42:50 +02:00
fi
2004-07-03 22:26:29 +00:00
2009-10-04 19:42:50 +02:00
COMPREPLY = ( $( compgen -W '${COMPREPLY[@]#@($sysvdir|$famdir)/}' -- " $cur " ) )
2004-05-24 07:50:30 +00:00
}
2009-01-25 23:39:09 +02:00
# This function completes on modules
2005-01-03 01:24:14 +00:00
#
_modules( )
{
2009-10-04 19:42:50 +02:00
local modpath
modpath = /lib/modules/$1
2009-11-01 21:01:18 +02:00
COMPREPLY = ( $( compgen -W " $( command ls -R $modpath | \
2010-01-04 18:00:46 +02:00
sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.gz\)\{0,1\}$/\1/p' ) " -- " $cur " ) )
2005-01-03 01:24:14 +00:00
}
2009-01-25 23:40:44 +02:00
# This function completes on installed modules
#
_installed_modules( )
{
2009-10-04 19:42:50 +02:00
COMPREPLY = ( $( compgen -W " $( PATH = " $PATH :/sbin " lsmod | \
2009-11-01 21:01:18 +02:00
awk '{if (NR != 1) print $1}' ) " -- " $1 " ) )
2009-01-25 23:40:44 +02:00
}
2010-01-29 23:23:30 +01:00
# This function completes on user or user:group format; as for chown and cpio.
2005-07-11 22:23:30 +00:00
#
2010-01-29 23:23:30 +01:00
# The : must be added manually; it will only complete usernames initially.
# The legacy user.group format is not supported.
#
# It assumes compopt -o filenames; but doesn't touch it.
2005-07-11 22:23:30 +00:00
_usergroup( )
{
2009-10-04 19:42:50 +02:00
local IFS = $'\n'
2010-01-29 23:23:30 +01:00
if [ [ $cur = *\\ \\ * || $cur = *:*:* ] ] ; then
# Give up early on if something seems horribly wrong.
return
elif [ [ $cur = *\\ :* ] ] ; then
# Completing group after 'user\:gr<TAB>'.
# Reply with a list of groups prefixed with 'user:', readline will
# escape to the colon.
local prefix
prefix = ${ cur %%*([^ : ]) }
prefix = ${ prefix // \\ }
COMPREPLY = ( $( compgen -P " $prefix " -g -- " ${ cur #*[ : ] } " ) )
2009-10-22 11:15:27 +03:00
elif [ [ $cur = *:* ] ] ; then
2010-01-29 23:23:30 +01:00
# Completing group after 'user:gr<TAB>'.
# Reply with a list of unprefixed groups since readline with split on :
# and only replace the 'gr' part
COMPREPLY = ( $( compgen -g -- " ${ cur #* : } " ) )
2009-10-04 19:42:50 +02:00
else
2010-01-29 23:23:30 +01:00
# Completing a partial 'usernam<TAB>'.
#
# Don't suffix with a : because readline will escape it and add a
# slash. It's better to complete into 'chown username ' than 'chown
# username\:'.
COMPREPLY = ( $( compgen -u -- " $cur " ) )
2009-10-04 19:42:50 +02:00
fi
2005-07-11 22:23:30 +00:00
}
2009-04-19 17:33:55 +03:00
# This function completes on valid shells
#
_shells( )
{
2009-12-15 23:48:10 +02:00
COMPREPLY = ( " ${ COMPREPLY [@] } " $( compgen -W \
'$( command grep "^[[:space:]]*/" /etc/shells 2>/dev/null )' \
-- " $cur " ) )
2009-04-19 17:33:55 +03:00
}
2009-03-16 21:57:12 +01:00
2010-04-21 19:07:17 +03:00
# This function completes on valid filesystem types
#
_fstypes( )
{
local fss
if [ -e /proc/filesystems ] ; then
# Linux
fss = " $( cut -d$'\t' -f2 /proc/filesystems )
$( awk '! /\*/ { print $NF }' /etc/filesystems 2>/dev/null ) "
else
# Generic
fss = " $( awk '/^[ \t]*[^#]/ { print $3 }' /etc/fstab 2>/dev/null )
$( awk '/^[ \t]*[^#]/ { print $3 }' /etc/mnttab 2>/dev/null )
$( awk '/^[ \t]*[^#]/ { print $4 }' /etc/vfstab 2>/dev/null )
$( awk '{ print $1 }' /etc/dfs/fstypes 2>/dev/null )
$( [ -d /etc/fs ] && command ls /etc/fs ) "
fi
[ -n " $fss " ] && \
COMPREPLY = ( " ${ COMPREPLY [@] } " $( compgen -W " $fss " -- " $cur " ) )
}
2009-03-16 21:57:12 +01:00
# Get real command.
# - arg: $1 Command
# - stdout: Filename of command in PATH with possible symbolic links resolved.
# Empty string if command not found.
# - return: True (0) if command found, False (> 0) if not.
2010-04-29 00:06:24 +03:00
_realcommand( )
{
2009-10-04 19:42:50 +02:00
type -P " $1 " > /dev/null && {
2009-10-18 12:38:04 +02:00
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
}
2009-03-16 21:57:12 +01:00
}
2010-03-14 19:27:40 +01:00
# This function returns the first arugment, excluding options
# @param $1 chars Characters out of $COMP_WORDBREAKS which should
# NOT be considered word breaks. See __reassemble_comp_words_by_ref.
_get_first_arg( )
{
local i
arg =
for ( ( i = 1; i < COMP_CWORD; i++ ) ) ; do
if [ [ " ${ COMP_WORDS [i] } " != -* ] ] ; then
arg = ${ COMP_WORDS [i] }
break
fi
done
}
2009-03-16 21:57:12 +01:00
2010-03-14 19:27:40 +01:00
# This function counts the number of args, excluding options
2009-12-11 00:14:54 +02:00
# @param $1 chars Characters out of $COMP_WORDBREAKS which should
# NOT be considered word breaks. See __reassemble_comp_words_by_ref.
2005-07-11 22:23:30 +00:00
_count_args( )
{
2009-12-11 00:14:54 +02:00
local i cword words
__reassemble_comp_words_by_ref " $1 " words cword
2009-10-04 19:42:50 +02:00
args = 1
2009-12-11 00:14:54 +02:00
for i in " ${ words [@] : 1 : cword -1 } " ; do
[ [ " $i " != -* ] ] && args = $(( $args + 1 ))
2009-10-04 19:42:50 +02:00
done
2005-07-11 22:23:30 +00:00
}
2009-06-12 20:45:35 +03:00
# This function completes on PCI IDs
2009-02-10 23:50:04 +01:00
#
_pci_ids( )
{
2009-10-04 19:42:50 +02:00
COMPREPLY = ( ${ COMPREPLY [@] :- } $( compgen -W \
2009-11-04 00:24:28 +02:00
" $( PATH = " $PATH :/sbin " lspci -n | awk '{print $3}' ) " -- " $cur " ) )
2009-02-10 23:50:04 +01:00
}
2009-06-12 20:45:35 +03:00
# This function completes on USB IDs
2009-02-10 23:50:04 +01:00
#
_usb_ids( )
{
2009-10-04 19:42:50 +02:00
COMPREPLY = ( ${ COMPREPLY [@] :- } $( compgen -W \
2009-11-04 00:24:28 +02:00
" $( PATH = " $PATH :/sbin " lsusb | awk '{print $6}' ) " -- " $cur " ) )
2009-02-10 23:50:04 +01:00
}
2009-11-04 23:12:44 +02:00
# CD device names
_cd_devices( )
{
COMPREPLY = ( " ${ COMPREPLY [@] } "
$( compgen -f -d -X "!*/?([amrs])cd*" -- " ${ cur :- /dev/ } " ) )
}
# DVD device names
_dvd_devices( )
{
COMPREPLY = ( " ${ COMPREPLY [@] } "
$( compgen -f -d -X "!*/?(r)dvd*" -- " ${ cur :- /dev/ } " ) )
}
2002-03-02 00:13:23 +00:00
# start of section containing completion functions for external programs
2003-08-03 23:40:25 +00:00
# a little help for FreeBSD ports users
2009-11-04 00:24:28 +02:00
[ $UNAME = FreeBSD ] && complete -W ' index search fetch fetch-list extract \
patch configure build install reinstall deinstall clean clean-depends \
kernel buildworld' make
2003-08-03 23:40:25 +00:00
2003-03-27 06:48:09 +00:00
# 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/ ] ; } &&
2009-10-18 12:38:04 +02:00
_service( )
{
local cur prev sysvdir
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
COMPREPLY = ( )
prev = ${ COMP_WORDS [COMP_CWORD-1] }
cur = ` _get_cword`
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
# 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
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
# don't complete past 2nd token
[ $COMP_CWORD -gt 2 ] && return 0
2009-10-04 19:42:50 +02:00
2009-11-04 00:24:28 +02:00
[ -d /etc/rc.d/init.d ] && sysvdir = /etc/rc.d/init.d || sysvdir = /etc/init.d
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
if [ [ $COMP_CWORD -eq 1 ] ] && [ [ $prev = = "service" ] ] ; then
_services
else
2009-11-04 00:16:06 +02:00
COMPREPLY = ( $( compgen -W ' ` sed -e "y/|/ /" \
2009-11-04 00:24:28 +02:00
-ne " s/^.*\(U\|msg_u\)sage.*{\(.*\)}.* $/\2/p " \
$sysvdir /${ prev ##*/ } 2>/dev/null` ' -- " $cur " ) )
2009-10-18 12:38:04 +02:00
fi
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
return 0
} &&
complete -F _service service
2009-10-22 12:04:29 +03:00
[ -d /etc/init.d/ ] && complete -F _service -o default \
2009-12-21 00:09:02 +02:00
$( for i in /etc/init.d/*; do printf '%s\n' ${ i ##*/ } ; done )
2009-10-18 12:38:04 +02:00
# chown(1) completion
#
_chown( )
{
local cur prev split = false
2010-01-29 23:23:30 +01:00
# Get cur and prev words; but don't treat user:group as separate words.
cur = ` _get_cword :`
prev = ` _get_pword :`
2009-10-18 12:38:04 +02:00
_split_longopt && split = true
case " $prev " in
--from)
_usergroup
return 0
; ;
--reference)
_filedir
return 0
; ;
esac
$split && return 0
if [ [ " $cur " = = -* ] ] ; then
2010-01-29 23:23:30 +01:00
# Complete -options
2010-02-12 17:52:56 +02:00
local w opts
for w in " ${ COMP_WORDS [@] } " ; do
[ [ " $w " = = -@( R| -recursive) ] ] && opts = "-H -L -P" && break
done
2009-11-04 00:24:28 +02:00
COMPREPLY = ( $( compgen -W ' -c -h -f -R -v --changes --dereference \
--no-dereference --from --silent --quiet --reference --recursive \
2010-02-12 17:52:56 +02:00
--verbose --help --version $opts ' -- " $cur " ) )
2009-10-18 12:38:04 +02:00
else
2010-01-29 23:23:30 +01:00
local args
# The first argument is an usergroup; the rest are filedir.
_count_args :
if [ [ $args = = 1 ] ] ; then
_usergroup
else
_filedir
fi
2009-10-18 12:38:04 +02:00
fi
} # _chown()
2009-10-22 12:04:29 +03:00
complete -F _chown -o filenames chown
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
# chgrp(1) completion
#
_chgrp( )
{
local cur prev split = false
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
COMPREPLY = ( )
cur = ` _get_cword`
cur = ${ cur // \\ \\ / }
prev = ${ COMP_WORDS [COMP_CWORD-1] }
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
_split_longopt && split = true
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
if [ [ " $prev " = = --reference ] ] ; then
_filedir
return 0
fi
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
$split && return 0
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
# options completion
if [ [ " $cur " = = -* ] ] ; then
2010-02-12 17:52:56 +02:00
local w opts
for w in " ${ COMP_WORDS [@] } " ; do
[ [ " $w " = = -@( R| -recursive) ] ] && opts = "-H -L -P" && break
done
2009-11-04 00:24:28 +02:00
COMPREPLY = ( $( compgen -W ' -c -h -f -R -v --changes --dereference \
--no-dereference --silent --quiet --reference --recursive \
2010-02-12 17:52:56 +02:00
--verbose --help --version $opts ' -- " $cur " ) )
2009-10-18 12:38:04 +02:00
return 0
fi
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
# first parameter on line or first since an option?
2009-11-23 20:08:52 +02:00
if [ [ $COMP_CWORD -eq 1 && " $cur " != -* || " $prev " = = -* ] ] ; then
2009-10-18 12:38:04 +02:00
local IFS = $'\n'
COMPREPLY = ( $( compgen -g " $cur " 2>/dev/null ) )
else
_filedir || return 0
fi
2009-10-04 19:42:50 +02:00
2009-10-18 12:38:04 +02:00
return 0
} # _chgrp()
2009-10-22 12:04:29 +03:00
complete -F _chgrp -o filenames chgrp
2009-10-04 19:42:50 +02:00
2002-04-02 06:17:35 +00:00
# renice(8) completion
#
_renice( )
{
2009-10-04 19:42:50 +02:00
local command cur curopt i
COMPREPLY = ( )
cur = ` _get_cword`
command = $1
i = 0
# walk back through command line and find last option
2009-11-23 20:08:52 +02:00
while [ [ $i -le $COMP_CWORD && ${# COMPREPLY [@] } -eq 0 ] ] ; do
2009-10-04 19:42:50 +02:00
curopt = ${ COMP_WORDS [COMP_CWORD- $i ] }
case " $curopt " in
-u)
COMPREPLY = ( $( compgen -u -- " $cur " ) )
; ;
-g)
_pgids
; ;
-p| $command )
_pids
; ;
esac
i = $(( + + i ))
done
2002-04-02 06:17:35 +00:00
}
complete -F _renice renice
2009-10-18 12:38:04 +02:00
2002-02-19 17:37:15 +00:00
# kill(1) completion
#
_kill( )
{
2009-10-04 19:42:50 +02:00
local cur
COMPREPLY = ( )
cur = ` _get_cword`
2009-11-23 20:08:52 +02:00
if [ [ $COMP_CWORD -eq 1 && " $cur " = = -* ] ] ; then
2009-10-04 19:42:50 +02:00
# return list of available signals
_signals
else
# return list of available PIDs
_pids
fi
2002-02-19 17:37:15 +00:00
}
complete -F _kill kill
2009-02-15 19:12:05 +02:00
# killall(1) (Linux and FreeBSD) and pkill(1) completion.
2000-08-08 22:17:29 +00:00
#
2009-11-23 20:08:52 +02:00
[ [ $UNAME = = Linux || $UNAME = = FreeBSD ] ] || have pkill &&
2000-08-29 00:41:27 +00:00
_killall( )
2000-08-08 22:17:29 +00:00
{
2009-10-04 19:42:50 +02:00
local cur
2000-08-08 22:17:29 +00:00
2009-10-04 19:42:50 +02:00
COMPREPLY = ( )
cur = ` _get_cword`
2000-08-08 22:17:29 +00:00
2009-11-23 20:08:52 +02:00
if [ [ $COMP_CWORD -eq 1 && " $cur " = = -* ] ] ; then
2009-10-04 19:42:50 +02:00
_signals
else
_pnames
fi
2000-08-08 22:17:29 +00:00
2009-10-04 19:42:50 +02:00
return 0
2000-08-08 22:17:29 +00:00
}
2009-11-23 20:08:52 +02:00
[ [ $UNAME = = Linux || $UNAME = = FreeBSD ] ] && complete -F _killall killall
2009-02-15 19:12:05 +02:00
have pkill && complete -F _killall pkill
2000-08-08 22:17:29 +00:00
2009-02-15 19:04:51 +02:00
# pgrep(1) completion.
2004-07-03 22:51:18 +00:00
#
2009-02-15 19:04:51 +02:00
[ $UNAME = Linux ] || have pgrep &&
2004-07-03 22:51:18 +00:00
_pgrep( )
{
2009-10-04 19:42:50 +02:00
local cur
2004-07-03 22:51:18 +00:00
2009-10-04 19:42:50 +02:00
COMPREPLY = ( )
cur = ` _get_cword`
2004-07-03 22:51:18 +00:00
2009-10-04 19:42:50 +02:00
_pnames
2004-07-03 22:51:18 +00:00
2009-10-04 19:42:50 +02:00
return 0
2004-07-03 22:51:18 +00:00
}
2009-02-15 19:04:51 +02:00
have pgrep && complete -F _pgrep pgrep
2004-07-03 22:51:18 +00:00
# Linux pidof(8) completion.
[ $UNAME = Linux ] && complete -F _pgrep pidof
2009-01-11 00:27:23 +02:00
# Red Hat & Debian GNU/Linux if{up,down} completion
2002-01-08 00:33:08 +00:00
#
2009-05-20 22:08:53 +02:00
[ $USERLAND = GNU ] && { have ifup || have ifdown; } &&
2002-01-08 00:33:08 +00:00
_ifupdown( )
{
2009-10-04 19:42:50 +02:00
local cur
2002-01-08 00:33:08 +00:00
2009-10-04 19:42:50 +02:00
COMPREPLY = ( )
cur = ` _get_cword`
2002-01-08 00:33:08 +00:00
2009-10-04 19:42:50 +02:00
if [ $COMP_CWORD -eq 1 ] ; then
_configured_interfaces
COMPREPLY = ( $( compgen -W '${COMPREPLY[@]}' -- " $cur " ) )
fi
2002-01-08 00:33:08 +00:00
2009-10-04 19:42:50 +02:00
return 0
2005-07-07 23:36:51 +00:00
} &&
complete -F _ifupdown ifup ifdown
2009-05-20 22:08:53 +02:00
[ $USERLAND = GNU ] && have ifstatus && complete -F _ifupdown ifstatus
2002-01-08 00:33:08 +00:00
2002-08-19 14:56:55 +00:00
# Linux ipsec(8) completion (for FreeS/WAN)
2000-08-08 22:17:29 +00:00
#
2002-04-22 05:59:08 +00:00
[ $UNAME = Linux ] && have ipsec &&
2000-08-29 00:41:27 +00:00
_ipsec( )
2000-08-08 22:17:29 +00:00
{
2009-10-04 19:42:50 +02:00
local cur
COMPREPLY = ( )
cur = ` _get_cword`
if [ $COMP_CWORD -eq 1 ] ; then
2009-11-04 00:24:28 +02:00
COMPREPLY = ( $( compgen -W ' auto barf eroute klipsdebug look manual \
pluto ranbits rsasigkey setup showdefaults showhostkey spi spigrp \
tncfg whack' -- " $cur " ) )
2009-10-04 19:42:50 +02:00
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
2005-07-07 23:36:51 +00:00
} &&
complete -F _ipsec ipsec
2000-08-11 21:20:41 +00:00
2002-10-05 05:52:37 +00:00
# This function provides simple user@host completion
2002-07-22 16:57:28 +00:00
#
_user_at_host( ) {
2009-10-04 19:42:50 +02:00
local cur
2002-07-22 16:57:28 +00:00
2009-10-04 19:42:50 +02:00
COMPREPLY = ( )
2009-11-22 22:22:35 +01:00
cur = ` _get_cword :`
2002-07-22 16:57:28 +00:00
2009-10-04 19:42:50 +02:00
if [ [ $cur = = *@* ] ] ; then
_known_hosts_real " $cur "
else
COMPREPLY = ( $( compgen -u -- " $cur " ) )
fi
2002-07-22 16:57:28 +00:00
2009-10-04 19:42:50 +02:00
return 0
2002-07-22 16:57:28 +00:00
}
2009-10-22 12:04:29 +03:00
shopt -u hostcomplete && complete -F _user_at_host -o nospace talk ytalk finger
2002-07-22 16:57:28 +00:00
2009-07-25 13:38:42 +03:00
# NOTE: Using this function as a helper function is deprecated. Use
2009-06-13 23:54:14 +02:00
# `_known_hosts_real' instead.
2000-09-25 21:38:11 +00:00
_known_hosts( )
2009-05-03 15:18:31 +02:00
{
2009-10-04 19:42:50 +02:00
local options
COMPREPLY = ( )
# NOTE: Using `_known_hosts' as a helper function and passing options
# to `_known_hosts' is deprecated: Use `_known_hosts_real' instead.
2009-11-23 20:08:52 +02:00
[ [ " $1 " = = -a || " $2 " = = -a ] ] && options = -a
[ [ " $1 " = = -c || " $2 " = = -c ] ] && options = " $options -c "
2009-11-22 22:22:35 +01:00
_known_hosts_real $options " $( _get_cword :) "
2009-10-18 12:38:04 +02:00
} # _known_hosts()
2009-05-03 15:18:31 +02:00
2009-06-13 08:38:52 +02:00
# Helper function for completing _known_hosts.
2009-12-13 11:28:14 +02:00
# This function performs host completion based on ssh's config and known_hosts
# files, as well as hostnames reported by avahi-browse. Also hosts from
# HOSTFILE (compgen -A hostname) are added, unless
2009-08-12 22:28:42 +02:00
# COMP_KNOWN_HOSTS_WITH_HOSTFILE is set to an empty value.
2009-07-03 22:28:13 +02:00
# 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[]
2009-05-03 15:18:31 +02:00
_known_hosts_real( )
2000-08-29 00:41:27 +00:00
{
2009-10-04 19:42:50 +02:00
local configfile flag prefix
2009-12-13 11:31:06 +02:00
local cur curd awkcur user suffix aliases i host
2009-10-04 19:42:50 +02:00
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:" \
2009-12-21 00:09:02 +02:00
$( while [ $# -ge $OPTIND ] ; do printf '%s\n' ${ !OPTIND } ; shift; done )
2009-10-04 19:42:50 +02:00
[ [ $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
2009-11-26 23:46:36 +02:00
# Known hosts files from configs
2009-10-04 19:42:50 +02:00
if [ ${# config [@] } -gt 0 ] ; then
local OIFS = $IFS IFS = $'\n'
2009-11-26 21:53:02 +02:00
local -a tmpkh
# expand paths (if present) to global and user known hosts files
2009-11-26 23:30:04 +02:00
# TODO(?): try to make known hosts files with more than one consecutive
# spaces in their name work (watch out for ~ expansion
# breakage! Alioth#311595)
2010-01-17 10:41:13 +01:00
tmpkh = ( $( awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' " ${ config [@] } " | sort -u ) )
2009-11-28 17:44:33 +01:00
for i in " ${ tmpkh [@] } " ; do
2009-11-29 14:42:42 +01:00
# Remove possible quotes
i = ${ i // \" }
2009-12-02 22:38:30 +01:00
# Eval/expand possible `~' or `~user'
__expand_tilde_by_ref i
2009-11-26 21:53:02 +02:00
[ -r " $i " ] && kh = ( " ${ kh [@] } " " $i " )
2009-10-04 19:42:50 +02:00
done
IFS = $OIFS
fi
# Global known_hosts files
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
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
2009-12-13 11:41:55 +02:00
if [ [ ${# kh [@] } -gt 0 || ${# khd [@] } -gt 0 ] ] ; then
2009-10-04 19:42:50 +02:00
# 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
2009-10-20 20:05:30 +03:00
COMPREPLY = ( " ${ COMPREPLY [@] } " $( awk ' BEGIN { FS = "," }
2009-10-04 19:42:50 +02:00
/^\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
2010-01-06 09:31:31 +01:00
if [ [ " $i " = = *key_22_$curd *.pub && -r " $i " ] ] ; then
2009-10-04 19:42:50 +02:00
host = ${ i /#*key_22_/ }
host = ${ host /%.pub/ }
COMPREPLY = ( " ${ COMPREPLY [@] } " $host )
fi
done
fi
# apply suffix and prefix
for ( ( i = 0; i < ${# COMPREPLY [@] } ; i++ ) ) ; do
COMPREPLY[ i] = $prefix $user ${ COMPREPLY [i] } $suffix
done
fi
2009-12-13 11:41:55 +02:00
# append any available aliases from config files
if [ [ ${# config [@] } -gt 0 && -n " $aliases " ] ] ; then
2010-01-04 18:00:46 +02:00
local hosts = $( sed -ne 's/^[ \t]*[Hh][Oo][Ss][Tt]\([Nn][Aa][Mm][Ee]\)\{0,1\}[' " $'\t ' " ']\{1,\}\([^#*?]*\)\(#.*\)\{0,1\}$/\2/p' " ${ config [@] } " )
2009-12-13 11:41:55 +02:00
COMPREPLY = ( " ${ COMPREPLY [@] } " $( compgen -P " $prefix $user " \
-S " $suffix " -W " $hosts " -- " $cur " ) )
fi
2009-12-13 11:33:54 +02:00
# Add hosts reported by avahi-browse, if it's available.
# 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
COMPREPLY = ( " ${ COMPREPLY [@] } " $( \
compgen -P " $prefix $user " -S " $suffix " -W \
" $( avahi-browse -cpr _workstation._tcp 2>/dev/null | \
2010-01-03 21:18:41 +02:00
awk -F';' '/^=/ { print $7 }' | sort -u ) " -- " $cur " ) )
2009-12-13 11:33:54 +02:00
fi
2009-12-13 11:28:14 +02:00
# Add results of normal hostname completion, unless
# `COMP_KNOWN_HOSTS_WITH_HOSTFILE' is set to an empty value.
2009-10-04 19:42:50 +02:00
if [ -n " ${ COMP_KNOWN_HOSTS_WITH_HOSTFILE -1 } " ] ; then
2009-12-13 11:28:14 +02:00
COMPREPLY = ( " ${ COMPREPLY [@] } "
$( compgen -A hostname -P " $prefix $user " -S " $suffix " -- " $cur " ) )
2009-10-04 19:42:50 +02:00
fi
2009-11-22 22:22:35 +01:00
__ltrim_colon_completions " $prefix $user $cur "
2009-10-04 19:42:50 +02:00
return 0
2009-10-18 12:38:04 +02:00
} # _known_hosts_real()
2009-11-04 00:24:28 +02:00
complete -F _known_hosts traceroute traceroute6 tracepath tracepath6 ping \
ping6 fping fping6 telnet host nslookup rsh rlogin ftp dig mtr \
2010-01-26 23:33:24 +02:00
ssh-installkeys showmount
2000-09-25 21:38:11 +00:00
2001-03-05 19:12:48 +00:00
# This meta-cd function observes the CDPATH variable, so that cd additionally
# completes on directories under those specified in CDPATH.
#
_cd( )
{
2009-10-04 19:42:50 +02:00
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 ../
2009-11-23 20:08:52 +02:00
if [ [ -z " ${ CDPATH :- } " || " $cur " = = ?( .) ?( .) /* ] ] ; then
2009-10-04 19:42:50 +02:00
_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] }
2009-11-23 20:08:52 +02:00
if [ [ " $i " = = " $cur " && $i != "*/" ] ] ; then
2009-10-04 19:42:50 +02:00
COMPREPLY[ 0] = " ${ i } / "
fi
fi
return 0
2001-03-05 19:12:48 +00:00
}
2003-01-13 02:30:37 +00:00
if shopt -q cdable_vars; then
2009-10-22 12:04:29 +03:00
complete -v -F _cd -o nospace cd
2003-01-13 02:30:37 +00:00
else
2009-10-22 12:04:29 +03:00
complete -F _cd -o nospace cd
2003-01-13 02:30:37 +00:00
fi
2001-07-09 00:55:01 +00:00
2009-02-12 22:12:20 +01:00
# a wrapper method for the next one, when the offset is unknown
_command( )
{
2009-10-04 19:42:50 +02:00
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
2008-06-23 11:33:52 +02:00
}
2002-01-18 15:54:22 +00:00
# A meta-command completion function for commands like sudo(8), which need to
# first complete on a command, then complete according to that command's own
2002-01-23 23:13:21 +00:00
# completion definition - currently not quite foolproof (e.g. mount and umount
2005-01-19 03:19:45 +00:00
# don't work properly), but still quite useful.
2002-01-18 15:54:22 +00:00
#
2009-02-12 22:12:20 +01:00
_command_offset( )
2002-01-18 15:54:22 +00:00
{
2009-10-04 19:42:50 +02:00
local cur func cline cspec noglob cmd i char_offset word_offset \
2009-11-04 00:24:28 +02:00
_COMMAND_FUNC _COMMAND_FUNC_ARGS
2009-10-04 19:42:50 +02:00
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
2009-10-04 19:46:01 +02:00
$func $cmd " ${ COMP_WORDS [ ${# COMP_WORDS [@] } -1] } " " ${ COMP_WORDS [ ${# COMP_WORDS [@] } -2] } "
2009-10-04 19:42:50 +02:00
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
2002-01-18 15:54:22 +00:00
}
2009-10-22 12:04:29 +03:00
complete -F _command -o filenames nohup exec nice eval time ltrace then \
2009-10-04 19:42:50 +02:00
else do vsound command xargs tsocks
2002-01-18 15:54:22 +00:00
2002-02-26 22:21:39 +00:00
_root_command( )
{
2009-10-04 19:42:50 +02:00
PATH = $PATH :/sbin:/usr/sbin:/usr/local/sbin _command $1 $2 $3
2002-02-26 22:21:39 +00:00
}
2009-10-22 12:04:29 +03:00
complete -F _root_command -o filenames sudo fakeroot really gksudo gksu kdesudo
2002-02-26 22:21:39 +00:00
2002-02-16 00:13:00 +00:00
_longopt( )
{
2009-10-04 19:42:50 +02:00
local cur prev
cur = ` _get_cword`
prev = ${ COMP_WORDS [COMP_CWORD-1] }
if _split_longopt; then
case " $prev " in
*[ Dd] [ Ii] [ Rr] *)
_filedir -d
; ;
*[ Ff] [ Ii] [ Ll] [ Ee] *)
_filedir
; ;
esac
return 0
fi
if [ [ " $cur " = = -* ] ] ; then
2009-11-03 22:28:10 +02:00
COMPREPLY = ( $( compgen -W " $( $1 --help 2>& 1 | \
sed -ne 's/.*\(--[-A-Za-z0-9]\{1,\}\).*/\1/p' | sort -u ) " \
2009-10-04 19:42:50 +02:00
-- " $cur " ) )
elif [ [ " $1 " = = rmdir ] ] ; then
_filedir -d
else
_filedir
fi
2002-02-16 00:13:00 +00:00
}
2005-01-16 17:42:01 +00:00
# makeinfo and texi2dvi are defined elsewhere.
2002-02-18 17:26:54 +00:00
for i in a2ps autoconf automake bc gprof ld nm objcopy objdump readelf strip \
2009-11-21 14:38:41 +01:00
bison colordiff diff patch enscript cp df dir du ln ls mkfifo mknod mv rm \
2009-10-04 19:42:50 +02:00
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 \
2010-04-21 23:45:39 +03:00
uniq wc ldd bash id irb mkdir rmdir wget curl; do
2009-10-22 12:04:29 +03:00
have $i && complete -F _longopt -o filenames $i
2005-01-16 17:42:01 +00:00
done
2009-05-29 23:14:23 +03:00
# These commands do not use filenames, so '-o filenames' is not needed.
2010-04-13 18:40:14 +03:00
for i in env netstat seq uname units; do
2009-10-22 12:04:29 +03:00
have $i && complete -F _longopt -o default $i
mkdir and rmdir now bound to _longopt(), default to dirnames
a2ps, autoconf, automake, bc, gprof, ld, nm, objcopy, objdump, readelf, strip,
bison, cpio, diff, patch, enscript, cp, df, dir, du, ln, ls, mkfifo, mknod,
mv, rm, touch, vdir, xargs, awk, gperf, grep, gpg, grub, indent, less, m4,
sed, shar, date, env, seq, su, tee, uname, who, texindex, cat, csplit, cut,
expand, fmt, fold, head, md5sum, nl, od, paste, pr, ptx, sha1sum, sort,
split, tac, tail, tr, unexpand, uniq, wc, units and rsync now all have
GNU long option completion from _longopt()
gpc completion added into _gcc()
cat, less, more, ln and strip no longer bound to _filedir()
2002-02-18 08:26:34 +00:00
done
unset i
2002-10-23 14:05:16 +00:00
# look(1) completion
#
2008-05-06 20:20:14 +01:00
have look &&
2002-10-23 14:05:16 +00:00
_look( )
{
2009-10-04 19:42:50 +02:00
local cur
2008-05-06 20:20:14 +01:00
2009-10-04 19:42:50 +02:00
COMPREPLY = ( )
cur = ` _get_cword`
2002-10-23 14:05:16 +00:00
2009-10-04 19:42:50 +02:00
if [ $COMP_CWORD = 1 ] ; then
2010-01-16 16:06:48 +02:00
COMPREPLY = ( $( compgen -W '$(look "$cur" 2>/dev/null)' -- " $cur " ) )
2009-10-04 19:42:50 +02:00
fi
2005-07-07 23:36:51 +00:00
} &&
2009-10-22 12:04:29 +03:00
complete -F _look -o default look
2002-10-23 14:05:16 +00:00
2005-07-11 22:19:05 +00:00
# id(1) completion
#
2005-07-12 17:13:02 +00:00
have id &&
2005-07-11 22:19:05 +00:00
_id( )
{
2009-10-04 19:42:50 +02:00
local cur
2005-07-11 22:19:05 +00:00
2009-10-04 19:42:50 +02:00
COMPREPLY = ( )
cur = ` _get_cword`
2005-07-11 22:19:05 +00:00
2009-10-04 19:42:50 +02:00
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
2005-07-11 22:19:05 +00:00
} &&
complete -F _id id
2002-01-23 23:36:30 +00:00
_filedir_xspec( )
2001-12-20 07:52:12 +00:00
{
2009-10-04 19:42:50 +02:00
local IFS cur xspec
IFS = $'\t\n'
COMPREPLY = ( )
cur = ` _get_cword`
_expand || return 0
# get first exclusion compspec that matches this command
2010-01-19 19:09:15 +02:00
xspec = $( awk " /^complete[ \t]+.*[ \t] ${ 1 ##*/ } ([ \t]|\$)/ { print \$0; exit } " \
2010-02-02 11:16:29 +02:00
" $BASH_COMPLETION " )
2009-10-04 19:42:50 +02:00
# 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
2009-12-21 00:09:02 +02:00
printf '%s\n' $tmp
2009-10-04 19:42:50 +02:00
done
}
) )
toks = ( ${ toks [@]- } $(
eval compgen -f -X " $xspec " -- "\$(quote_readline " \$ cur")" | {
while read -r tmp; do
2009-12-21 00:09:02 +02:00
[ -n $tmp ] && printf '%s\n' $tmp
2009-10-04 19:42:50 +02:00
done
}
) )
COMPREPLY = ( " ${ toks [@] } " )
2001-12-20 07:52:12 +00:00
}
2010-02-02 11:16:29 +02:00
list = ( $( sed -ne '/^# START exclude/,/^# FINISH exclude/p' " $BASH_COMPLETION " | \
2009-10-04 19:42:50 +02:00
# 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
2009-12-21 00:09:02 +02:00
printf '%s ' " ${ list [@] } "
2009-10-04 19:42:50 +02:00
)
) )
2001-12-20 07:52:12 +00:00
# remove previous compspecs
2002-01-03 00:16:41 +00:00
if [ ${# list [@] } -gt 0 ] ; then
eval complete -r ${ list [@] }
# install new compspecs
2009-10-22 12:04:29 +03:00
eval complete -F _filedir_xspec -o filenames " ${ list [@] } "
2002-01-03 00:16:41 +00:00
fi
2003-02-26 00:17:54 +00:00
unset list
2002-03-08 18:50:24 +00:00
# source completion directory definitions
2009-11-23 20:08:52 +02:00
if [ [ -d $BASH_COMPLETION_COMPAT_DIR && -r $BASH_COMPLETION_COMPAT_DIR && \
-x $BASH_COMPLETION_COMPAT_DIR ] ] ; then
2010-02-02 11:16:29 +02:00
for i in $( LC_ALL = C command ls " $BASH_COMPLETION_COMPAT_DIR " ) ; do
2009-10-21 20:43:44 +03:00
i = $BASH_COMPLETION_COMPAT_DIR /$i
2009-11-23 20:08:52 +02:00
[ [ ${ i ##*/ } != @( *~| *.bak| *.swp| \# *\# | *.dpkg*| *.rpm@( orig| new| save) ) \
2010-02-02 11:16:29 +02:00
&& ( -f $i || -h $i ) && -r $i ] ] && . " $i "
2009-10-04 19:42:50 +02:00
done
2009-02-20 22:58:01 +01:00
fi
2009-11-23 20:08:52 +02:00
if [ [ $BASH_COMPLETION_DIR != $BASH_COMPLETION_COMPAT_DIR && \
-d $BASH_COMPLETION_DIR && -r $BASH_COMPLETION_DIR && \
-x $BASH_COMPLETION_DIR ] ] ; then
2010-02-02 11:16:29 +02:00
for i in $( LC_ALL = C command ls " $BASH_COMPLETION_DIR " ) ; do
2009-10-21 20:43:44 +03:00
i = $BASH_COMPLETION_DIR /$i
2009-11-23 20:08:52 +02:00
[ [ ${ i ##*/ } != @( *~| *.bak| *.swp| \# *\# | *.dpkg*| *.rpm@( orig| new| save) ) \
2010-02-02 11:16:29 +02:00
&& ( -f $i || -h $i ) && -r $i ] ] && . " $i "
2009-10-04 19:42:50 +02:00
done
2009-01-29 15:10:18 +01:00
fi
2002-04-02 23:37:51 +00:00
unset i
2001-12-05 16:32:24 +00:00
# source user completion file
2009-11-23 20:08:52 +02:00
[ [ $BASH_COMPLETION != ~/.bash_completion && -r ~/.bash_completion ] ] \
2009-10-04 19:42:50 +02:00
&& . ~/.bash_completion
2001-07-08 23:14:13 +00:00
unset -f have
2009-10-31 14:38:17 +02:00
unset UNAME USERLAND have
2002-03-29 02:35:42 +00:00
2008-06-23 12:03:06 +02:00
set $BASH_COMPLETION_ORIGINAL_V_VALUE
unset BASH_COMPLETION_ORIGINAL_V_VALUE
2009-10-01 20:54:51 +03:00
# Local variables:
# mode: shell-script
2009-10-04 19:42:50 +02:00
# sh-basic-offset: 4
2009-10-01 20:54:51 +03:00
# sh-indent-comment: t
2009-10-04 19:42:50 +02:00
# indent-tabs-mode: nil
2009-10-01 20:54:51 +03:00
# End:
2009-10-04 19:42:50 +02:00
# ex: ts=4 sw=4 et filetype=sh