diff options
Diffstat (limited to 'completions/find')
-rw-r--r-- | completions/find | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/completions/find b/completions/find new file mode 100644 index 0000000..64121ed --- /dev/null +++ b/completions/find @@ -0,0 +1,113 @@ +# bash completion for GNU find -*- shell-script -*- +# 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 words cword + _init_completion || return + + local i + for i in ${!words[*]}; do + if [[ ${words[i]} == -@(exec|ok)?(dir) ]]; then + _command_offset $((i + 1)) + return + fi + done + + case $prev in + -maxdepth | -mindepth) + COMPREPLY=($(compgen -W '{0..9}' -- "$cur")) + return + ;; + -newer | -anewer | -cnewer | -fls | -fprint | -fprint0 | -fprintf | -name | -[il]name | \ + -ilname | -wholename | -[il]wholename | -samefile) + _filedir + return + ;; + -fstype) + _fstypes + [[ $OSTYPE == *bsd* ]] && + COMPREPLY+=($(compgen -W 'local rdonly' -- "$cur")) + return + ;; + -gid) + _gids + return + ;; + -group) + COMPREPLY=($(compgen -g -- "$cur" 2>/dev/null)) + return + ;; + -xtype | -type) + COMPREPLY=($(compgen -W 'b c d p f l s' -- "$cur")) + return + ;; + -uid) + _uids + return + ;; + -user) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + -[acm]min | -[acm]time | -inum | -path | -ipath | -regex | -iregex | -links | -perm | \ + -size | -used | -printf | -context) + # do nothing, just wait for a parameter to be given + return + ;; + -regextype) + COMPREPLY=($(compgen -W 'emacs posix-awk posix-basic posix-egrep + posix-extended' -- "$cur")) + return + ;; + esac + + local i exprfound=false + # set exprfound to true if there is already an expression present + for i in "${words[@]}"; do + [[ $i == [-\(\),\!]* ]] && exprfound=true && break + done + + # handle case where first parameter is not a dash option + if ! $exprfound && [[ $cur != [-\(\),\!]* ]]; then + _filedir -d + return + fi + + # complete using basic options + COMPREPLY=($(compgen -W '-daystart -depth -follow -help + -ignore_readdir_race -maxdepth -mindepth -mindepth -mount + -noignore_readdir_race -noleaf -regextype -version -warn -nowarn -xdev + -amin -anewer -atime -cmin -cnewer -ctime -empty -executable -false + -fstype -gid -group -ilname -iname -inum -ipath -iregex -iwholename + -links -lname -mmin -mtime -name -newer -nogroup -nouser -path -perm + -readable -regex -samefile -size -true -type -uid -used -user + -wholename -writable -xtype -context -delete -exec -execdir -fls + -fprint -fprint0 -fprintf -ls -ok -okdir -print -print0 -printf -prune + -quit' -- "$cur")) + + if ((${#COMPREPLY[@]} != 0)); then + # 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). + local -A onlyonce=([-daystart]=1 [-depth]=1 [-follow]=1 [-help]=1 + [-ignore_readdir_race]=1 [-maxdepth]=1 [-mindepth]=1 [-mount]=1 + [-noignore_readdir_race]=1 [-noleaf]=1 [-nowarn]=1 [-regextype]=1 + [-version]=1 [-warn]=1 [-xdev]=1) + local j + for i in "${words[@]}"; do + [[ $i && -v onlyonce["$i"] ]] || continue + for j in "${!COMPREPLY[@]}"; do + [[ ${COMPREPLY[j]} == "$i" ]] && unset 'COMPREPLY[j]' + done + done + fi + + _filedir + +} && + complete -F _find find + +# ex: filetype=sh |