grunt completion courtesy of @yonchu: https://github.com/yonchu/grunt-zsh-completion
parent
5fcb6e1263
commit
55c90b1d6c
1 changed files with 253 additions and 0 deletions
@ -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