brew/Library/Contributions/brew_bash_completion.sh
Xu Cheng ca458a8ed1 shell completion: support external commands
Closes Homebrew/homebrew#41519.

Signed-off-by: Xu Cheng <xucheng@me.com>
2015-07-11 00:07:29 +08:00

640 lines
14 KiB
Bash

# Bash completion script for brew(1)
#
# To use, add the following to your .bashrc:
#
# . $(brew --repository)/Library/Contributions/brew_bash_completion.sh
#
# Alternatively, if you have installed the bash-completion package,
# you can create a symlink to this file in one of the following directories:
#
# $(brew --prefix)/etc/bash_completion.d
# $(brew --prefix)/share/bash-completion/completions
#
# Installing to etc/bash_completion.d will cause bash-completion to load
# it automatically at shell startup time. If you choose to install it to
# share/bash-completion/completions, it will be loaded on-demand (i.e. the
# first time you invoke the `brew` command in a shell session).
__brewcomp_words_include ()
{
local i=1
while [[ $i -lt $COMP_CWORD ]]; do
if [[ "${COMP_WORDS[i]}" = "$1" ]]; then
return 0
fi
i=$((++i))
done
return 1
}
# Find the previous non-switch word
__brewcomp_prev ()
{
local idx=$((COMP_CWORD - 1))
local prv="${COMP_WORDS[idx]}"
while [[ $prv == -* ]]; do
idx=$((--idx))
prv="${COMP_WORDS[idx]}"
done
echo "$prv"
}
__brewcomp ()
{
# break $1 on space, tab, and newline characters,
# and turn it into a newline separated list of words
local list s sep=$'\n' IFS=$' '$'\t'$'\n'
local cur="${COMP_WORDS[COMP_CWORD]}"
for s in $1; do
__brewcomp_words_include "$s" && continue
list="$list$s$sep"
done
IFS=$sep
COMPREPLY=($(compgen -W "$list" -- "$cur"))
}
# Don't use __brewcomp() in any of the __brew_complete_foo functions, as
# it is too slow and is not worth it just for duplicate elimination.
__brew_complete_formulae ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local lib=$(brew --repository)/Library
local taps=${lib}/Taps
local ff=$(\ls ${lib}/Formula 2>/dev/null | sed 's/\.rb//g')
local af=$(\ls ${lib}/Aliases 2>/dev/null)
local tf file
for file in ${taps}/*/*/*.rb ${taps}/*/*/Formula/*.rb ${taps}/*/*/HomebrewFormula/*.rb; do
[ -f "$file" ] || continue
file=${file/"Formula/"/}
file=${file/"HomebrewFormula/"/}
file=${file#${lib}/Taps/}
file=${file%.rb}
file=${file/homebrew-/}
tf="${tf} ${file}"
done
COMPREPLY=($(compgen -W "$ff $af $tf" -- "$cur"))
}
__brew_complete_installed ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local inst=$(\ls $(brew --cellar))
COMPREPLY=($(compgen -W "$inst" -- "$cur"))
}
__brew_complete_outdated ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local od=$(brew outdated --quiet)
COMPREPLY=($(compgen -W "$od" -- "$cur"))
}
__brew_complete_versions ()
{
local formula="$1"
local versions=$(brew list --versions "$formula")
local cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=($(compgen -W "$versions" -X "$formula" -- "$cur"))
}
__brew_complete_logs ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local logs=$(ls ${HOMEBREW_LOGS:-~/Library/Logs/Homebrew/})
COMPREPLY=($(compgen -W "$logs" -- "$cur"))
}
_brew_switch ()
{
case "$COMP_CWORD" in
2) __brew_complete_installed ;;
3) __brew_complete_versions "${COMP_WORDS[COMP_CWORD-1]}" ;;
*) ;;
esac
}
__brew_complete_tapped ()
{
local taplib=$(brew --repository)/Library/Taps
local dir taps
for dir in ${taplib}/*/*; do
[ -d "$dir" ] || continue
dir=${dir#${taplib}/}
dir=${dir/homebrew-/}
taps="$taps $dir"
done
__brewcomp "$taps"
}
_brew_complete_tap ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--repair"
return
;;
esac
}
_brew_bottle ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--merge --rb --write --root_url="
return
;;
esac
__brew_complete_installed
}
_brew_cleanup ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--force"
return
;;
esac
__brew_complete_installed
}
_brew_create ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--autotools --cmake --no-fetch --set-name --set-version"
return
;;
esac
}
_brew_deps ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--1 --all --tree"
return
;;
esac
__brew_complete_formulae
}
_brew_doctor () {
local cur="${COMP_WORDS[COMP_CWORD]}"
__brewcomp "$(brew doctor --list-checks)"
}
_brew_diy ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--set-name --set-version"
return
;;
esac
}
_brew_fetch ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv=$(__brewcomp_prev)
case "$cur" in
--*)
__brewcomp "
--deps --force
--devel --HEAD
--build-from-source --force-bottle --build-bottle
--retry
$(brew options --compact "$prv" 2>/dev/null)
"
return
;;
esac
__brew_complete_formulae
}
_brew_gist_logs ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--new-issue"
return
;;
esac
__brew_complete_logs
}
_brew_info ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--all --github --installed --json=v1"
return
;;
esac
__brew_complete_formulae
}
_brew_install ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv=$(__brewcomp_prev)
case "$cur" in
--*)
if __brewcomp_words_include "--interactive"; then
__brewcomp "--devel --git --HEAD"
else
__brewcomp "
--build-from-source --build-bottle --force-bottle
--debug
--devel
--HEAD
--ignore-dependencies
--interactive
--only-dependencies
--verbose
$(brew options --compact "$prv" 2>/dev/null)
"
fi
return
;;
esac
__brew_complete_formulae
}
_brew_irb ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--examples"
return
;;
esac
}
_brew_link ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--dry-run --overwrite --force"
return
;;
esac
__brew_complete_installed
}
_brew_linkapps ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--local"
return
;;
esac
}
_brew_list ()
{
local allopts="--unbrewed --verbose --pinned --versions --multiple"
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
# most options to brew-list are mutually exclusive
if __brewcomp_words_include "--unbrewed"; then
return
elif __brewcomp_words_include "--verbose"; then
return
elif __brewcomp_words_include "--pinned"; then
return
# --multiple only applies with --versions
elif __brewcomp_words_include "--multiple"; then
__brewcomp "--versions"
return
elif __brewcomp_words_include "--versions"; then
__brewcomp "--multiple"
return
else
__brewcomp "$allopts"
return
fi
;;
esac
# --multiple excludes formulae and *implies* --versions...
if __brewcomp_words_include "--multiple"; then
__brewcomp "--versions"
else
__brew_complete_installed
fi
}
_brew_log ()
{
# if git-completion is loaded, then we complete git-log options
declare -F _git_log >/dev/null || return
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "
$__git_log_common_options
$__git_log_shortlog_options
$__git_log_gitk_options
$__git_diff_common_options
--walk-reflogs --graph --decorate
--abbrev-commit --oneline --reverse
"
return
;;
esac
__brew_complete_formulae
}
_brew_man ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--link --server --verbose"
return
;;
esac
}
_brew_options ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--all --compact --installed"
return
;;
esac
__brew_complete_formulae
}
_brew_outdated ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--quiet --json=v1"
return
;;
esac
}
_brew_postinstall ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--debug --sandbox"
return
;;
esac
__brew_complete_installed
}
_brew_prune ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--dry-run --verbose"
return
;;
esac
}
_brew_pull ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--bottle --bump --clean --ignore-whitespace --install --resolve"
return
;;
esac
}
_brew_readall ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--syntax"
return
;;
esac
__brew_complete_tapped
}
_brew_search ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--debian --desc --fedora --fink --macports --opensuse --ubuntu"
return
;;
esac
}
_brew_style ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--fix --homebrew-developer"
return
;;
esac
__brew_complete_formulae
}
_brew_tap_readme ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--verbose"
return
;;
esac
}
_brew_tests ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--verbose"
return
;;
esac
}
_brew_uninstall ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--force"
return
;;
esac
__brew_complete_installed
}
_brew_unpack ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--git --patch --destdir="
return
;;
esac
__brew_complete_formulae
}
_brew_update ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--rebase --verbose"
return
;;
esac
}
_brew_upgrade ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv=$(__brewcomp_prev)
case "$cur" in
--*)
__brewcomp "
--all
--build-from-source --build-bottle --force-bottle
--debug
--verbose
"
return
;;
esac
__brew_complete_outdated
}
_brew_uses ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
__brewcomp "--installed --recursive"
return
;;
esac
__brew_complete_formulae
}
_brew ()
{
local i=1 cmd
# find the subcommand
while [[ $i -lt $COMP_CWORD ]]; do
local s="${COMP_WORDS[i]}"
case "$s" in
--*)
cmd="$s"
break
;;
-*)
;;
*)
cmd="$s"
break
;;
esac
i=$((++i))
done
if [[ $i -eq $COMP_CWORD ]]; then
__brewcomp "$(brew commands --quiet --include-aliases)"
return
fi
# subcommands have their own completion functions
case "$cmd" in
--cache|--cellar|--prefix) __brew_complete_formulae ;;
audit|cat|edit|home) __brew_complete_formulae ;;
test|unlink) __brew_complete_installed ;;
bottle) _brew_bottle ;;
cleanup) _brew_cleanup ;;
create) _brew_create ;;
deps) _brew_deps ;;
doctor|dr) _brew_doctor ;;
diy|configure) _brew_diy ;;
fetch) _brew_fetch ;;
gist-logs) _brew_gist_logs ;;
info|abv) _brew_info ;;
install|instal|reinstall) _brew_install ;;
irb) _brew_irb ;;
link|ln) _brew_link ;;
linkapps) _brew_linkapps ;;
list|ls) _brew_list ;;
log) _brew_log ;;
man) _brew_man ;;
missing) __brew_complete_formulae ;;
options) _brew_options ;;
outdated) _brew_outdated ;;
pin) __brew_complete_formulae ;;
postinstall) _brew_postinstall ;;
prune) _brew_prune ;;
pull) _brew_pull ;;
readall) _brew_readall ;;
search|-S) _brew_search ;;
style) _brew_style ;;
switch) _brew_switch ;;
tap) _brew_complete_tap ;;
tap-readme) _brew_tap_readme ;;
tests) _brew_tests ;;
uninstall|remove|rm) _brew_uninstall ;;
unpack) _brew_unpack ;;
unpin) __brew_complete_formulae ;;
untap|tap-info) __brew_complete_tapped ;;
update) _brew_update ;;
upgrade) _brew_upgrade ;;
uses) _brew_uses ;;
*) ;;
esac
}
# keep around for compatibility
_brew_to_completion ()
{
_brew
}
complete -o bashdefault -o default -F _brew brew