aboutsummaryrefslogtreecommitdiff
path: root/bash/bash_completion.d/find.bash
diff options
context:
space:
mode:
Diffstat (limited to 'bash/bash_completion.d/find.bash')
-rw-r--r--bash/bash_completion.d/find.bash70
1 files changed, 18 insertions, 52 deletions
diff --git a/bash/bash_completion.d/find.bash b/bash/bash_completion.d/find.bash
index 7e2ae9c3..f87029e7 100644
--- a/bash/bash_completion.d/find.bash
+++ b/bash/bash_completion.d/find.bash
@@ -1,42 +1,14 @@
-# compopt requires Bash >=4.0, and I don't think it's worth making a compatible
-# version
-((BASH_VERSINFO[0] >= 4)) || return
-
# Semi-intelligent completion for find(1); nothing too crazy
_find() {
- # Backtrack through words so far; if none of them look like options, we're
- # still completing directory names
- local i
- local -i opts
- for ((i = COMP_CWORD; i >= 0; i--)) ; do
- case ${COMP_WORDS[i]} in
- -*)
- opts=1
- break
- ;;
- esac
- done
- if ! ((opts)) ; then
- compopt -o dirnames
- return
- fi
-
- # For the rest of this, if we end up with an empty COMPREPLY, we should
- # just do what Bash would normally do
- compopt -o bashdefault -o default
-
- # Iterate through whatever the subshell gives us; don't add blank items, though
- local item
- while read -r item ; do
- [[ -n $item ]] || continue
- COMPREPLY+=("$item")
+ # Iterate through completions produced by subshell
+ local ci comp
+ while IFS= read -r comp ; do
+ COMPREPLY[ci++]=$comp
done < <(
- # If the word being completed starts with a dash, just complete it as
- # an option; crude, but simple, and will be right the vast majority of
- # the time
- case ${COMP_WORDS[COMP_CWORD]} in
+ # Complete POSIX-specified options
+ case $2 in
(-*)
compgen -W '
-atime
@@ -58,34 +30,28 @@ _find() {
-type
-user
-xdev
- ' -- "${COMP_WORDS[COMP_CWORD]}"
+ ' -- "$2"
+ return
;;
esac
- # Otherwise, look at the word *before* this one to figure out what to
+ # Look at the word *before* this one to figure out what to
# complete
- case ${COMP_WORDS[COMP_CWORD-1]} in
+ case $3 in
# Args to -exec and -execdir should be commands
- (-exec|-execdir)
- compgen -A command -- "${COMP_WORDS[COMP_CWORD]}"
- ;;
-
- # Args to -group should complete group names
- (-group)
- compgen -A group -- "${COMP_WORDS[COMP_CWORD]}"
- ;;
+ (-exec|-execdir) compgen -A command -- "$2" ;;
# Legal POSIX flags for -type
- (-type)
- compgen -W 'b c d f l p s' -- "${COMP_WORDS[COMP_CWORD]}"
- ;;
+ (-type) compgen -W 'b c d f l p s' -- "$2" ;;
+
+ # Args to -group should complete group names
+ (-group) compgen -A group -- "$2" ;;
# Args to -user should complete usernames
- (-user)
- compgen -A user -- "${COMP_WORDS[COMP_CWORD]}"
- ;;
+ (-user) compgen -A user -- "$2" ;;
+
esac
)
}
-complete -F _find find
+complete -F _find -o bashdefault -o default find