これは何か
- Capistrano や Ruby on Rails 関連のコマンドに対して補完を行なうための zsh のスクリプトです。
- すでに公開されているものとして「Capistrano用ZSH補完関数」「zsh用script/generate補完関数」がありますが、以下のスクリプトでは「別ファイルに分けるタイプ」「オプションも補完できる」という特徴があります。
スクリプト (_cap)
「cap」コマンドに対して補完を行います。
#compdef cap
typeset -A opt_args
local context state line
local opts tasks
opts=()
_call_program opts cap --help 2>/dev/null |
sed -e '1d;s/^ \+/{/;s/, /,/;s/ .* /}"[/;s/\(".*\)$/\1]"/;/{[^}]*$/s/{//;/{[^,]*}/s/{\|}//g;' |
while read l; do
echo $(eval echo -e $l) | sed -e 's/ --/\n--/'
done |
while read l; do
if expr $l : '^-f\|^--f' > /dev/null; then
l=$( echo $l | sed -e 's/\[/+[/;s/$/:file:_files -/;' )
fi
opts+=($l)
done
tasks=$(
_call_program tasks $words -T 2>/dev/null |
grep '^cap ' | sed -e 's/^cap //;s/ .*//'
)
local arguments_args
arguments_args=($opts)
arguments_args+=(":tasks:($tasks)")
_arguments $arguments_args && return 0
return 0
スクリプト (_generate)
「script/generate」と「script/destroy」コマンドに対して補完を行います。
#compdef generate destroy
typeset -A opt_args
local context state line
local -a opts
local actions
opts=()
actions=""
_call_program opts $words[1] --help 2>/dev/null |
sed -e '1d;s/^ \+/{/;s/, /,/;s/ .* /}"[/;s/\(".*\)$/\1]"/;/{[^}]*$/s/{//;/{[^,]*}/s/{\|}//g;/Installed Generators/,/^$/s/^/___/;/Installed Generators/d;/^___$/d;/^$/d' |
while read l; do
if expr $l : '^\{' > /dev/null; then
echo $(eval echo -e $l) | sed -e 's/ --/\n--/'
else
echo $l
fi
done |
while read l; do
if expr $l : '^___' > /dev/null; then
actions=$actions$(echo -e $l | sed -e 's/.*://;s/,//g;s/\n//;')
elif expr $l : '^-' > /dev/null; then
if expr $l : '^-f\|^--f' > /dev/null; then
l=$( echo $l | sed -e 's/\[/+[/;s/$/:file:_files -/;' )
fi
opts+=($l)
fi
done
local arguments_args
arguments_args=($opts)
arguments_args+=(":actions:($actions)")
arguments_args+=("*:file:_files -/")
_arguments $arguments_args && return 0
return 0
設定例
スクリプトを $HOME/.zsh/func/_cap や $HOME/.zsh/func/_generate に保存をして、.zshrc を以下のように設定します
fpath=($fpath $HOME/.zsh/func)
autoload -Uz compinit
compinit
コメントする