Joshua McKinney d624627885 Refactor and add commands to brew zsh completion
This is a full rewrite of the zsh completion based on the changes we
made to support external commands. A function for each brew command
handles only that command's arguments. The main completion function
dispatches the completion flow to the correct function. This
generically works with both internal and external commands.

This change includes all arguments for all internal brew commands.
Some commands are missing argument documentation due to missing help
docs.
2016-09-29 12:57:53 -04:00

828 lines
25 KiB
Plaintext

#compdef brew
#autoload
# Brew ZSH completion function
# functions starting with __brew are helper functions that complete or list
# various types of items.
# functions starting with _brew_ are completions for brew commands
# this mechanism can be extended by external commands by defining a function
# named _brew_<external-name>. See _brew_cask for an example of this.
# a list of aliased internal commands
__brew_list_aliases() {
local -a aliases
aliases=(
ls list
homepage home
'-S' search
up update
ln link
instal install
rm uninstall
remove uninstall
configure diy
abv info
dr doctor
'--repo' '--repository'
environment '--env'
'--config' config
'-v' '--version'
)
echo "${aliases}"
}
__brew_formulae() {
local -a formulae
formulae=($(brew search))
_describe -t formulae 'all formulae' formulae
}
__brew_installed_formulae() {
local -a formulae
formulae=($(brew list))
_describe -t formulae 'installed formulae' formulae
}
__brew_outdated_formulae() {
local -a formulae
formulae=($(brew outdated))
_describe -t formulae 'outdated formulae' formulae
}
__brew_installed_taps() {
local -a taps
taps=($(brew tap))
_describe -t installed-taps 'installed taps' taps
}
__brew_official_taps() {
local -a taps
taps=($(brew tap --list-official))
_describe -t official-taps 'official taps' taps
}
__brew_pinned_taps() {
local -a taps
taps=($(brew tap --list-pinned))
_describe -t pinned-taps 'pinned taps' taps
}
__brew_any_tap() {
_alternative \
'installed-taps:installed taps:__brew_installed_taps' \
'official-taps:official taps:__brew_official_taps'
}
__brew_common_commands() {
local -a commands
commands=(
'audit:check formulae for Homebrew coding style'
'cat:display formula file for a formula'
'cleanup:uninstall unused and old versions of packages'
'commands:show a list of commands'
'config:show homebrew and system configuration'
'create:create a new formula'
'deps:list dependencies and dependants of a formula'
'desc:display a description of a formula'
'doctor:audits your installation for common issues'
'edit:edit a formula'
'fetch:download formula resources to the cache'
'gist-logs:generate a gist of the full build logs'
'home:visit the homepage of a formula or the brew project'
'info:information about a formula'
'install:install a formula'
'reinstall:install a formula anew; re-using its current options'
'leaves:show installed formulae that are not dependencies of another installed formula'
'link:link a formula'
'linkapps:symlink .app bundles provided by formulae into /Applications'
'list:list files in a formula or not-installed formulae'
'log:git commit log for a formula'
'missing:check all installed formuale for missing dependencies.'
'migrate:migrate renamed formula to new name'
'outdated:list formulae for which a newer version is available'
'pin:pin specified formulae'
'postinstall:perform post_install for a given formula'
'prune:remove dead links'
'remove:remove a formula'
'search:search for a formula (/regex/ or string)'
'switch:switch between different versions of a formula'
'tap:tap a new formula repository from GitHub, or list existing taps'
'tap-info:information about a tap'
'tap-pin:pin a tap'
'tap-unpin:unpin a tap'
'test-bot:test a formula and build a bottle'
'uninstall:uninstall a formula'
'unlink:unlink a formula'
'unlinkapps:remove symlinked .app bundles provided by formulae from /Applications'
'unpin:unpin specified formulae'
'untap:remove a tapped repository'
'update:fetch latest version of Homebrew and all formulae'
'upgrade:upgrade outdated formulae'
'uses:show formulae which depend on a formula'
'--cellar:brew cellar'
'--env:brew environment'
'--repository:brew repository'
'--version:version information'
'--prefix:where brew lives on this system'
'--cache:brew cache'
)
_describe -t common-commands 'common commands' commands
}
__brew_all_commands() {
local -a commands
commands=($(_call_program brew brew commands --quiet --include-aliases))
_describe -t all-commands 'all commands' commands
}
__brew_commands() {
# TODO remove duplicates between common and all commands
_alternative \
'common-commands:command:__brew_common_commands' \
'all-commands:command:__brew_all_commands'
}
# brew --cache
# brew --cache formula
_brew___cache() {
__brew_formulae
}
# brew --cellar
# brew --cellar formula
_brew___cellar() {
__brew_formulae
}
# brew --env
_brew___env() {
return 1
}
# brew --prefix
# brew --prefix formula
_brew___prefix() {
__brew_formulae
}
# brew --repository
# brew --repository user/repo
_brew___repository() {
__brew_any_tap
}
# brew --version
_brew___version() {
return 1
}
# brew analytics [state]
# brew analytics (on|off)
# brew analytics regenerate-uuid
_brew_analytics() {
_values 'analytics' \
'off[turn off analytics]' \
'on[turn on analytics]' \
'regenerate-uuid[regenerate UUID used in analytics]' \
'state[display anonymous user behaviour analytics state]'
}
# brew aspell_dictionaries
_brew_aspell_dictionaries() {
return 1
}
# brew audit [--strict] [--online] [--new-formula] [--display-cop-names] [--display-filename] [formulae]
_brew_audit() {
_arguments \
'(--new-formula)--strict[run additional checks including RuboCop style checks]' \
'(--new-formula)--online[run slower checks that require a network connection]' \
'(--online --strict)--new-formula[check if a new formula is eligable for Homebrew. Implies --strict and --online]' \
'--display-cop-names[include RuboCop cop name for each violation in the output]' \
'--display-filename[prefix every line of output with the name of the file or formula being audited]' \
'*:formula:__brew_formulae'
}
# brew boneyard-formula-pr [--dry-run] [--local] formula-name
_brew_boneyard_formula_pr() {
_arguments \
'--dry-run[print what would be done rather than doing it]' \
'--local[perform only local operations(i.e. don''t push or create PR)]' \
':formula:__brew_formulae'
}
# brew bottle [--verbose] [--no-rebuild] [--keep-old] [--skip-relocation] [--root-url=root_url]
# brew bottle --merge [--no-commit] [--keep-old] [--write]
# TODO missing argument docs
_brew_bottle() {
_arguments \
'--keep-old' \
- set1 \
'--verbose' \
'--no-rebuild' \
'--skip-relocation' \
'--root-url=' \
- set2 \
'--merge' \
'--no-commit' \
'--write'
}
# brew bump-formula-pr [--devel] [--dry-run] [--audit|--strict] --url=url --sha256=sha-256 formula
# brew bump-formula-pr [--devel] [--dry-run] [--audit|--strict] --tag=tag --revision=revision formula
_brew_bump_formula_pr() {
_arguments \
'--devel[bump the development rather than stable version]' \
'--dry-run[print what would be done rather than doing it]' \
'(--strict)--audit[run brew audit before opening the PR]' \
'(--audit)--strict[run brew audit --strict before opening the PR]' \
- set1 \
'--url=-[new url]:url:_urls' \
'--sha256=-[new sha256 checksum]:sha256: ' \
': :__brew_formulae' \
- set2 \
'--tag=-[new tag]: ' \
'--revision=-[new revision]: ' \
': :__brew_formulae'
}
# brew cat formula
_brew_cat() {
_arguments \
'1:: :__brew_formulae'
}
# brew cleanup [--prune=days] [--dry-run] [-s] [formulae]
_brew_cleanup() {
_arguments \
'--prune=-[remove all cache files older than days]:days: ' \
'(--dry-run,-n)'{--dry-run,-n}'[show what would be removed, but do not actually remove anything]' \
'-s[scrub cache]' \
'*::formula:__brew_formulae'
}
# brew command cmd
_brew_command() {
_arguments \
': :__brew_all_commands'
}
# brew commands [--quiet [--include-aliases]]
_brew_commands() {
_arguments '--quiet' && return 0
_arguments '--include-aliases'
}
# brew config
_brew_config() {
return 1
}
# brew create URL [--autotools|--cmake] [--no-fetch] [--set-name name] [--set-version version] [--tap user/repo]:
_brew_create() {
_arguments \
'(--cmake)--autotools[create a basic template for an Autotools-style build]' \
'(--autotools)--cmake[create a basic template for a CMake-style build]' \
'--no-fetch[don''t download URL to the cache]' \
'--set-name:name: ' \
'--set-version:version: ' \
'--tap:tap:__brew_installed_taps' \
':url:_urls'
}
# brew deps [--1] [-n] [--union] [--full-name] [--installed] [--include-build] [--include-optional] [--skip-recommended] formulae
# brew deps --tree [filters] (formulae|--installed)
# brew deps [filters] (--installed|--all)
# The filters placeholder is any combination of options --include-build, --include-optional, and --skip-recommended as documented above.
_brew_deps() {
_arguments \
'--include-build[include \:build dependencie]' \
'--include-optional[include \:optional dependencies]' \
'--skip-recommended[skip \:recommended type dependencies]' \
- formulae-deps \
'--1[only show dependencies one level down, instead of recursing]' \
'-n[show dependencies in topological order]' \
'--union[show the union of dependencies for formulae, instead of the intersection]' \
'--full-name[list dependencies by their full name]' \
'--installed[only list those dependencies that are currently installed]' \
'*:formulae:__brew_formulae' \
- tree-deps \
'--tree' \
'(*)--installed[output a tree for every installed formula]' \
'(--installed)*:formulae:__brew_formulae' \
- installed-all \
'(--all)--installed[show dependencies for installed formulae]' \
'(--installed)--all[Show dependencies for all available formulae]'
}
# brew desc formula
# brew desc [-s|-n|-d] pattern
_brew_desc() {
_arguments \
- desc-formula \
': : __brew_formulae' \
- desc-pattern \
'(-s -n -d)-s[search both name and description]' \
'(-s -n -d)-n[search only name]' \
'(-s -n -d)-d[search only description]' \
':pattern: '
}
# brew diy [--name=name] [--version=version]
_brew_diy() {
_arguments \
'--name=-:' \
'--version=-:'
}
# brew doctor
_brew_doctor() {
return 1
}
# brew edit
# brew edit formula
_brew_edit() {
_arguments \
':: :__brew_formulae'
}
# brew fetch [--force] [--retry] [-v] [--devel|--HEAD] [--deps] [--build-from-source|--force-bottle] formulae
_brew_fetch() {
_arguments \
'--force[remove previously cached version and re-fetch]' \
'--retry[retry if a download fails or re-download if the checksum of a previously cached version no longer matches]' \
'-v[verbose VCS checkout]' \
'(--HEAD)--devel[fetch devel version instead of stable]' \
'(--devel)--HEAD[fetch HEAD version instead of stable]' \
'--deps[also download dependencies for any listed formulae]' \
'(--force-bottle)--build-from-source[download the source rather than a bottle]' \
'(--build-from-source)--force-bottle[download a bottle if it exists for the current version of OS X, even if it would not be used during installation]' \
'*:formula:__brew_formulae'
}
# brew gist-logs [--new-issue|-n] formula
_brew_gist_logs() {
_arguments \
'(--new-issue -n)'{--new-issue,-n}'[automatically create a new issue in the appropriate GitHub repository]' \
':formula:__brew_formulae'
}
# brew help command
_brew_help() {
__brew_commands
}
# brew home
# brew home formula
_brew_home() {
__brew_formulae
}
# brew info formula
# brew info --github formula
# brew info --json=version (--all|--installed|formulae)
_brew_info() {
_arguments \
- formulae-opts \
': :__brew_formulae' \
- github-opts \
'--github[open a browser to the GitHub History page for formula]' \
': :__brew_formulae' \
- json-opts \
'--json=-[print a JSON representation of formulae]:version:(v1)' \
'(--all --installed :)--all[get information on all formulae]' \
'(--all --installed :)--installed[get information on installed formulae]' \
'(--all --installed): :__brew_formulae'
}
# brew install [--debug] [--env=std|super] [--ignore-dependencies]
# [--only-dependencies] [--cc=compiler] [--build-from-source]
# [--devel|--HEAD] [--keep-tmp] formula
# brew install --interactive [--git] formula
_brew_install() {
local state
_arguments \
- normal-install \
'--debug[if brewing fails, open an interactive debugging session]' \
-'-env=-[use standard or super environment]:environment:(std super)' \
'--ignore-dependencies[skip installing any dependencies of any kind]' \
'--only-dependencies[install the dependencies but do not install the specified formula]' \
'--cc=-[attempt to compile using compiler]:compiler: ' \
'(--build-from-source -s)'{--build-from-source,-s}'[compile the specified formula from source even if a bottle is provided]' \
'(--devel --HEAD)'{--devel,--HEAD}'[install the development / HEAD version]' \
'--keep-tmp[don''t delet temporary files created during installation]' \
'*: : __brew_formulae' \
- interactive-install \
'--interactive[download and patch formula, then open a shell]' \
'--git' \
': : __brew_formulae'
}
# brew irb [--examples]
_brew_irb() {
_arguments '(--examples)--examples'
}
# brew leaves
_brew_leaves() {
return 1
}
# brew ln, link [--overwrite] [--dry-run] [--force] formula
_brew_link() {
_arguments \
'(--overwrite)--overwrite[delete files which already exist in the prefix]' \
'(--dry-run -n)'{--dry-run,-n}'[list files that would be linked or deleted]' \
'(--force)--force[allow keg-only formulae to be linked]' \
':formula:__brew_installed_formulae'
}
# brew linkage [--test] [--reverse] formula-name
_brew_linkage() {
_arguments \
'(--test)--test[only display missing libraries]' \
'(--reverse)--reverse[print the dylib followed by the binaries which link to it]' \
':formula:__brew_installed_formulae'
}
# brew linkapps [--local] [formulae]:
_brew_linkapps() {
_arguments \
'(--local)--local[symlink into ~/Application instead of the system directory]' \
'::formula:__brew_installed_formulae'
}
# brew list, ls [--full-name]:
# brew list, ls --unbrewed:
# brew list, ls [--versions [--multiple]] [--pinned] [formulae]:
_brew_list() {
local state
_arguments \
'(--full-name)--full-name[print formulae with fully-qualified names]' \
'(--unbrewed)--unbrewed[files in brew --prefix not controlled by brew]' \
'(--pinned)--pinned[list all versions of pinned formulae]' \
'(--versions)--versions[list all installed versions of a formula]' \
'(--multiple)--multiple[only show formulae with multiple versions installed]' \
'*:: :__brew_installed_formulae'
}
# brew log [git-log-options] formula ...:
_brew_log() {
__brew_formulae
}
# brew man
_brew_man() {
return 1
}
# brew migrate [--force] formulae:
_brew_migrate() {
_arguments \
'(--force)--force[treat installed formulae and passed formulae ike if they are from same taps and migrate them anyway]' \
'*: :__brew_formulae'
}
# brew mirror [--test] formula-name [formula-name ...]:
# TODO missing argument docs
_brew_mirror() {
_arguments \
'(--test)--test' \
'*: :__brew_formulae'
}
# brew missing [formulae]:
_brew_missing() {
__brew_formulae
}
# brew options [--compact] (--all|--installed|formulae):
_brew_options() {
_arguments \
'(--compact)--compact' \
'(--all --installed :)'{--all,--installed}'[show options for all / installed formula]' \
'(--all --installed): :__brew_formulae'
}
# brew outdated [--quiet|--verbose|--json=v1] [--fetch-HEAD]:
_brew_outdated() {
_arguments \
'(--quiet --verbose --json)--quiet[list only the names of outdated brews]' \
'(--quiet --verbose --json)--verbose[display detailed version information]' \
'(--quiet --verbose --json)--json=-[output in JSON format]:version:(v1)' \
'(--fetch-HEAD)--fetch-HEAD[detect if the HEAD installation of the formula is outdated]'
}
# brew pin formulae:
_brew_pin() {
__brew_formulae
}
# brew postinstall formula:
_brew_postinstall() {
_arguments \
'*:: :__brew_formulae'
}
# brew prune [--dry-run]:
_brew_prune() {
_arguments \
'(--dry-run -n)'{--dry-run,-n}'[show what would be removed, but do not actually remove anything]'
}
# pull [--bottle] [--bump] [--clean] [--ignore-whitespace] [--resolve]
# [--branch-okay] [--no-pbcopy] [--no-publish] patch-source [patch-source]
_brew_pull() {
_arguments \
'(--bottle)--bottle[handle bottles]' \
'(--bump)--bump[automatically reword commit message]' \
'(--clean)--clean[do not rewrite commits found in the pulled PR]' \
'(--ignore-whitespace)--ignore-whitespace[ignore whitespace discrepancies when applying diffs]' \
'(--resolve)--resolve[allow user to resolve patches that fail to apply]' \
'(--branch-okay)--branch-okay[do not warn on pulling branches other than master]' \
'(--no-pbcopy)--no-pbcopy[do not copy anything to the system]' \
'(--no-publish)--no-publish[do no publish bottles to Bintray]' \
'*:patch source: '
}
# brew readall [tap]:
_brew_readall() {
__brew_installed_taps
}
# brew reinstall formula:
_brew_reinstall() {
_arguments \
'::formula:__brew_installed_formulae'
}
# brew search, -S:
# brew search [--desc] text|/text/:
# brew search (--debian|--fedora|--fink|--macports|--opensuse|--ubuntu) text:
_brew_search() {
_arguments \
'(--desc)--desc[include description for each package]:text: ' \
'(--desc --debian --fedora --fink --macports --opensuse --ubuntu)'{--debian,--fedora,--fink,--macports,--opensuse,--ubuntu}'[searcg for text in given package manager''s list]'
}
# brew sh [--env=std]:
# TODO missing argument docs
_brew_sh() {
_arguments \
'(--env)--env=-:environment:(std)'
}
# brew style [--fix] [--display-cop-names] [formulae|files]:
_brew_style() {
_arguments \
'(--fix)--fix[fix style violations automatically]' \
'(--display-cop-names)--display-cop-names[include RuboCop name for each violation in output]' \
'::formula:__brew_formulae'
# TODO add files to completion
}
# brew switch name version:
_brew_switch() {
_message "name version"
return 1
}
# brew tap:
# brew tap [--full] user/repo [URL]:
# brew tap --repair:
# brew tap --list-official:
# brew tap --list-pinned:
_brew_tap() {
_arguments \
- empty-args \
- repo-args \
'(--full)--full[perform a full clone]' \
':repo:__brew_official_taps' \
'::url:_urls' \
- repair-args \
'(--repair)--repair' \
- list-official \
'(--list-official)--list-official[list all official taps]' \
- list-pinned \
'(--list-pinned)--list-pinned[list all pinned taps]'
}
# brew tap-info:
# brew tap-info (--installed|taps):
# brew tap-info --json=version (--installed|taps):
_brew_tap_info() {
_arguments \
'(--installed *)--installed[display information on all installed taps]' \
'(--json)--json=-[print a JSON representation of taps]:version:(v1)' \
'(--installed)*:taps:__brew_installed_taps'
}
# brew tap-pin tap:
_brew_tap_pin() {
__brew_installed_taps
}
# brew tap_readme [-v] name:
# TODO missing argument docs (verbose perhaps)
_brew_tap_readme() {
_arguments \
'(-v)-v' \
':name: '
}
# brew tap-unpin tap:
_brew_tap_unpin() {
__brew_pinned_taps
}
# brew test [--devel|--HEAD] [--debug] [--keep-tmp] formula:
_brew_test() {
_arguments \
'(--devel --HEAD)'{--devel,--HEAD}'[use the development / head version of the formula]' \
'(--debug)--debug[launch an interactive debugger if test fails]' \
'(--keep-tmp)--keep-tmp[don''t delete temporary files]' \
':formula:__brew_formulae'
}
# brew test-bot [options] url|formula:
_brew_test_bot() {
_arguments \
'--dry-run' \
'--local' \
'--keep-logs' \
'--cleanup' \
'--clean-cache' \
'--skip-setup' \
'--skip-homebrew' \
'--junit' \
'--no-bottle' \
'--keep-old' \
'--skip-relocation' \
'--HEAD' \
'--tap' \
'--fail-fast' \
'--verbose' \
'--fast' \
'--keep-tmp' \
'--no-pull' \
'--coverage' \
'--ci-master' \
'--ci-pr' \
'--ci-testing' \
'--ci-upload'
}
# brew tests [-v] [--coverage] [--generic] [--no-compat]
# [--only=test_script/test_method] [--seed seed] [--trace] [--online]
# [--official-cmd-taps]:
_brew_tests() {
_arguments \
'(-v)-v' \
'(--coverage)--coverage' \
'(--generic)--generic' \
'(--no-compat)--no-compat' \
'(--only)--only=-:test_method: ' \
'(--seed)--seed:seed: ' \
'(--trace)--trace' \
'(--online)--online' \
'(--official-cmd-taps)--official-cmd-taps'
}
# brew uninstall, rm, remove [--force] formula:
_brew_uninstall() {
_arguments \
'(--force)--force[delete all installed versions of formula]' \
':formula:__brew_installed_formulae'
}
# brew unlink [--dry-run] formula:
_brew_unlink() {
_arguments \
'(--dry-run =n)'{--dry-run,=n}'[don''t unlink or delete any files]' \
':formula:__brew_installed_formulae'
}
# brew unlinkapps [--local] [--dry-run] [formulae]:
_brew_unlinkapps() {
_arguments \
'(--local)--local[remove symlinks from ~/Applications instead of the system directory]' \
'(--dry-run =n)'{--dry-run,-n}'[don''t unlink or delete any files]' \
':formula:__brew_installed_formulae'
}
# brew unpack [--git|--patch] [--destdir=path] formulae:
_brew_unpack() {
_arguments \
'(--git --patch)--git[initialize a Git repository in the unpacked source]' \
'(--git --patch)--patch[apply patches for formula]' \
'(--destdir)--destdir=-[create subdirectories under path]:path:_directories' \
':formula:__brew_formulae'
}
# brew unpin formulae:
_brew_unpin() {
_arguments \
':formula:__brew_formulae'
}
# brew update [--merge] [--force]:
_brew_update() {
_arguments \
'(--merge)--merge[use git merge instead of git rebase]' \
'(--force)--force[do a slower full update check]'
}
# brew update_report:
_brew_update_report() {
return 1
}
# brew update-test [--commit=sha1] [--before=date] [--keep-tmp]:
_brew_update_test() {
_arguments \
'(--commit=sha1)--commit=-[use sha1 as the start commit]:sha1: ' \
'(--before=date)--before=-[use the commit at date as the start commit]:date:_dates' \
'(--keep-tmp)--keep-tmp[retain the temporary directory]'
}
# brew upgrade [install-options] [--cleanup] [--fetch-HEAD] [formulae]
# install-options is copied from brew install
_brew_upgrade() {
_arguments \
'(--cleanup)--cleanup[remove previously installed formula version(s)]' \
'(--fetch-HEAD)--fetch-HEAD[detect if the HEAD installation of the formula is outdated]' \
- normal-install \
'--debug[if brewing fails, open an interactive debugging session]' \
-'-env=-[use standard or super environment]:environment:(std super)' \
'--ignore-dependencies[skip installing any dependencies of any kind]' \
'--only-dependencies[install the dependencies but do not install the specified formula]' \
'--cc=-[attempt to compile using compiler]:compiler: ' \
'(--build-from-source -s)'{--build-from-source,-s}'[compile the specified formula from source even if a bottle is provided]' \
'(--devel --HEAD)'{--devel,--HEAD}'[install the development / HEAD version]' \
'--keep-tmp[don''t delet temporary files created during installation]' \
'*: : __brew_outdated_formulae' \
- interactive-install \
'--interactive[download and patch formula, then open a shell]' \
'--git' \
': : __brew_outdated_formulae'
}
# brew uses [--installed] [--recursive] [--include-build] [--include-optional]
# [--skip-recommended] [--devel|--HEAD] formulae:
_brew_uses() {
_arguments \
'(--installed)--installed[only list installed formulae]' \
'(--recursive)--recursive[resolve more than one level of dependencies]' \
'(--include-build)--include-build[include the :build type dependencies]' \
'(--include-optional)--include-optional[include the :optional dependencies]' \
'(--skip-recommended)--skip-recommended[skip :recommended type dependencies]' \
'(--devel --HEAD)'{--devel,--HEAD}'[find cases where formula is used by development / HEAD build]' \
'*:formula:__brew_formulae'
}
# brew vendor-install [target]:
# TODO args missing docs
_brew_vendor_install() {
_arguments \
'--target'
}
# the main completion function
_brew() {
local curcontext="$curcontext" state state_descr line expl
local ret=1
_arguments -C : \
'(-v)-v[verbose]' \
'1:command:->command' \
'*::options:->options' && return 0
case "$state" in
command) __brew_commands && return 0 ;;
options)
local command_or_alias command
local -A aliases
# expand alias e.g. ls -> list
command_or_alias="${line[1]}"
aliases=($(__brew_list_aliases))
command="${aliases[$command_or_alias]:-$command_or_alias}"
# change context to e.g. brew-list
curcontext="${curcontext%:*:*}:brew-${command}"
# call completion for named command e.g. _brew_list
local completion_func="_brew_${command//-/_}"
_call_function ret "${completion_func}" && return ret
_message "a completion function is not defined for command or alias: ${command_or_alias}"
return 1
;;
esac
}
_brew "$@"