summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobby Russell <robby@planetargon.com>2015-02-22 10:11:35 -0800
committerRobby Russell <robby@planetargon.com>2015-02-22 10:11:35 -0800
commit7649c2992631295417cbd73bb27ab07b8a91329f (patch)
treefbd2ae1b31636ab1efa3d8993023e2bef732cc53
parent9d0a9b80786726036fb88653ee97b8a317ba6712 (diff)
parent55c90b1d6cbda581f9ccd41ea1c8da15da98d5ee (diff)
downloadzsh-7649c2992631295417cbd73bb27ab07b8a91329f.tar.gz
zsh-7649c2992631295417cbd73bb27ab07b8a91329f.tar.bz2
zsh-7649c2992631295417cbd73bb27ab07b8a91329f.zip
Merge pull request #2009 from akatov/grunt
grunt completion
-rw-r--r--plugins/grunt/grunt.plugin.zsh253
1 files changed, 253 insertions, 0 deletions
diff --git a/plugins/grunt/grunt.plugin.zsh b/plugins/grunt/grunt.plugin.zsh
new file mode 100644
index 000000000..48f6cb5a2
--- /dev/null
+++ b/plugins/grunt/grunt.plugin.zsh
@@ -0,0 +1,253 @@
+#compdef grunt
+# -----------------------------------------------------------------------------
+# _grunt
+#
+# Completion script for grunt.
+# - https://github.com/gruntjs/grunt
+# - https://github.com/gruntjs/grunt-cli
+#
+# -----------------------------------------------------------------------------
+#
+# Version : 0.1.0
+# Author : Yonchu <yuyuchu3333@gmail.com>
+# License : MIT License
+# Repository : https://github.com/yonchu/grunt-zsh-completion
+# Last Change : 22 Jul 2013.
+#
+# Copyright (c) 2013 Yonchu.
+#
+# -----------------------------------------------------------------------------
+# USAGE
+# -----
+#
+# Enable caching:
+#
+# If you want to use the cache, set the followings in your .zshrc:
+#
+# zstyle ':completion:*' use-cache yes
+#
+#
+# Settings:
+#
+# - Show grunt file path:
+# zstyle ':completion::complete:grunt::options:' show_grunt_path yes
+#
+# - Cache expiration days (default: 7):
+# zstyle ':completion::complete:grunt::options:' expire 1
+#
+# - Not update options cache if target gruntfile is changed.
+# zstyle ':completion::complete:grunt::options:' no_update_options yes
+#
+# Note that if you change the zstyle settings,
+# you should delete the cache file and restart zsh.
+#
+# $ rm ~/.zcompcache/grunt
+# $ exec zsh
+#
+# -----------------------------------------------------------------------------
+
+function _grunt() {
+ local curcontext="$curcontext" update_policy state
+ local show_grunt_path update_msg gruntfile opts tasks
+
+ # Setup cache-policy.
+ zstyle -s ":completion:${curcontext}:" cache-policy update_policy
+ if [[ -z $update_policy ]]; then
+ zstyle ":completion:${curcontext}:" cache-policy __grunt_caching_policy
+ fi
+
+ # Check show_path option.
+ zstyle -b ":completion:${curcontext}:options:" show_grunt_path show_grunt_path
+
+ # Get current gruntfile.
+ gruntfile=$(__grunt_get_gruntfile)
+
+ # Initialize opts and tasks.
+ opts=()
+ tasks=()
+
+ # Add help options.
+ opts+=('(- 1 *)'{-h,--help}'[Display this help text.]')
+
+ ## Complete without gruntfile.
+ if [[ ! -f $gruntfile ]]; then
+ _arguments "${opts[@]}"
+ return
+ fi
+
+ ## Complete with gruntfile.
+ # Retrieve cache.
+ if ! __grunt_update_cache "$gruntfile"; then
+ update_msg=' (cache updated)'
+ fi
+
+ # Make optioins completion.
+ if [[ ${#__grunt_opts} -gt 0 ]]; then
+ opts+=("${__grunt_opts[@]}")
+ fi
+
+ # Complete arguments.
+ _arguments \
+ "${opts[@]}" \
+ '*: :->tasks' \
+ && return
+
+ case $state in
+ tasks)
+ if [[ $show_grunt_path == 'yes' ]]; then
+ update_msg="$update_msg: ${${gruntfile/#$HOME/~}%/}"
+ fi
+ # Make tasks completion.
+ if [[ ${#__grunt_tasks} -gt 0 ]]; then
+ tasks+=("${__grunt_tasks[@]}")
+ _describe -t grunt-task "$verbose grunt task$update_msg" tasks || return 1
+ fi
+ ;;
+ esac
+
+ return 0
+}
+
+# Cache policy:
+# The cache file name: grunt
+# The cache variable name: __grunt_version __grunt_gruntfile __grunt_opts __grunt_tasks
+function __grunt_update_cache() {
+ # TODO
+ local version='0.1.0'
+ local is_updating=0
+ local gruntfile="$1"
+ local grunt_info no_update_options cache_path
+
+ # Check no_update_options option.
+ zstyle -b ":completion:${curcontext}:options:" no_update_options no_update_options
+
+
+ if ! ( (( $+__grunt_gruntfile )) \
+ && (( $+__grunt_opts )) \
+ && (( $+__grunt_tasks )) ) \
+ && ! _retrieve_cache 'grunt'; then
+ is_updating=1
+ fi
+
+ if [[ $gruntfile != $__grunt_gruntfile ]]; then
+ # Except for --help options.
+ __grunt_gruntfile=$gruntfile
+ if [[ $no_update_options == 'yes' ]]; then
+ if [[ $PREFIX == ${PREFIX#-} ]]; then
+ # Not options completions.
+ is_updating=1
+ elif [[ ${#__grunt_opts} -lt 2 ]]; then
+ is_updating=1
+ else
+ unset __grunt_gruntfile
+ fi
+ else
+ is_updating=1
+ fi
+ else
+ if [[ $PREFIX != ${PREFIX#-} && ${#__grunt_opts} -gt 1 ]]; then
+ unset __grunt_gruntfile
+ fi
+ fi
+
+ if _cache_invalid 'grunt'; then
+ is_updating=1
+ fi
+
+ # Check _grunt version.
+ if [[ $__grunt_version != $version ]]; then
+ is_updating=1
+ fi
+
+ if [[ $is_updating -ne 0 ]]; then
+ # Update caceh.
+ __grunt_version=$version
+ __grunt_gruntfile=$gruntfile
+ is_updating=1
+ grunt_info=$(grunt --help --no-color --gruntfile "$__grunt_gruntfile" 2>/dev/null)
+ __grunt_opts=(${(f)"$(__grunt_get_opts "$grunt_info")"})
+ __grunt_tasks=(${(f)"$(__grunt_get_tasks "$grunt_info")"})
+ _store_cache 'grunt' __grunt_version __grunt_gruntfile __grunt_opts __grunt_tasks
+ fi
+ return $is_updating
+}
+
+function __grunt_get_tasks() {
+ echo -E "$1" \
+ | grep 'Available tasks' -A 100 \
+ | grep '^ ' \
+ | sed -e 's/^[[:blank:]]*//' -e 's/[[:blank:]]*$//' \
+ | sed -e 's/ /:/'
+}
+
+function __grunt_get_opts() {
+ local opt_hunk opt_sep opt_num line opt
+ opt_hunk=$(echo -E "$1" \
+ | grep 'Options$' -A 100 \
+ | sed '1 d' \
+ | sed -e 's/[[:blank:]]*$//' \
+ )
+
+ opt_sep=()
+ opt_hunk=(${(f)opt_hunk})
+ opt_num=0
+ for line in "$opt_hunk[@]"; do
+ opt=$(echo -E "$line" | sed -e 's/^[[:blank:]]*//')
+ if [[ $line == $opt ]]; then
+ break
+ fi
+ if [[ $opt != ${opt#-} ]]; then
+ # Start with -
+ (( opt_num++ ))
+ opt=$(echo -E "$opt" | sed 's/^\(\(--[^ ]*\)\(, \(-[^ ]*\)\)*\) */\2\\t\4\\\t/')
+ fi
+ opt_sep[$opt_num]=("${opt_sep[$opt_num]}${opt}")
+ done
+
+ for line in "$opt_sep[@]"; do
+ opt=(${(s:\t:)line})
+ if [[ ${opt[1]} == '--help' ]]; then
+ continue
+ fi
+ if [[ ${#opt} -eq 2 ]]; then
+ echo -E "(${opt[1]})${opt[1]}[${opt[2]}]"
+ else
+ echo -E "(${opt[1]},${opt[2]})${opt[1]}[${opt[3]}]"
+ echo -E "(${opt[1]},${opt[2]})${opt[2]}[${opt[3]}]"
+ fi
+ done
+}
+
+function __grunt_get_gruntfile() {
+ local gruntfile
+ local curpath="$PWD"
+ while [ "$curpath" ]; do
+ for gruntfile in "$curpath/"{G,g}runtfile.{js,coffee}; do
+ if [[ -e "$gruntfile" ]]; then
+ echo "$gruntfile"
+ return
+ fi
+ done
+ curpath=${curpath%/*}
+ done
+ return 1
+}
+
+function __grunt_caching_policy() {
+ # Returns status zero if the completions cache needs rebuilding.
+
+ # Rebuild if .agignore more recent than cache.
+ if [[ -f $__grunt_gruntfile && $__grunt_gruntfile -nt $1 ]]; then
+ # Invalid cache because gruntfile is old.
+ return 0
+ fi
+
+ local -a oldp
+ local expire
+ zstyle -s ":completion:${curcontext}:options:" expire expire || expire=7
+ # Rebuild if cache is more than $expire days.
+ oldp=( "$1"(Nm+$expire) )
+ (( $#oldp ))
+}
+
+compdef _grunt grunt