aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYurii Rashkovskii <[email protected]>2013-12-12 03:29:41 -0800
committerYurii Rashkovskii <[email protected]>2013-12-12 03:29:41 -0800
commit2f2c05d3907a351c9ae180c8477f1ed9e89f1d83 (patch)
tree347e25539e49807e9f002aad3350e874b87bca9b
parent89bf1025ceff7720557e807e13a7fb90d641f48d (diff)
parentc548650ddfc8a12e3f1d34ed3cf498d7963ed945 (diff)
downloadkerl-2f2c05d3907a351c9ae180c8477f1ed9e89f1d83.tar.gz
kerl-2f2c05d3907a351c9ae180c8477f1ed9e89f1d83.tar.bz2
kerl-2f2c05d3907a351c9ae180c8477f1ed9e89f1d83.zip
Merge pull request #57 from sanmiguel/master
Add zsh completion
-rw-r--r--README.md3
-rw-r--r--zsh_completion/_kerl141
2 files changed, 144 insertions, 0 deletions
diff --git a/README.md b/README.md
index f6264eb..058b448 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,9 @@ and drop it in your $PATH
Optionally download and install kerl's bash_completion file from https://github.com/spawngrid/kerl/raw/master/bash_completion/kerl
+Optionally download and install kerl's zsh-completion file from https://github.com/spawngrid/kerl/raw/master/zsh_completion/_kerl
+
+
How it works
============
diff --git a/zsh_completion/_kerl b/zsh_completion/_kerl
new file mode 100644
index 0000000..e58eb8b
--- /dev/null
+++ b/zsh_completion/_kerl
@@ -0,0 +1,141 @@
+#compdef kerl
+
+# ------------------------------------------------------------------------------
+# Description
+# -----------
+#
+# Completion script for kerl (http://github.com/spawngrid/kerl
+#
+# Source: https://github.com/sanmiguel/zsh-completions
+#
+# ------------------------------------------------------------------------------
+# Authors
+# -------
+#
+# * Michael Coles (https://github.com/sanmiguel)
+#
+# ------------------------------------------------------------------------------
+
+# TODO: These are naive and stupid
+_kerl_available_releases() {
+ # we use the file directly as `kerl list releases` dumps extraneous data to stdout
+ releases=(${(f)"$(_call_program releases cat ~/.kerl/otp_releases)"})
+}
+
+_kerl_builds() {
+ builds=(${(f)"$(_call_program builds kerl list builds 2>/dev/null | cut -f 2 -d ",")"})
+}
+
+_kerl_installations() {
+ installations=(${(f)"$(_call_program installations kerl list installations 2>/dev/null | cut -f 2 -d " ")"})
+}
+
+local -a _1st_arguments
+_1st_arguments=(
+ 'build:Build specified release or git repository'
+ 'install:Install the specified release at the given location'
+ 'deploy:Deploy the specified installation to the given host and location'
+ 'update:Update the list of available releases from erlang.org'
+ 'list:List releases, builds and installations'
+ 'delete:Delete builds and installations'
+ 'active:Print the path of the active installation'
+ 'status:Print available builds and installations'
+ 'prompt:Print a string suitable for insertion in prompt'
+ 'cleanup:Remove compilation artifacts (use after installation)'
+)
+
+local -a _list_options
+_list_options=(
+ 'releases:All available OTP releases'
+ 'builds:All locally built OTP releases'
+ 'installations:All locally installed OTP builds'
+)
+local -a _update_options
+_update_options=(
+ 'releases:All available OTP releases'
+)
+
+local expl
+local -a releases builds installations
+
+_arguments \
+ '*:: :->subcmds' && return 0
+
+if (( CURRENT == 1 )); then
+ _describe -t commands "kerl subcommand" _1st_arguments
+ return
+fi
+
+case "$words[1]" in
+ active) ;;
+ status) ;;
+ prompt) ;;
+ build)
+ _arguments \
+ '1: :->rels' \
+ '2: :->buildnames' && return 0
+
+ if [[ "$state" == rels ]]; then
+ _kerl_available_releases
+ _wanted releases expl 'all releases' compadd -a releases
+ elif [[ "$state" == buildnames ]]; then
+
+ fi;;
+ # TODO: suggest build name as $(lowercase $release)
+ install)
+ _arguments \
+ '1: :->blds' \
+ '2::location:_path_files -W "(~/kerl)"' && return 0
+ ## TODO: This path should not be hard-coded!
+
+ if [[ "$state" == blds ]]; then
+ _kerl_builds
+ _wanted builds expl 'all builds' compadd -a builds
+ return
+ fi
+ # TODO: suggest starting location of "$KERLDIR/$(lowercase $build)"
+ _directories
+ ;;
+ deploy)
+ _arguments \
+ '1: :->hosts' \
+ '2: :->installs' && return 0
+
+ if [[ "$state" == hosts ]]; then
+ _hosts
+ return
+ elif [[ "$state" == installs ]]; then
+ _kerl_installations
+ _wanted installations expl 'all installations' compadd -a installations
+ return
+ fi
+ ;; # TODO: [remote directory] (or at least prompt)
+ update)
+ _arguments '1: :->updopts' && return 0
+ if [[ "$state" == updopts ]]; then _describe "kerl update options" _update_options; fi
+ ;;
+ list)
+ _arguments '1: :->listopts' && return 0
+ if [[ "$state" == listopts ]]; then _describe "kerl list options" _list_options; fi
+ ;;
+ delete)
+ _arguments \
+ '1:<build|installation>:(build installation)' && return 0
+
+ case "$words[2]" in
+ build)
+ _kerl_builds
+ _wanted builds expl 'all builds' compadd -a builds
+ return
+ ;;
+ installation)
+ _kerl_installations
+ _wanted installations expl 'all installations' compadd -a installations
+ return
+ esac
+ ;;
+ cleanup)
+ _kerl_builds
+ builds=('all' $builds)
+ _wanted builds expl 'all builds' compadd -a builds;;
+esac