diff options
-rw-r--r-- | README.markdown | 1 | ||||
-rw-r--r-- | bash/bash_completion.d/find.bash | 85 |
2 files changed, 86 insertions, 0 deletions
diff --git a/README.markdown b/README.markdown index 2b73547a..27bdfccb 100644 --- a/README.markdown +++ b/README.markdown @@ -228,6 +228,7 @@ I do make some exceptions with completions defined in `.bash_completion.d` files, for things I really do get tired of typing repeatedly: * Bash builtins: commands, help topics, shell options, variables, etc. +* `find(1)`'s more portable options * `ftp(1)` hostnames from `~/.netrc` * `git(1)` branch names * `gpg(1)` long options diff --git a/bash/bash_completion.d/find.bash b/bash/bash_completion.d/find.bash new file mode 100644 index 00000000..94305a8e --- /dev/null +++ b/bash/bash_completion.d/find.bash @@ -0,0 +1,85 @@ +# 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 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 + while read -r item ; do + [[ -n $item ]] || continue + COMPREPLY[${#COMPREPLY[@]}]=$item + 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 + -*) + compgen -W ' + -atime + -ctime + -depth + -exec + -group + -links + -mtime + -name + -newer + -nogroup + -nouser + -ok + -perm + -print + -prune + -size + -type + -user + -xdev + ' -- "${COMP_WORDS[COMP_CWORD]}" + ;; + esac + + # Otherwise, look at the word *before* this one to figure out what to + # complete + case "${COMP_WORDS[COMP_CWORD-1]}" 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]}" + ;; + + # Legal POSIX flags for -type + -type) + compgen -W 'b c d f l p s' -- "${COMP_WORDS[COMP_CWORD]}" + ;; + + # Args to -user should complete usernames + -user) + compgen -A user -- "${COMP_WORDS[COMP_CWORD]}" + ;; + esac + ) +} +complete -F _find find |