aboutsummaryrefslogtreecommitdiffstats
path: root/src/_port
diff options
context:
space:
mode:
authorAljaž "g5pw" Srebrnič <a2piratesoft@gmail.com>2013-03-20 08:22:38 +0100
committerAljaž "g5pw" Srebrnič <a2piratesoft@gmail.com>2013-03-20 08:22:38 +0100
commit6483c0c3a13d9feb9bb2a1cb3db8b430c35e4669 (patch)
tree879781dace06024bc0485c013fdeb63af2c5b174 /src/_port
parentMerge pull request #127 from glidenote/ag-completion (diff)
downloadzsh-completions-6483c0c3a13d9feb9bb2a1cb3db8b430c35e4669.tar
zsh-completions-6483c0c3a13d9feb9bb2a1cb3db8b430c35e4669.tar.gz
zsh-completions-6483c0c3a13d9feb9bb2a1cb3db8b430c35e4669.tar.bz2
zsh-completions-6483c0c3a13d9feb9bb2a1cb3db8b430c35e4669.tar.lz
zsh-completions-6483c0c3a13d9feb9bb2a1cb3db8b430c35e4669.tar.xz
zsh-completions-6483c0c3a13d9feb9bb2a1cb3db8b430c35e4669.tar.zst
zsh-completions-6483c0c3a13d9feb9bb2a1cb3db8b430c35e4669.zip
Overhauled port command completion
Port command completion got smarter. It can now complete paths for the provides subcommand, and complete pseudo-portnames. It will complete all ports or only installed ones (for example, when completing for the uninstall command). It will complete the select subcommand with appropriate values.
Diffstat (limited to 'src/_port')
-rw-r--r--src/_port190
1 files changed, 109 insertions, 81 deletions
diff --git a/src/_port b/src/_port
index 9053f53..db39c1f 100644
--- a/src/_port
+++ b/src/_port
@@ -11,92 +11,120 @@
#
# * Matt Cable <wozz@wookie.net>
# * Sorin Ionescu <sorin.ionescu@gmail.com>
+# * Aljaž Srebrnič <a2piratesoft@gmail.com>
#
# ------------------------------------------------------------------------------
-local subcmds
+_port_select() {
+ if (( CURRENT == 3 )); then
+ _describe 'Port select options' select_options
+ elif (( CURRENT == 4 )); then
+ local select_group
+ select_group=()
+ for f in $port_prefix/etc/select/*; do
+ select_group+=$(basename $f)
+ done
+ _describe "Port select groups" select_group
+ elif [[ $CURRENT -eq 5 && $words[3] == '--set' ]]; then
+ local select_variants
+ select_variants=("${(f)$(port select --list $words[4] | sed -e '1 d' -e 's/^[ \t]*//' -e 's/ (active)$//')}")
+ _describe "Port select group $words[4] variants" select_variants
+ fi
+}
-subcmds=(
- 'activate'
- 'archive'
- 'build'
- 'cat'
- 'clean'
- 'configure'
- 'contents'
- 'deactivate'
- 'dependents'
- 'deps'
- 'destroot'
- 'dir'
- 'distcheck'
- 'distclean'
- 'dmg'
- 'echo'
- 'edit'
- 'extract'
- 'fetch'
- 'file'
- 'help'
- 'info'
- 'install'
- 'installed'
- 'list'
- 'livecheck'
- 'location'
- 'mpkg'
- 'outdated'
- 'patch'
- 'pkg'
- 'provides'
- 'rpmpackage'
- 'search'
- 'selfupdate'
- 'sync'
- 'test'
- 'unarchive'
- 'uninstall'
- 'upgrade'
- 'variants'
- 'version'
-)
+_port() {
+ # Variables for _argument
+ typeset -A opt_args
+ local context state state_descr line
-_arguments -C \
- '-v[verbose mode (generate verbose messages)]' \
- '-d[debug mode (generate debugging messages)]' \
- '-q[quiet mode (suppress messages)]' \
- '-D[specify portdir]' \
- '-k[keep mode (do not autoclean after install)]' \
- '-n[dont follow dependencies in upgrade (only for upgrading)]' \
- '-a[upgrade all installed ports (only for upgrading)]' \
- '-u[uninstall non-active ports when upgrading and uninstalling]' \
- '-f[force mode (ignore state file)]' \
- '-s[source-only mode]' \
- '-b[binary-only mode]' \
- '-o[honor state files older than Portfile]' \
- '*::command:->command' \
- && return 0
+ local actions pseudo_common pseudo_advanced select_options port_prefix
-case "$state" in
- (command)
- if (( CURRENT == 1 )); then
- state='subcommands'
- else
- state='portname'
- fi
- ;;
-esac
+ port_prefix=$(which port | sed 's|/bin/port||')
-case "$state" in
- (subcommands)
- _describe -t commands 'port commands' subcmds
- ;;
- (portname)
- # Cache the list of ports.
- if (( ! $+_port_list )); then
- _port_list=($(port echo all; echo "all current active inactive installed uninstalled outdated"))
- fi
+ actions=( activate archive archivefetch build cat cd
+ checksum clean configure contents deactivate dependents deps
+ destroot dir distcheck distfiles dmg dpkg echo edit exit
+ extract fetch file gohome help info install installed lint list
+ livecheck load location log logfile mdmg mirror mpkg notes
+ outdated patch pkg platform portpkg provides quit rdependents
+ rdeps rev-upgrade rpm search select selfupdate setrequested space
+ srpm submit sync test unarchive uninstall unload unsetrequested
+ upgrade url usage variants version work )
- _describe -t commands 'available ports' _port_list
- ;;
-esac
+ pseudo_common=(all current active inactive actinact installed uninstalled outdated
+ obsolete requested unrequested leaves)
+
+ pseudo_advanced=('variants:' 'variant:' 'description:' 'depends:'
+ 'depends_lib:' 'depends_run:' 'depends_build:' 'depends_fetch:' 'depends_extract:'
+ 'portdir:' 'homepage:' 'epoch:' 'platforms:' 'platform:' 'name:' 'long_description:'
+ 'maintainers:' 'maintainer:' 'categories:' 'category:' 'version:' 'revision:' 'license:')
+
+ select_options=(
+ '--list:List available versions for the group'
+ '--set:Select the given version for the group'
+ '--show:Show which version is currently selected for the group \(default if none given\)'
+ )
+
+ _arguments -s -C \
+ '-v[verbose mode (generate verbose messages)]' \
+ '-d[debug mode (generate debugging messages, implies -v)]' \
+ '-q[quiet mode (suppress messages)]' \
+ "-n[don't upgrade dependencies (affects upgrade and install)]" \
+ "-R[also upgrade dependents (only affects upgrade) - note that this does not upgrade dependents' dependencies]" \
+ '-u[uninstall non-active ports when upgrading and uninstalling]' \
+ '-f[force mode (ignore state file)]' \
+ '-o[honor state files even if the Portfile has been modified since (called -o because it used to mean "older")]' \
+ '-s[source-only mode (build and install from source, do not attempt to fetch binary archives)]' \
+ '-b[binary-only mode (build and install from binary archives, ignore source, abort if no archive available)]' \
+ '-c[autoclean mode (execute clean after install)]' \
+ "-k[keep mode (don't autoclean after install)]" \
+ '-D[specify portdir]' \
+ '-F[Read and process the file of commands specified by the argument.]' \
+ '-p[Despite any errors encountered, proceed to process multiple ports and commands.]' \
+ '-y[Perform a dry run.]' \
+ '-t[enable trace mode debug facilities on platforms that support it (Mac OS X).]' \
+ "1:Port actions:($actions)" \
+ '*:extra:->extra' \
+ && return 0
+
+ case "$state" in
+ extra)
+ case "$words[2]" in
+ provides)
+ _files
+ ;;
+ search)
+ _guard '^--*' 'pattern'
+ ;;
+ help)
+ _describe -t actions 'Port actions' actions
+ ;;
+ select)
+ _call_function - _port_select
+ ;;
+ contents|deactivate|setrequested|space|uninstall|unsetrequested)
+ # Cache the list of all ports.
+ if (( ! $+_installed_ports )); then
+ _installed_ports=$(_call_program path-installed "port installed | cut -d ' ' -f 3")
+ fi
+ _alternative \
+ "ports:Installed ports:($_installed_ports)" \
+ "pseudo-common:Common Pseudo-portnames:($pseudo_common)" \
+ "pseudo-advanced:Advanced Pseudo-portnames:($pseudo_advanced)"
+ ;;
+ *)
+ # Cache the list of all ports.
+ if (( ! $+_all_ports )); then
+ _all_ports=$(_call_program path-all "port echo all")
+ fi
+ _alternative \
+ "ports:Available ports:($_all_ports)" \
+ "pseudo-common:Common Pseudo-portnames:($pseudo_common)" \
+ "pseudo-advanced:Advanced Pseudo-portnames:($pseudo_advanced)"
+ ;;
+ esac
+ ;;
+ esac
+}
+
+_port "$@"