blog.petitviolet.net

GradleをZshで補完する

2014-12-18

QiitaAndroidZshgradle

快適な Android(Studio)ライフを送りたい

内容

Zsh でも Gradle コマンドを補完出来るようにした

gradle_zsh_complete.gif

参考

zsh 補完関数を自作すると便利 - はこべブログ ♨

動機

Android 開発を爆速にする 10 のコマンドラインスクリプト - クックパッド開発者ブログ この記事で Gradle にも補完があるのを知ったが、 紹介されていたGradle tab completion for Bash. Works on both Mac and Linux. を見ると Bash 用の補完関数だった…。

普段 Zsh を使っているので、Gradle を使う時だけ Bash を使うなんて嫌だし Zsh 用に移植したい

コード

ほとんどは上の Bash 版と同じ

/path/to/_gradle
# 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とファイルの頭に書いてもいいが、gradlegradlew./gradlewに対応させられるかどうか検証するもの面倒だったのでこうした

Bash の場合

上のリンクにある Bash 用のやつ、コメントにもあるように

-    if [[ -x `which md5 2 > /dev/null` ]]; then # mac
+    if [[ -x `which md5 2> /dev/null` ]]; then # mac

と修正しないと Bash でも動かないはず

使い方

このファイルは

`sh:title=~/.zshrc source /path/to/_gradle

このように`~/.zshrc`にでも書いておけば読み込んでくれる

簡単にするならこれで試せるはず

```sh
curl -o </path/to/_gradle> https://gist.githubusercontent.com/petitviolet/910c0b54b067405d0aa3/raw/6cc95427f82f0673b6248de7e58ee6eb901099ff/_gradle
echo 'source </path/to/_gradle>` >> ~/.zshrc

なお、初回のみタスクの読み込みに時間がかかるが、2 回目以降はファイルキャッシュを読み込むため比較的速くなる

from: https://qiita.com/petitviolet/items/11ae1c7791e6343a6c1e