快適なAndroid(Studio)ライフを送りたい
内容
ZshでもGradleコマンドを補完出来るようにした
参考
動機
Android開発を爆速にする10のコマンドラインスクリプト - クックパッド開発者ブログ
この記事でGradleにも補完があるのを知ったが、
紹介されていたGradle tab completion for Bash. Works on both Mac and Linux.
を見るとBash用の補完関数だった...。
普段Zshを使っているので、Gradleを使う時だけBashを使うなんて嫌だしZsh用に移植したい
コード
ほとんどは上のBash版と同じ
# refs: https://gist.github.com/nolanlawson/8694399 : bash-version
_gradle() {
local cur="$1"
local gradle_cmd='gradle'
if [[ -x ./gradlew ]]; then
gradle_cmd='./gradlew'
fi
if [[ -x ../gradlew ]]; then
gradle_cmd='../gradlew'
fi
local completions=''
local cache_dir="$HOME/.gradle_tabcompletion"
mkdir -p $cache_dir
local gradle_files_checksum='hoge';
if [[ -f build.gradle ]]; then # top-level gradle file
if [[ -x `which md5 2> /dev/null` ]]; then # mac
local all_gradle_files="$(find . -name build.gradle 2>/dev/null)"
gradle_files_checksum="$(md5 -q -s "${all_gradle_files}")"
else # linux
gradle_files_checksum="$(find . -name build.gradle | xargs md5sum | md5sum)"
fi
else # no top-level gradle file
gradle_files_checksum='no_gradle_files'
fi
if [[ -f $cache_dir/$gradle_files_checksum ]]; then # cached! yay!
completions=$(\cat $cache_dir/$gradle_files_checksum)
else # not cached! boo-urns!
completions=$($gradle_cmd --no-color --quiet tasks | grep --color=none ' - ' | awk '{print $1}' | tr '\n' ' ')
if [[ ! -z $completions ]]; then
echo $completions > $cache_dir/$gradle_files_checksum
fi
fi
local -a commands
commands=( "${(z)completions}" )
compadd $commands
return 1;
}
compdef _gradle gradle
compdef _gradle gradlew
compdef _gradle ./gradlew
gistにも置いた
配列にしてcompadd
すればいいっぽいことを学んだ
#compdef gradle
とファイルの頭に書いてもいいが、gradle
とgradlew
と./gradlew
に対応させられるかどうか検証するもの面倒だったのでこうした
Bashの場合
上のリンクにあるBash用のやつ、コメントにもあるように
- if [[ -x `which md5 2 > /dev/null` ]]; then # mac
+ if [[ -x `which md5 2> /dev/null` ]]; then # mac
と修正しないとBashでも動かないはず
使い方
このファイルは
source /path/to/_gradle
このように~/.zshrc
にでも書いておけば読み込んでくれる
簡単にするならこれで試せるはず
curl -o </path/to/_gradle> https://gist.githubusercontent.com/petitviolet/910c0b54b067405d0aa3/raw/6cc95427f82f0673b6248de7e58ee6eb901099ff/_gradle
echo 'source </path/to/_gradle>` >> ~/.zshrc
なお、初回のみタスクの読み込みに時間がかかるが、2回目以降はファイルキャッシュを読み込むため比較的速くなる