commit
7649c29926
|
@ -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
|
Loading…
Reference in New Issue